Wikipedia test2wiki https://test2.wikipedia.org/wiki/Main_Page MediaWiki 1.47.0-wmf.3 first-letter Media Special Talk User User talk Wikipedia Wikipedia talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Thread Thread talk Summary Summary talk Portal Portal talk Author Author talk Page Page talk Index Index talk Schema Schema talk TimedText TimedText talk Module Module talk Event Event talk Topic Wikipedia:Sandbox 4 2076 613796 613250 2026-05-26T00:21:08Z ~2026-31338-89 26411 Testing Safari + block math line wrap bug 613796 wikitext text/x-wiki Test from WikiClicknbrowsebrary. I wato twey [[Ham|Jamon]] == Info == Test from WiuLibrary. Section content: Fred The Cat == Somethings == === More info === Test from WikiGentlemenLibrary. Section content: ee7007dd-af61-4faf-8b75-6f698f1bb7ab Test from WikiClientLibrary. {{Template: Willy Willy Bear }} Test from IWentToTheLibrary. Test from WikiClientLibrary. == New section 2025-02-02T11:57:31.6704365Z == Test from WikiClientLibrary. Section content: a630cf97-990e-4070-bf36-da5dca78b9f8 '''Hello''' ''world''! Test from WikiClientLibrary. == New section 2025-04-11T17:10:41.8123697Z == Test from WikiClientLibrary. Section content: af15a434-33d7-425f-bd32-71ceab9a152d '''Hello''' ''world''! '''Hello''' ''world''! '''Hello''' ''world''! '''Hello''' ''world''! --[[Special:Contributions/&#126;2025-50729|&#126;2025-50729]] ([[User talk:&#126;2025-50729|talk]]) 11:37, 1 May 2025 (UTC) == Test == Hi! 'Hi!' ''Hi!'' '''Hi!''' {{PAGENAME}} {{FULLPAGENAME}} {{NAMESPACE}} gus ''gus'' This article is a :[[Category:Gus|gus]] Test [https://en.wikipedia.org/wiki/User:Example/sandbox data] [[User:Example/sandbox]] == Testing Safari line-wrap after math block == {{Infobox |name = Blah |bodystyle = width:30em |titlestyle = |title = Test Infobox |headerstyle = |labelstyle = width:33% |datastyle = |header1 = | label1 = Label 1 | data1 = Data 1 |header2 = | label2 = Label 2 | data2 = Data 2 |header3 = | label3 = Label 3 | data3 = Data 3 |header4 = Header 4 | label4 = | data4 = |header5 = | label5 = Label 5 | data5 = Data 5: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. |belowstyle = |below = Below text }} Testing an issue where a {{tag|math|open|attribs=display="block"}}, like <math display="block">\Beta(z_1,z_2)=\frac{\Gamma(z_1)\,\Gamma(z_2)}{\Gamma(z_1+z_2)}</math> is followed by a long line of text, or a paragraph, with no linebreak after the {{tag|math|o}} block. This was observed in Safari 26.4 on English Wikipedia 1.47.0-wmf.3 (e23f269). If this bug repros, the first line of this sub-paragraph following the math block should overflow into the right-floated infobox. Subsequent lines should flow correctly. Yahtzee, repro'd. [[Special:Contributions/&#126;2026-31338-89|&#126;2026-31338-89]] ([[User talk:&#126;2026-31338-89|talk]]) 00:21, 26 May 2026 (UTC) ([[:en:User:Sbb]]) 8fj4jz2n6feipmjtksjwpp141wyr9z9 East Peoria, Illinois 0 4076 613794 586055 2026-05-25T23:05:51Z Ludo Games-T 26302 613794 wikitext text/x-wiki '''East Peoria''' is the city in [[Tazewell County, Illinois|Tazewell County]], [[Illinois]], [[United States]]. The population was 23,402 at the 2010 census. East Peoria is part of the [[Peoria, Illinois]] [[Peoria metropolitan area|Metropolitan Statistical Area]], located across the [[Illinois River]] from downtown Peoria. It is home to many [[Caterpillar Inc.]] facilities. The city is also the site of the home campus of [[Illinois Central College]], the regional [[community college]], an Embassy Suites Hotel and Convention Center, and the expanded and renovated [[Par-A-Dice Hotel and Casino]] (both hotels feature the full-service restaurant). The main commercial area of East Peoria is just across the river from downtown Peoria. In concert with the renovation of old Caterpillar factories, the development of the downtown Peoria Riverfront Museum and Caterpillar Visitors Center, and the renovation of [[Interstate 74]] and of the area's bridges, East Peoria's downtown and urban area have developed as well. In 2011 and 2012, the major renovation of Washington Street and other downtown and city streets took place, and plans were announced to add the full-service [[Holiday Inn]] Center that would feature another high-level restaurant. In addition, ground was broken in June 2012 for the new Fondulac District Library, to be completed by the end of 2013. ab404sjmkj77z7y60j06n9xzpbq7abo User talk:Doc Taxon 3 63277 613718 613713 2026-05-25T13:00:04Z TaxonBot 4700 Log: AA 613718 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' hknytzd1vct6agli6ro7xsttfsbahfl 613719 613718 2026-05-25T13:00:41Z TaxonBot 4700 Log: Kat 613719 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' gnliza7ch6j2y4pnph0tys0hn7twj9v 613720 613719 2026-05-25T13:02:22Z TaxonBot 4700 Log: Kat 613720 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' 0l63a6kzvg51ce84o7wsc0avv2scwli 613721 613720 2026-05-25T13:04:24Z TaxonBot 4700 Log: Kat 613721 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' 4zka73xgzrm6l5ib1ei80kb6wnk5z8v 613743 613721 2026-05-25T13:53:25Z TaxonBot 4700 Log: AUX 613743 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' dho8scxb8robxp5z26m2cyuvbbte4bz 613744 613743 2026-05-25T14:29:43Z TaxonBot 4700 Log: MediaWiki 613744 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' 0s8an8sxbse8axbbondpodb48m0fejx 613746 613744 2026-05-25T16:31:35Z TaxonBot 4700 Log: AdT2 613746 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' 5qzeqeokfd069is3p9ya460dy6unwkw 613747 613746 2026-05-25T16:31:37Z TaxonBot 4700 Log: AA 613747 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' 95tri7icbgctezz0r7szd637gb3l4zu 613748 613747 2026-05-25T16:34:00Z TaxonBot 4700 Log: AdT2 613748 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' 50u0inl5urk542fllh2jjh3bkrraxwm 613749 613748 2026-05-25T16:55:35Z TaxonBot 4700 Log: AdT3 613749 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' 5wfzskefakiq2wvkyqw2z9fi1gmfskc 613750 613749 2026-05-25T17:01:58Z TaxonBot 4700 Log: AdT2 613750 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' da74vdk7fya3tp5quci6yef96jp7bdn 613753 613750 2026-05-25T17:04:29Z TaxonBot 4700 Log: AdT2 613753 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' s4mokliux6i73xgsdlknp7hy8kj05hb 613755 613753 2026-05-25T17:06:29Z TaxonBot 4700 Log: AdT2 613755 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' s5cvmv8qrwexg07i9i31uqiqtxru3lg 613757 613755 2026-05-25T17:08:52Z TaxonBot 4700 Log: AdT2 613757 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' 93f5zpshaqh7qyvbtk80qy591uzkwli 613759 613757 2026-05-25T17:15:49Z TaxonBot 4700 Log: AdT2 613759 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' l00z0m0my99w0jjk7eu5x0aphg1dspb 613761 613759 2026-05-25T17:18:08Z TaxonBot 4700 Log: AdT2 613761 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' p4ddxix977tf3yrt9dzazeivdao0i0m 613762 613761 2026-05-25T17:22:41Z TaxonBot 4700 Log: AdT2 613762 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' 0yzcylhlknx3fa7yglph9dsbfrxklal 613763 613762 2026-05-25T17:23:56Z TaxonBot 4700 Log: AdT2 613763 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' l3sq8lg2n7ymgxcnlmi5wl86uefx8jw 613764 613763 2026-05-25T17:24:45Z TaxonBot 4700 Log: AdT2 613764 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' 64wma9arrop9tbd0hn9thhmgzobjria 613765 613764 2026-05-25T17:25:04Z TaxonBot 4700 Log: AdT2 613765 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' nkib90mig1m0w24ssvdsuh2xrz87scx 613766 613765 2026-05-25T17:26:03Z TaxonBot 4700 Log: AdT3 613766 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' r84yopv25q5oqfo8r0wiefb5m47opy6 613767 613766 2026-05-25T17:26:23Z TaxonBot 4700 Log: AdT2 613767 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' i3fmln4rzd2s1ua96q1cd8yo5q2yriv 613768 613767 2026-05-25T17:27:07Z TaxonBot 4700 Log: AdT2 613768 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' mn2zhg5v3mz57p39llor27mwq6j2fev 613769 613768 2026-05-25T17:28:54Z TaxonBot 4700 Log: AdT2 613769 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' 4l5pwk0bn4fflnvewfoue758h3hz8te 613770 613769 2026-05-25T17:31:19Z TaxonBot 4700 Log: AdT2 613770 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' c8egpkjozsjsv1d1jzkmb3018r4jteh 613771 613770 2026-05-25T17:50:09Z TaxonBot 4700 Log: AdT3 613771 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' eunmsqmx9w4l9cpymmlrlymf8ai0whb 613772 613771 2026-05-25T19:16:02Z TaxonBot 4700 Log: AdT2 613772 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' 3gu7tedw77gh6orrxmlwj1qqt982v6p 613773 613772 2026-05-25T19:18:25Z TaxonBot 4700 Log: AdT2 613773 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' 1tfjkqhirkho0vjw0uanfi54p3wray2 613774 613773 2026-05-25T19:40:03Z TaxonBot 4700 Log: AdT3 613774 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' dlye62cni9xjhoanes87c35kfez8n30 613775 613774 2026-05-25T21:55:07Z TaxonBot 4700 Log: HS 613775 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' rgue0apgvbxm7787eogojes4h060fsm 613776 613775 2026-05-25T22:00:08Z TaxonBot 4700 Log: Review 613776 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' o2fqtnrph3qtic55w3i15tcovcak3mc 613777 613776 2026-05-25T22:00:14Z TaxonBot 4700 Log: AA 613777 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' pt7dc0mg9gjnk6w8nmm6u6xu9g7cbv1 613778 613777 2026-05-25T22:00:18Z TaxonBot 4700 Log: AA 613778 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' ip0kgzf0z8ki5giephdxy283xutt64l 613779 613778 2026-05-25T22:00:19Z TaxonBot 4700 Log: LKU 613779 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' evdiukncxakaj614ax58w9ie4io1742 613780 613779 2026-05-25T22:00:31Z TaxonBot 4700 Log: AA 613780 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' 246blkts4vvqcbac7hysxfp296xv4um 613781 613780 2026-05-25T22:01:29Z TaxonBot 4700 Log: AdT-Archive 613781 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' lfpq6pefwtqqft1lx3x35x65msxv6bp 613782 613781 2026-05-25T22:01:36Z TaxonBot 4700 Log: AdT2 613782 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' 7njlcy176p35867585n799fl0vi7txe 613783 613782 2026-05-25T22:03:33Z TaxonBot 4700 Log: AdT2 613783 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' 34huzp0ou53am17b126zqa0upmp7e52 613784 613783 2026-05-25T22:03:49Z TaxonBot 4700 Log: AdT2 613784 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' pju9t1758y5a4v0ex1h6hgstmrmlejg 613785 613784 2026-05-25T22:04:11Z TaxonBot 4700 Log: AdTneu 613785 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' of5vso76u03ptk19bftg5of8haj7stk 613786 613785 2026-05-25T22:05:08Z TaxonBot 4700 Log: HS 613786 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' 5kark75tmaos6os2cbbjsnymvyj7b3y 613787 613786 2026-05-25T22:05:53Z TaxonBot 4700 Log: AdT2 613787 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' d8hc8gw3ea97d2ydy6q1hew1fwg1n0m 613788 613787 2026-05-25T22:06:25Z TaxonBot 4700 Log: AdT2 613788 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' 1hpe7jwg4zmart5qv4qd9224t6z75xw 613789 613788 2026-05-25T22:11:50Z TaxonBot 4700 Log: AdT-V 613789 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' ha1dydnerxdm0xfbqdqyw1b9ed5pmi7 613790 613789 2026-05-25T22:26:03Z TaxonBot 4700 Log: AdT3 613790 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-21 == * '''2026-05-21T01:50:28Z NeueArtikel3: Task finished!''' * 2026-05-21T03:08:07Z '''[[:de:Special:Diff/prev/267242343|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#JAMA|JAMA]]) - letzte Bearbeitung: [[:User:FordPrefect42|FordPrefect42]], 2026-05-20 20:12'' * 2026-05-21T05:09:33Z '''[[:de:Special:Diff/prev/267244006|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: alles aus [[:Kategorie:Aktmaler]] entfernen: erledigt'' * 2026-05-21T07:03:33Z '''[[:de:Special:Diff/prev/267246290|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Uwe Gille|Uwe Gille]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Krabbenbeschreibung|→]]<span class="autocomment">Krabbenbeschreibung: </span>'' * '''2026-05-21T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-21T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-21T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T10:43:29Z MerlBot: Task finished!''' * '''2026-05-21T10:43:43Z MerlBot1a: Task finished!''' * '''2026-05-21T12:06:40Z AdT2: Task finished!''' * '''2026-05-21T12:09:01Z AdT2: Task finished!''' * '''2026-05-21T12:24:12Z AdT2: Task finished!''' * '''2026-05-21T12:26:24Z AdT2: Task finished!''' * '''2026-05-21T12:31:22Z AdT3: Task finished!''' * 2026-05-21T12:54:00Z '''[[:de:Special:Diff/prev/267253538|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Brodkey65|Brodkey65]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Brodkey65|: </span>'' * '''2026-05-21T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-21T17:01:10Z '''[[:de:Special:Diff/prev/267259417|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * 2026-05-21T17:09:45Z '''[[:de:Special:Diff/prev/267259599|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Icy2008|Icy2008]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#21. Mai 2026|→]]<span class="autocomment">21. Mai 2026: </span>'' * '''2026-05-21T18:03:14Z AdT2: Task finished!''' * '''2026-05-21T18:05:26Z AdT2: Task finished!''' * 2026-05-21T18:12:38Z '''[[:de:Special:Diff/prev/267260683|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T18:26:45Z AdT3: Task finished!''' * '''2026-05-21T19:08:09Z AdT2: Task finished!''' * '''2026-05-21T19:10:23Z AdT2: Task finished!''' * '''2026-05-21T19:31:07Z AdT3: Task finished!''' * '''2026-05-21T20:02:12Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-21T21:03:25Z '''[[:de:Special:Diff/prev/267263989|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Multistufige Wikinewsanfrage|→]]<span class="autocomment">Multistufige Wikinewsanfrage: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:06:09Z '''[[:de:Special:Diff/prev/267264027|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Icodense|Icodense]] -- ''[[:de:Wikipedia:Bots/Anfragen#Palawan|→]]<span class="autocomment">Palawan: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * 2026-05-21T21:32:22Z '''[[:de:Special:Diff/prev/267264456|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * 2026-05-21T21:32:25Z '''[[:de:Special:Diff/prev/267264458|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:NDG|NDG]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:NDG||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:NDG|: </span>'' * '''2026-05-21T21:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-21T22:00:14Z '''[[:de:Special:Diff/prev/267264866|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-21T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-21T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-21T22:01:22Z AdT-Archive: Task finished!''' * '''2026-05-21T22:01:31Z AdT2: Task finished!''' * '''2026-05-21T22:03:16Z AdT2: Task finished!''' * '''2026-05-21T22:03:29Z AdT2: Task finished!''' * '''2026-05-21T22:03:51Z AdTneu: Task finished!''' * '''2026-05-21T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-21T22:05:27Z AdT2: Task finished!''' * '''2026-05-21T22:05:41Z AdT2: Task finished!''' * 2026-05-21T22:10:44Z '''[[:de:Special:Diff/prev/267265113|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-21T22:24:29Z AdT3: Task finished!''' * 2026-05-21T22:34:55Z '''[[:de:Special:Diff/prev/267265371|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Vorlagen-Bereinigung|→]]<span class="autocomment">Vorlagen-Bereinigung: </span> als erledigt markiert'' * 2026-05-21T23:07:16Z '''[[:de:Special:Diff/prev/267265615|••]] MediaWiki:''' [[:de:MediaWiki:Summary|MediaWiki:Summary]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:08:08Z '''[[:de:Special:Diff/prev/267265619|••]] MediaWiki:''' [[:de:MediaWiki:Templatesused|MediaWiki:Templatesused]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:09:35Z '''[[:de:Special:Diff/prev/267265628|••]] MediaWiki:''' [[:de:MediaWiki:Deletedtext|MediaWiki:Deletedtext]] -- [[:de:user:Leyo|Leyo]] -- ''vereinfacht'' * 2026-05-21T23:37:31Z '''[[:de:Special:Diff/prev/267265913|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel|→]]<span class="autocomment">Bot für die Abarbeitung von Kategorie:Benutzer:Importartikel: </span> als erledigt markiert'' * 2026-05-21T23:56:55Z '''[[:de:Special:Diff/prev/267266065|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span> @HvW'' * 2026-05-21T23:59:09Z '''[[:de:Special:Diff/prev/267266077|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen|→]]<span class="autocomment">Von „{{Soccerway|…}}“ auf „{{Scorebar|…}}“ umstellen: </span> als erledigt markiert'' == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' 797sgxzg7rk4nklifz1a533k0qqondk 613795 613790 2026-05-26T00:00:02Z TaxonBot 4700 /* TaxonBot: Protokoll 2026-05-26 */ new section 613795 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == k2x60z8qvcdui0k1awfnp47m18bowbz 613797 613795 2026-05-26T01:46:41Z TaxonBot 4700 Log: MB3 613797 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' fcb8qb05sz1isz6nhibn5q1lgufakf0 613798 613797 2026-05-26T04:43:54Z TaxonBot 4700 Log: AA 613798 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' o6ptaonl9m5mvb27d76o1m6ioc5sbf1 613799 613798 2026-05-26T06:30:22Z TaxonBot 4700 Log: AdT2 613799 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' cusdioht3p5u5y3n6pibl89ykiy1mkm 613800 613799 2026-05-26T06:32:39Z TaxonBot 4700 Log: AdT2 613800 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' qvnisdbiji1rx9zq3f39c1lm83asntd 613801 613800 2026-05-26T06:53:32Z TaxonBot 4700 Log: AdT3 613801 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' 5l7n7oc9jcyau5jq3lm5srpbefnoihq 613802 613801 2026-05-26T08:40:53Z TaxonBot 4700 Log: Bots 613802 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' n30s5rw5lrs5x6gjaq9e9l7sutgk8eo 613803 613802 2026-05-26T09:03:28Z TaxonBot 4700 Log: BIBR 613803 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' pe7rv8msbberi92g795igrfrpdx8ihf 613804 613803 2026-05-26T09:05:42Z TaxonBot 4700 Log: LKU 613804 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' a7rzcdvd5zv6zj1nvk0fnyaeb5pfg73 613805 613804 2026-05-26T09:25:23Z TaxonBot 4700 Log: BIBR 613805 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' qpz89d7j3h47m1hjx82fd6jonn719qd 613807 613805 2026-05-26T09:32:16Z TaxonBot 4700 Log: AUX 613807 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' og0xnlg7r3rfi8nql9horjlmfrhyaqp 613809 613807 2026-05-26T09:55:08Z TaxonBot 4700 Log: HS 613809 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-26T09:55:08Z HS-Snapshot: Task finished!''' dt82jc36m8n1y3g5ifkh10yi1oti1v8 613810 613809 2026-05-26T10:00:13Z TaxonBot 4700 Log: AA 613810 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-26T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-26T10:00:13Z AutoArchiv Wiktionary: Task finished!''' n7r585b0gy2otykq870iohr76q7ebw4 613811 613810 2026-05-26T10:00:19Z TaxonBot 4700 Log: AA 613811 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-26T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-26T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-26T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' aldfvj7fbku804l01kotabkyv5pi830 613812 613811 2026-05-26T10:00:32Z TaxonBot 4700 Log: AA 613812 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-26T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-26T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-26T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-26T10:00:32Z AutoArchiv Wikiversity: Task finished!''' o693t7dr82ksgep1djp67uo2k9rmvjn 613814 613812 2026-05-26T10:06:19Z TaxonBot 4700 Log: AUX 613814 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-26T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-26T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-26T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-26T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-26T10:06:15Z [[:de:Special:Diff/prev/267390412|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Augsburg#Getränkebestellung|→]]<span class="autocomment">Getränkebestellung: </span>''''' 9y1vfuf2drtl0xv5wyhimntrffnskj7 613816 613814 2026-05-26T10:42:46Z TaxonBot 4700 Log: MB1 613816 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-26T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-26T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-26T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-26T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-26T10:06:15Z [[:de:Special:Diff/prev/267390412|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Augsburg#Getränkebestellung|→]]<span class="autocomment">Getränkebestellung: </span>''''' * '''2026-05-26T10:42:46Z MerlBot: Task finished!''' 3mvvbt06u3tarkuhvjlh4mp5f47ho74 613817 613816 2026-05-26T10:43:00Z TaxonBot 4700 Log: MB1 613817 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-26T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-26T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-26T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-26T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-26T10:06:15Z [[:de:Special:Diff/prev/267390412|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Augsburg#Getränkebestellung|→]]<span class="autocomment">Getränkebestellung: </span>''''' * '''2026-05-26T10:42:46Z MerlBot: Task finished!''' * '''2026-05-26T10:42:59Z MerlBot1a: Task finished!''' h0ahxii1t8m1qhptkh15ebevi482p9k 613818 613817 2026-05-26T11:53:37Z TaxonBot 4700 Log: AUX 613818 wikitext text/x-wiki == TaxonBot: Protokoll 2026-05-22 == * 2026-05-22T00:48:17Z '''[[:de:Special:Diff/prev/267266339|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:HvW|HvW]] -- ''[[:de:Wikipedia:Bots/Anfragen#Wayback Machine (Internetarchiv)|→]]<span class="autocomment">Wayback Machine (Internetarchiv): </span>'' * '''2026-05-22T01:20:11Z Review: Task finished!''' * '''2026-05-22T01:48:38Z NeueArtikel3: Task finished!''' * '''2026-05-22T02:20:24Z AdT2: Task finished!''' * '''2026-05-22T02:22:35Z AdT2: Task finished!''' * 2026-05-22T02:29:44Z '''[[:de:Special:Diff/prev/267266877|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T02:43:25Z AdT3: Task finished!''' * 2026-05-22T03:07:46Z '''[[:de:Special:Diff/prev/267267087|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 2 Abschnitte: 2 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente|Untersuchungen_zur_Anwendung_der_Graphentheorie_für_automatisierte_kartographische_Bearbeitung_linearer_Elemente]]) - letzte Bearbeitung: [[:User:Uwe Gille|Uwe Gille]], 2026-05-21 09:03'' * '''2026-05-22T04:32:35Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T04:47:27Z -- <span style="color:red;">110</span>''' * '''2026-05-22T04:48:10Z -- <span style="color:red;">110</span>''' * 2026-05-22T06:46:14Z '''[[:de:Special:Diff/prev/267272493|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''MediaWiki-Breakpoints verfügbar gemacht und float-(left|right)-Klassen auf Mobilgeräten deaktivieren'' * 2026-05-22T07:00:27Z '''[[:de:Special:Diff/prev/267272775|••]] MediaWiki:''' [[:de:MediaWiki:Gadget-dewikiCommonLayout.css|MediaWiki:Gadget-dewikiCommonLayout.css]] -- [[:de:user:Hgzh|Hgzh]] -- ''Denkfehler'' * '''2026-05-22T09:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-22T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T10:00:25Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-22T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T10:40:30Z MerlBot: Task finished!''' * '''2026-05-22T10:40:43Z MerlBot1a: Task finished!''' * '''2026-05-22T13:00:03Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-22T15:16:37Z '''[[:de:Special:Diff/prev/267283497|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: 1 Abschnitt nach [[Wikipedia:WikiProjekt Kategorien/Warteschlange/Archiv/2026 II#Bot: alles aus Kategorie:Aktmaler entfernen (erledigt)]] archiviert – letzte Bearbeitung: [[user:TaxonKatBot|TaxonKatBot]] (21.05.2026 07:09:33)'' * '''2026-05-22T15:19:09Z AdT2: Task finished!''' * '''2026-05-22T15:21:18Z AdT2: Task finished!''' * '''2026-05-22T15:21:46Z AdT2: Task finished!''' * '''2026-05-22T15:23:56Z AdT2: Task finished!''' * '''2026-05-22T15:35:14Z AdT2: Task finished!''' * '''2026-05-22T15:37:32Z AdT2: Task finished!''' * '''2026-05-22T15:42:08Z AdT3: Task finished!''' * 2026-05-22T15:45:25Z '''[[:de:Special:Diff/prev/267284050|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-22T15:45:32Z '''[[:de:Special:Diff/prev/267284056|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Achim Raschka|Achim Raschka]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Architektur|→]]<span class="autocomment">Architektur: </span> + [[Burg Altena (Schüttorf)]]'' * '''2026-05-22T15:56:48Z AdT2: Task finished!''' * '''2026-05-22T15:58:58Z AdT2: Task finished!''' * 2026-05-22T16:02:11Z '''[[:de:Special:Diff/prev/267284450|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:PerfektesChaos|PerfektesChaos]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span> aw'' * '''2026-05-22T16:08:13Z [[:de:Special:Diff/prev/267284555|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Elibtanjaaux|Elibtanjaaux]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Antwort''''' * '''2026-05-22T16:13:16Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-22T16:19:38Z AdT3: Task finished!''' * '''2026-05-22T18:24:02Z AdT2: Task finished!''' * '''2026-05-22T18:26:20Z AdT2: Task finished!''' * 2026-05-22T18:46:02Z '''[[:de:Special:Diff/prev/267287475|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Louis Bafrance|Louis Bafrance]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Louis Bafrance|: </span>'' * '''2026-05-22T18:48:03Z AdT3: Task finished!''' * '''2026-05-22T19:20:46Z AdT2: Task finished!''' * '''2026-05-22T19:23:03Z AdT2: Task finished!''' * '''2026-05-22T19:42:04Z AdT2: Task finished!''' * '''2026-05-22T19:44:01Z AdT3: Task finished!''' * '''2026-05-22T19:44:24Z AdT2: Task finished!''' * '''2026-05-22T20:07:31Z AdT3: Task finished!''' * '''2026-05-22T21:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:00:07Z Review: Task finished!''' * '''2026-05-22T22:00:16Z AutoArchiv Wiktionary: Task finished!''' * 2026-05-22T22:00:13Z '''[[:de:Special:Diff/prev/267290997|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-22T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-22T22:00:36Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-22T22:01:33Z AdT-Archive: Task finished!''' * '''2026-05-22T22:01:39Z AdT2: Task finished!''' * '''2026-05-22T22:03:29Z AdT2: Task finished!''' * '''2026-05-22T22:03:41Z AdT2: Task finished!''' * '''2026-05-22T22:04:03Z AdTneu: Task finished!''' * '''2026-05-22T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-22T22:05:43Z AdT2: Task finished!''' * '''2026-05-22T22:05:55Z AdT2: Task finished!''' * 2026-05-22T22:10:49Z '''[[:de:Special:Diff/prev/267291170|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-22T22:24:38Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-23 == * '''2026-05-23T01:49:10Z NeueArtikel3: Task finished!''' * '''2026-05-23T01:49:53Z AdT2: Task finished!''' * '''2026-05-23T01:52:10Z AdT2: Task finished!''' * '''2026-05-23T01:58:35Z AdT2: Task finished!''' * '''2026-05-23T02:00:52Z AdT2: Task finished!''' * '''2026-05-23T02:01:20Z AdT2: Task finished!''' * '''2026-05-23T02:03:39Z AdT2: Task finished!''' * '''2026-05-23T02:12:55Z AdT3: Task finished!''' * 2026-05-23T03:07:32Z '''[[:de:Special:Diff/prev/267293356|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 1 Abschnitt: 1 nach [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II]] (ab Abschnitt [[Wikipedia:Bibliotheksrecherche/Anfragen/Archiv/2026/II#Krabbenbeschreibung|Krabbenbeschreibung]]) - letzte Bearbeitung: [[:User:SpBot|SpBot]], 2026-05-22 05:07'' * '''2026-05-23T04:32:37Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-23T08:28:15Z '''[[:de:Special:Diff/prev/267299083|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Brunswyk|Brunswyk]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span>'' * '''2026-05-23T08:36:45Z AdT2: Task finished!''' * '''2026-05-23T08:39:00Z AdT2: Task finished!''' * '''2026-05-23T08:59:43Z AdT3: Task finished!''' * 2026-05-23T09:39:57Z '''[[:de:Special:Diff/prev/267302049|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T09:55:09Z HS-Snapshot: Task finished!''' * '''2026-05-23T10:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-23T10:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T10:42:34Z MerlBot: Task finished!''' * '''2026-05-23T10:42:48Z MerlBot1a: Task finished!''' * 2026-05-23T12:03:55Z '''[[:de:Special:Diff/prev/267309437|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:FordPrefect42|FordPrefect42]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-23T12:15:23Z AdT2: Task finished!''' * '''2026-05-23T12:17:37Z AdT2: Task finished!''' * '''2026-05-23T12:38:09Z AdT3: Task finished!''' * '''2026-05-23T12:38:28Z AdT2: Task finished!''' * '''2026-05-23T12:38:58Z AdT2: Task finished!''' * '''2026-05-23T12:40:44Z AdT2: Task finished!''' * '''2026-05-23T12:41:12Z AdT2: Task finished!''' * '''2026-05-23T12:49:41Z AdT2: Task finished!''' * '''2026-05-23T12:51:55Z AdT2: Task finished!''' * '''2026-05-23T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-23T13:01:26Z AdT3: Task finished!''' * '''2026-05-23T16:13:44Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-23T16:24:21Z AdT2: Task finished!''' * '''2026-05-23T16:26:44Z AdT2: Task finished!''' * '''2026-05-23T16:47:04Z AdT3: Task finished!''' * '''2026-05-23T19:27:10Z AdT2: Task finished!''' * '''2026-05-23T19:28:55Z AdT2: Task finished!''' * '''2026-05-23T19:29:28Z AdT2: Task finished!''' * '''2026-05-23T19:31:11Z AdT2: Task finished!''' * '''2026-05-23T19:50:32Z AdT3: Task finished!''' * '''2026-05-23T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:00:08Z Review: Task finished!''' * '''2026-05-23T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-23T22:00:17Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-23T22:00:19Z '''[[:de:Special:Diff/prev/267321490|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-23T22:00:29Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-23T22:01:25Z AdT-Archive: Task finished!''' * '''2026-05-23T22:01:33Z AdT2: Task finished!''' * '''2026-05-23T22:03:24Z AdTneu: Task finished!''' * '''2026-05-23T22:03:26Z AdT2: Task finished!''' * '''2026-05-23T22:03:43Z AdT2: Task finished!''' * '''2026-05-23T22:05:07Z HS-Snapshot: Task finished!''' * '''2026-05-23T22:05:44Z AdT2: Task finished!''' * '''2026-05-23T22:06:02Z AdT2: Task finished!''' * '''2026-05-23T22:25:00Z AdT3: Task finished!''' * '''2026-05-23T23:05:42Z AdT2: Task finished!''' * '''2026-05-23T23:07:54Z AdT2: Task finished!''' * '''2026-05-23T23:28:30Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-24 == * '''2026-05-24T01:45:38Z NeueArtikel3: Task finished!''' * '''2026-05-24T03:30:53Z AdT2: Task finished!''' * '''2026-05-24T03:33:06Z AdT2: Task finished!''' * '''2026-05-24T03:53:16Z AdT3: Task finished!''' * '''2026-05-24T04:31:43Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-24T07:38:53Z -- <span style="color:red;">110</span>''' * '''2026-05-24T07:50:12Z -- <span style="color:red;">110</span>''' * 2026-05-24T09:21:49Z '''[[:de:Special:Diff/prev/267330695|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:Ich esse Rosinen.|Ich esse Rosinen.]] -- ''[[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung#Chemie|→]]<span class="autocomment">Chemie: </span> +[[Cer]]'' * 2026-05-24T09:38:49Z '''[[:de:Special:Diff/prev/267331167|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#2 Aufsätze zum Thema „Kriminalroman“|→]]<span class="autocomment">2 Aufsätze zum Thema „Kriminalroman“: </span> Antwort'' * '''2026-05-24T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-24T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-24T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T10:28:24Z AdT2: Task finished!''' * '''2026-05-24T10:30:40Z AdT2: Task finished!''' * '''2026-05-24T10:38:19Z MerlBot: Task finished!''' * '''2026-05-24T10:38:33Z MerlBot1a: Task finished!''' * '''2026-05-24T10:51:56Z AdT3: Task finished!''' * 2026-05-24T12:36:49Z '''[[:de:Special:Diff/prev/267335203|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Falscher Strich|→]]<span class="autocomment">Falscher Strich: </span>'' * 2026-05-24T12:39:16Z '''[[:de:Special:Diff/prev/267335281|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * '''2026-05-24T14:38:15Z AdT2: Task finished!''' * '''2026-05-24T14:40:30Z AdT2: Task finished!''' * '''2026-05-24T15:01:40Z AdT3: Task finished!''' * '''2026-05-24T16:18:49Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-24T17:33:18Z '''[[:de:Special:Diff/prev/267345387|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-24T20:00:08Z '''[[:de:Special:Diff/prev/267349924|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#743 Linkkorrekturen|→]]<span class="autocomment">743 Linkkorrekturen: </span>'' * '''2026-05-24T20:18:48Z [[:de:Special:Diff/prev/267350267|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-24T20:19:09Z [[:de:Special:Diff/prev/267350273|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia:Augsburg#Programm|→]]<span class="autocomment">Programm: </span> Verschoben auf Disku''''' * '''2026-05-24T20:58:07Z [[:de:Special:Diff/prev/267351002|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''Neuer Abschnitt [[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T20:58:26Z [[:de:Special:Diff/prev/267351008|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Neitram|Neitram]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span>''''' * '''2026-05-24T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:00:14Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-24T22:00:19Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-24T22:00:16Z '''[[:de:Special:Diff/prev/267351973|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-24T22:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-24T22:01:30Z AdT-Archive: Task finished!''' * '''2026-05-24T22:01:35Z AdT2: Task finished!''' * '''2026-05-24T22:03:24Z AdTneu: Task finished!''' * '''2026-05-24T22:03:33Z AdT2: Task finished!''' * '''2026-05-24T22:03:39Z AdT2: Task finished!''' * '''2026-05-24T22:05:09Z HS-Snapshot: Task finished!''' * '''2026-05-24T22:05:50Z AdT2: Task finished!''' * '''2026-05-24T22:05:56Z AdT2: Task finished!''' * 2026-05-24T22:10:54Z '''[[:de:Special:Diff/prev/267352144|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-24T22:24:49Z AdT3: Task finished!''' * '''2026-05-24T22:50:08Z Review: Task finished!''' == TaxonBot: Protokoll 2026-05-25 == * '''2026-05-25T01:46:44Z NeueArtikel3: Task finished!''' * 2026-05-25T03:07:36Z '''[[:de:Special:Diff/prev/267354906|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:SpBot|SpBot]] -- ''Archiviere 6 Abschnitte: 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2014-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2022-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2023-2]], 2 nach [[Wikipedia:Bots/Anfragen/Archiv/2025-2]], 1 nach [[Wikipedia:Bots/Anfragen/Archiv/2026-1]] - letzte Bearbeitung: [[:User:Wurgl|Wurgl]], 2026-05-24 22:00'' * 2026-05-25T03:35:18Z '''[[:de:Special:Diff/prev/267355123|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Phzh|Phzh]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * '''2026-05-25T04:48:00Z AutoArchiv Wikipedia: Task finished!''' * 2026-05-25T05:32:29Z '''[[:de:Special:Diff/prev/267356727|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Wurgl|Wurgl]] -- ''[[:de:Wikipedia:Bots/Anfragen#Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox|→]]<span class="autocomment">Umstellung der Gemeindeartikel in Brasilien auf bessere Infobox: </span>'' * 2026-05-25T06:45:29Z '''[[:de:Special:Diff/prev/267358083|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft|→]]<span class="autocomment">Bot: Kategorie:Langstrecken-Weltmeisterschaft nach Kategorie:FIA-Langstrecken-Weltmeisterschaft: </span>'' * 2026-05-25T06:46:41Z '''[[:de:Special:Diff/prev/267358109|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans|→]]<span class="autocomment">Bot: Kategorie:Wetter und Klima des Atlantik nach Kategorie:Wetter und Klima des Atlantischen Ozeans: </span>'' * 2026-05-25T06:48:47Z '''[[:de:Special:Diff/prev/267358150|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:Zollernalb|Zollernalb]] -- ''Neuer Abschnitt [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange#Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid|→]]<span class="autocomment">Bot: Kategorie:Femizid als Thema nach Kategorie:Femizid: </span>'' * 2026-05-25T09:36:41Z '''[[:de:Special:Diff/prev/267362689|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''[[:de:Wikipedia:Bots/Anfragen#Englische Seitenangabe p.|→]]<span class="autocomment">Englische Seitenangabe p.: </span> als erledigt markiert ([[:de:Benutzer:TenWhile6/SchnellErl|SchnellErl]] v1.5b)'' * '''2026-05-25T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-25T10:00:24Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T10:00:30Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T10:43:12Z MerlBot: Task finished!''' * '''2026-05-25T10:43:26Z MerlBot1a: Task finished!''' * 2026-05-25T10:53:53Z '''[[:de:Special:Diff/prev/267364382|••]] MediaWiki:''' [[:de:MediaWiki:GrowthMentors.json|MediaWiki:GrowthMentors.json]] -- [[:de:user:Ankermast|Ankermast]] -- ''[[:de:MediaWiki:GrowthMentors.json#growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast||→]]<span class="autocomment">growthexperiments-manage-mentors-summary-change-self-no-reason:Ankermast|: </span>'' * 2026-05-25T11:18:16Z '''[[:de:Special:Diff/prev/267365062|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span> Antwort'' * 2026-05-25T11:21:15Z '''[[:de:Special:Diff/prev/267365140|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kompetenter|Kompetenter]] -- ''Aw, erl.'' * '''2026-05-25T13:00:04Z AutoArchiv-Maimaid: Task finished!''' * 2026-05-25T13:00:39Z '''[[:de:Special:Diff/prev/267367719|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Langstrecken-Weltmeisterschaft]] nach [[:Kategorie:FIA-Langstrecken-Weltmeisterschaft]]: erledigt'' * 2026-05-25T13:02:19Z '''[[:de:Special:Diff/prev/267367777|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Wetter und Klima des Atlantik]] nach [[:Kategorie:Wetter und Klima des Atlantischen Ozeans]]: erledigt'' * 2026-05-25T13:04:22Z '''[[:de:Special:Diff/prev/267367847|••]] Kat:''' [[:de:Wikipedia:WikiProjekt Kategorien/Warteschlange|Wikipedia:WikiProjekt Kategorien/Warteschlange]] -- [[:de:user:TaxonKatBot|TaxonKatBot]] -- ''Bot: [[:Kategorie:Femizid als Thema]] nach [[:Kategorie:Femizid]]: erledigt'' * '''2026-05-25T13:53:22Z [[:de:Special:Diff/prev/267368761|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' * 2026-05-25T14:29:40Z '''[[:de:Special:Diff/prev/267369453|••]] MediaWiki:''' [[:de:MediaWiki:Sitematrix-summary|MediaWiki:Sitematrix-summary]] -- [[:de:user:Ameisenigel|Ameisenigel]] -- ''Deutsch'' * '''2026-05-25T16:31:35Z AdT2: Task finished!''' * '''2026-05-25T16:31:37Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-25T16:33:59Z AdT2: Task finished!''' * '''2026-05-25T16:55:35Z AdT3: Task finished!''' * '''2026-05-25T17:01:57Z AdT2: Task finished!''' * '''2026-05-25T17:04:29Z AdT2: Task finished!''' * '''2026-05-25T17:06:29Z AdT2: Task finished!''' * '''2026-05-25T17:08:52Z AdT2: Task finished!''' * '''2026-05-25T17:15:49Z AdT2: Task finished!''' * '''2026-05-25T17:18:08Z AdT2: Task finished!''' * '''2026-05-25T17:22:41Z AdT2: Task finished!''' * '''2026-05-25T17:23:56Z AdT2: Task finished!''' * '''2026-05-25T17:24:44Z AdT2: Task finished!''' * '''2026-05-25T17:25:04Z AdT2: Task finished!''' * '''2026-05-25T17:26:02Z AdT3: Task finished!''' * '''2026-05-25T17:26:23Z AdT2: Task finished!''' * '''2026-05-25T17:27:07Z AdT2: Task finished!''' * '''2026-05-25T17:28:54Z AdT2: Task finished!''' * '''2026-05-25T17:31:19Z AdT2: Task finished!''' * '''2026-05-25T17:50:09Z AdT3: Task finished!''' * '''2026-05-25T19:16:02Z AdT2: Task finished!''' * '''2026-05-25T19:18:25Z AdT2: Task finished!''' * '''2026-05-25T19:40:03Z AdT3: Task finished!''' * '''2026-05-25T21:55:07Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:00:07Z Review: Task finished!''' * '''2026-05-25T22:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-25T22:00:18Z AutoArchiv Wikivoyage: Task finished!''' * 2026-05-25T22:00:15Z '''[[:de:Special:Diff/prev/267379249|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Archivierung'' * '''2026-05-25T22:00:31Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-25T22:01:29Z AdT-Archive: Task finished!''' * '''2026-05-25T22:01:36Z AdT2: Task finished!''' * '''2026-05-25T22:03:33Z AdT2: Task finished!''' * '''2026-05-25T22:03:48Z AdT2: Task finished!''' * '''2026-05-25T22:04:11Z AdTneu: Task finished!''' * '''2026-05-25T22:05:08Z HS-Snapshot: Task finished!''' * '''2026-05-25T22:05:53Z AdT2: Task finished!''' * '''2026-05-25T22:06:25Z AdT2: Task finished!''' * 2026-05-25T22:11:43Z '''[[:de:Special:Diff/prev/267379423|••]] AdT-V:''' [[:de:Wikipedia:Hauptseite/Artikel des Tages/Verwaltung|Wikipedia:Hauptseite/Artikel des Tages/Verwaltung]] -- [[:de:user:TaxonBot|TaxonBot]] -- ''Bot: Aktualisierung'' * '''2026-05-25T22:26:03Z AdT3: Task finished!''' == TaxonBot: Protokoll 2026-05-26 == * '''2026-05-26T01:46:41Z NeueArtikel3: Task finished!''' * '''2026-05-26T04:43:54Z AutoArchiv Wikipedia: Task finished!''' * '''2026-05-26T06:30:21Z AdT2: Task finished!''' * '''2026-05-26T06:32:39Z AdT2: Task finished!''' * '''2026-05-26T06:53:32Z AdT3: Task finished!''' * 2026-05-26T08:40:45Z '''[[:de:Special:Diff/prev/267388106|••]] Bots:''' [[:de:Wikipedia:Bots/Anfragen|Wikipedia:Bots/Anfragen]] -- [[:de:user:Darkking3|Darkking3]] -- ''Neuer Abschnitt [[:de:Wikipedia:Bots/Anfragen#Vorlage:Radsportseiten|→]]<span class="autocomment">Vorlage:Radsportseiten: </span>'' * 2026-05-26T09:03:24Z '''[[:de:Special:Diff/prev/267388746|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Bulletin de la Société Géologique de France|→]]<span class="autocomment">Bulletin de la Société Géologique de France: </span>'' * 2026-05-26T09:05:39Z '''[[:de:Special:Diff/prev/267388815|••]] LKU:''' [[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen|Wikipedia:Löschkandidaten/Urheberrechtsverletzungen]] -- [[:de:user:Marie Adelaide|Marie Adelaide]] -- ''[[:de:Wikipedia:Löschkandidaten/Urheberrechtsverletzungen#Altfälle mit offenen Fragen oder Problemen|→]]<span class="autocomment">Altfälle mit offenen Fragen oder Problemen: </span>'' * 2026-05-26T09:25:19Z '''[[:de:Special:Diff/prev/267389453|••]] BIBR:''' [[:de:Wikipedia:Bibliotheksrecherche/Anfragen|Wikipedia:Bibliotheksrecherche/Anfragen]] -- [[:de:user:Kurzstueckmeister|Kurzstueckmeister]] -- ''[[:de:Wikipedia:Bibliotheksrecherche/Anfragen#Händel: Agrippina|→]]<span class="autocomment">Händel: Agrippina: </span> Antwort'' * '''2026-05-26T09:32:13Z [[:de:Special:Diff/prev/267389680|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Martinus KE|Martinus KE]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Orte der lokalen Demokratiegeschichte|→]]<span class="autocomment">Orte der lokalen Demokratiegeschichte: </span>''''' * '''2026-05-26T09:55:08Z HS-Snapshot: Task finished!''' * '''2026-05-26T10:00:13Z AutoArchiv Wiktionary: Task finished!''' * '''2026-05-26T10:00:18Z AutoArchiv Wikivoyage: Task finished!''' * '''2026-05-26T10:00:32Z AutoArchiv Wikiversity: Task finished!''' * '''2026-05-26T10:06:15Z [[:de:Special:Diff/prev/267390412|••]] Augsburg: [[:de:Wikipedia:Augsburg|Wikipedia:Augsburg]] -- [[:de:user:Doc Taxon|Doc Taxon]] -- ''[[:de:Wikipedia:Augsburg#Getränkebestellung|→]]<span class="autocomment">Getränkebestellung: </span>''''' * '''2026-05-26T10:42:46Z MerlBot: Task finished!''' * '''2026-05-26T10:42:59Z MerlBot1a: Task finished!''' * '''2026-05-26T11:53:34Z [[:de:Special:Diff/prev/267392851|••]] Augsburg: [[:de:Wikipedia Diskussion:Augsburg|Wikipedia Diskussion:Augsburg]] -- [[:de:user:Maimaid|Maimaid]] -- ''[[:de:Wikipedia Diskussion:Augsburg#Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116|→]]<span class="autocomment">Vorschlag für ein Treffen im Herbst 2026: Erinnerungs- und Lernort Halle 116: </span> Antwort''''' 180yj8ktrmf50iki73qyx0gf6kc6ujy Sandbox 0 119554 613813 606007 2026-05-26T10:03:01Z ~2026-31531-25 26414 613813 wikitext text/x-wiki <span style="display: none">{{subst:void|</span>{{Sandbox heading}}<!-- Do NOT edit this line --> Sandbox test: [https://example.com example] testing. --[[Special:Contributions/&#126;2026-31531-25|&#126;2026-31531-25]] ([[User talk:&#126;2026-31531-25|talk]]) 10:03, 26 May 2026 (UTC) 9rv89t1wn7kmi8ox0uc14rf47qpro7h Index:QuickCategories CI Test 106 122762 613725 605531 2026-05-25T13:15:38Z Lucas Werkmeister CI 18990 setup 613725 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} hs6plq1gfknmkxiqwanwv8g4u9xi80a 613727 613725 2026-05-25T13:15:39Z Lucas Werkmeister CI 18990 +[[Category:Added cat]]; QuickCategories CI test 613727 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} [[Category:Added cat]] fpqg662usl4hjipr7hreolf8db81j7e 613728 613727 2026-05-25T13:16:31Z Lucas Werkmeister CI 18990 setup 613728 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} hs6plq1gfknmkxiqwanwv8g4u9xi80a 613729 613728 2026-05-25T13:16:33Z Lucas Werkmeister CI 18990 +[[Category:Added cat]]; QuickCategories CI test 613729 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} [[Category:Added cat]] fpqg662usl4hjipr7hreolf8db81j7e 613731 613729 2026-05-25T13:17:31Z Lucas Werkmeister CI 18990 setup 613731 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} hs6plq1gfknmkxiqwanwv8g4u9xi80a 613733 613731 2026-05-25T13:17:32Z Lucas Werkmeister CI 18990 +[[Category:Added cat]]; QuickCategories CI test 613733 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} [[Category:Added cat]] fpqg662usl4hjipr7hreolf8db81j7e 613735 613733 2026-05-25T13:17:33Z Lucas Werkmeister CI 18990 teardown 613735 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} hs6plq1gfknmkxiqwanwv8g4u9xi80a Index:QuickCategories CI Test 1 106 122763 613737 613717 2026-05-25T13:23:18Z Lucas Werkmeister CI 18990 setup 613737 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test 1 |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} h2k7q2l6f507u3chasl4igz76x90ppi 613739 613737 2026-05-25T13:23:19Z Lucas Werkmeister CI 18990 +[[Category:Added cat]]; QuickCategories CI test 613739 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test 1 |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} [[Category:Added cat]] aezjqhj0k2e1ul20agaca2p8yz53a2s 613741 613739 2026-05-25T13:23:20Z Lucas Werkmeister CI 18990 teardown 613741 proofread-index text/x-wiki {{:MediaWiki:Proofreadpage_index_template |Type=book |Title=uickCategories CI test 1 |Language=en |Volume= |Author= |Translator= |Editor= |Illustrator= |School= |Publisher= |Address= |Year= |Key= |wikidata_item= |ISBN= |OCLC= |LCCN= |BNF_ARK= |ARC= |Source=_empty_ |Image=1 |Progress=X |Pages=<pagelist /> |Volumes= |Remarks= |Width= |Css= |Header= |Footer= }} h2k7q2l6f507u3chasl4igz76x90ppi Test 0 123104 613806 605698 2026-05-26T09:28:37Z ~2026-31321-30 26413 613806 wikitext text/x-wiki Das ist eine Testseite.. {{Test/In Arbeit||23:27, 12 July 2024 (UTC)}} == Definitionen unterschiedlicher Wissensgebiete (In Arbeit) == {{Test/In Arbeit||Zeitstempel}} Verschiedene Bereiche der [[Technik]] und [[Wirtschaft]] verwenden abweichende Definitionen. So steht Test teilweise als Synonym für die Qualitäts- oder Endprüfung, Erprobung oder [[Messung]]. Die [[Standardisierungsorganisation]]en [[ISO]] und [[International Electrotechnical Commission|IEC]] definieren den Test im Sinne einer Ermittlung.<ref name="Geiger">Walter Geiger: ''Qualitätslehre: Einführung – Systematik – Terminologie.'' 3.&nbsp;Auflage. Vieweg, Braunschweig/Wiesbaden 1998, ISBN 978-3-322-96924-8, S. 399–400 ([https://books.google.de/books?id=SdWbBgAAQBAJ&pg=PA399 Leseprobe]).</ref> Die [[DIN 1319]] verwendet hingegen die Bezeichnung [[Prüfen]], bei dem festgestellt wird, wie weit ein Prüfobjekt die Forderungen erfüllt.<ref>Marc Stephan Krützfeldt: ''Verfahren zur Analyse und zum Test von Fahrzeugdiagnosesystemen im Feld.'' Springer Vieweg, Wiesbaden 2015, ISBN 978-3-658-08862-0, S. 38 ([https://books.google.de/books?id=2SOmBgAAQBAJ&pg=PA38 Leseprobe]).</ref> Ein Teil des Test bzw. der Überprüfung kann auch ein [[Probebetrieb]] sein.<ref>Erich H. Peter Roitzsch: ''Analytische Softwarequalitätssicherung in Theorie und Praxis'', MV-Verlag, 2005, ISBN 9783865822024, S. 118 [https://books.google.de/books?id=4DtmGN61cDIC&pg=PA118]</ref> In der Technik wird ein Test häufig auch als [[Verifikation]] verstanden, d.&nbsp;h. ob sich ein Testobjekt unter möglichst realistischen Bedingungen wie erwartet verhält. Je wirklichkeitsnäher die Testbedingungen sind, desto aussagekräftiger ist der Test. Nicht immer ist es möglich, einen Test unter Realbedingungen durchzuführen, so müssen die Bedingungen möglichst realistisch [[Simulation|simuliert]] werden.<ref>Roland Felkai, Arndt Beiderwieden: ''Projektmanagement für technische Projekte: Ein prozessorientierter Leitfaden für die Praxis.'' 2.&nbsp;Auflage. Springer Vieweg, Wiesbaden 2013, ISBN 978-3-8348-2468-4, S. 182 ([https://books.google.de/books?id=cX0CAQAAQBAJ&pg=PA182&lpg=PA182 Leseprobe]).</ref> Während ein negativer Test einen Beweis für das Vorliegen von Fehlern liefert, kann die völlige [[Fehlerfreiheit]] durch einen positiven Test oft noch nicht bewiesen werden.<ref>Frank Koch: ''Handbuch Software- und Datenbank-Recht.'' Springer, Berlin/Heidelberg 2003, ISBN 978-3-642-55505-3, S. 78 ([https://books.google.de/books?id=nRLuBQAAQBAJ&pg=PA78 Leseprobe]).</ref> In der disziplinübergreifenden [[Qualitätsprüfung]] ist darunter vor allem der [[statistischer Test|statistische Test]] gemeint. Dabei wird mit [[Stichprobe]]n die Gültigkeit von Hypothesen überprüft.<ref Name="Geiger" /> In diesem Sinne wird Test z.&nbsp;B. bei technischen Produkten bzw. Prozessen,<ref>Günter Hachtel, Ulrich Holzbaur: ''Management für Ingenieure: Technisches Management für Ingenieure in Produktion und Logistik.'' Vieweg+Teubner, Wiesbaden 2010, ISBN 978-3-8348-0572-0, S. 230 ([https://books.google.de/books?id=g_P_Dtqcxk0C&pg=PA230 Leseprobe]).</ref> bei der [[Medizinische Diagnostik|medizinischen Diagnostik]]<ref>[[Johannes Köbberling]], Klaus Richter, Hans-Joachim Trampisch, [[Jürgen Windeler]]: ''Methodologie der medizinischen Diagnostik: Entwicklung, Beurteilung und Anwendung von Diagnoseverfahren in der Medizin.'' Springer-Verlag, Berlin / Heidelberg / New York 1991, ISBN 978-3-642-76149-2, S. 16 ([https://books.google.de/books?id=hN-jBwAAQBAJ&pg=PA16 Leseprobe]).</ref> oder in der [[Wissenschaft]]<ref>[[Peter Robert Hofstätter]], D. Wendt: ''Quantitative Methoden der Psychologie'', Band&nbsp;1: ''Deskriptive, Interferenz- und Korrelationsstatistik.'' 4.&nbsp;Auflage. Springer, Berlin/Heidelberg 2013, ISBN 978-3-642-47653-2, S. 4 ([https://books.google.de/books?id=T9anBgAAQBAJ&pg=PA4 Leseprobe]).</ref> verwendet. {{Anker|Diagnose}}In der [[Diagnose]] können Menschen und Tiere, aber auch Pflanzen auf [[Krankheit]]en oder deren [[Krankheitserreger|Erreger]] getestet werden, beispielsweise mit einem [[Bluttest]]. Ein positives Ergebnis im Sinn des Tests bedeutet dann, dass die vermutete Ursache bestätigt wurde, etwa indem ein Erreger, z.&nbsp;B. ein [[Viren|Virus]], nachgewiesen wurde. === Weblinks === {{Wiktionary}} {{Wiktionary|Testen}} {{Wiktionary|Testung}} == Einzelnachweise == <references /> {{Normdaten|TYP=s|GND=4367264-4|REMARK=Ansetzungsform GND: „Testen“.}} [[Kategorie:Qualitätssicherung]] [[Kategorie:Wissenschaftspraxis]] [[Kategorie:Prüftechnik]] f43k6bcrmw7sysmo0b22ezd0nfuu12c 613808 613806 2026-05-26T09:47:51Z ~2026-31321-30 26413 613808 wikitext text/x-wiki Das ist eine Testseite... {{Test/In Arbeit||23:27, 12 July 2024 (UTC)}} == Definitionen unterschiedlicher Wissensgebiete (In Arbeit) == {{Test/In Arbeit||Zeitstempel}} Verschiedene Bereiche der [[Technik]] und [[Wirtschaft]] verwenden abweichende Definitionen. So steht Test teilweise als Synonym für die Qualitäts- oder Endprüfung, Erprobung oder [[Messung]]. Die [[Standardisierungsorganisation]]en [[ISO]] und [[International Electrotechnical Commission|IEC]] definieren den Test im Sinne einer Ermittlung.<ref name="Geiger">Walter Geiger: ''Qualitätslehre: Einführung – Systematik – Terminologie.'' 3.&nbsp;Auflage. Vieweg, Braunschweig/Wiesbaden 1998, ISBN 978-3-322-96924-8, S. 399–400 ([https://books.google.de/books?id=SdWbBgAAQBAJ&pg=PA399 Leseprobe]).</ref> Die [[DIN 1319]] verwendet hingegen die Bezeichnung [[Prüfen]], bei dem festgestellt wird, wie weit ein Prüfobjekt die Forderungen erfüllt.<ref>Marc Stephan Krützfeldt: ''Verfahren zur Analyse und zum Test von Fahrzeugdiagnosesystemen im Feld.'' Springer Vieweg, Wiesbaden 2015, ISBN 978-3-658-08862-0, S. 38 ([https://books.google.de/books?id=2SOmBgAAQBAJ&pg=PA38 Leseprobe]).</ref> Ein Teil des Test bzw. der Überprüfung kann auch ein [[Probebetrieb]] sein.<ref>Erich H. Peter Roitzsch: ''Analytische Softwarequalitätssicherung in Theorie und Praxis'', MV-Verlag, 2005, ISBN 9783865822024, S. 118 [https://books.google.de/books?id=4DtmGN61cDIC&pg=PA118]</ref> In der Technik wird ein Test häufig auch als [[Verifikation]] verstanden, d.&nbsp;h. ob sich ein Testobjekt unter möglichst realistischen Bedingungen wie erwartet verhält. Je wirklichkeitsnäher die Testbedingungen sind, desto aussagekräftiger ist der Test. Nicht immer ist es möglich, einen Test unter Realbedingungen durchzuführen, so müssen die Bedingungen möglichst realistisch [[Simulation|simuliert]] werden.<ref>Roland Felkai, Arndt Beiderwieden: ''Projektmanagement für technische Projekte: Ein prozessorientierter Leitfaden für die Praxis.'' 2.&nbsp;Auflage. Springer Vieweg, Wiesbaden 2013, ISBN 978-3-8348-2468-4, S. 182 ([https://books.google.de/books?id=cX0CAQAAQBAJ&pg=PA182&lpg=PA182 Leseprobe]).</ref> Während ein negativer Test einen Beweis für das Vorliegen von Fehlern liefert, kann die völlige [[Fehlerfreiheit]] durch einen positiven Test oft noch nicht bewiesen werden.<ref>Frank Koch: ''Handbuch Software- und Datenbank-Recht.'' Springer, Berlin/Heidelberg 2003, ISBN 978-3-642-55505-3, S. 78 ([https://books.google.de/books?id=nRLuBQAAQBAJ&pg=PA78 Leseprobe]).</ref> In der disziplinübergreifenden [[Qualitätsprüfung]] ist darunter vor allem der [[statistischer Test|statistische Test]] gemeint. Dabei wird mit [[Stichprobe]]n die Gültigkeit von Hypothesen überprüft.<ref Name="Geiger" /> In diesem Sinne wird Test z.&nbsp;B. bei technischen Produkten bzw. Prozessen,<ref>Günter Hachtel, Ulrich Holzbaur: ''Management für Ingenieure: Technisches Management für Ingenieure in Produktion und Logistik.'' Vieweg+Teubner, Wiesbaden 2010, ISBN 978-3-8348-0572-0, S. 230 ([https://books.google.de/books?id=g_P_Dtqcxk0C&pg=PA230 Leseprobe]).</ref> bei der [[Medizinische Diagnostik|medizinischen Diagnostik]]<ref>[[Johannes Köbberling]], Klaus Richter, Hans-Joachim Trampisch, [[Jürgen Windeler]]: ''Methodologie der medizinischen Diagnostik: Entwicklung, Beurteilung und Anwendung von Diagnoseverfahren in der Medizin.'' Springer-Verlag, Berlin / Heidelberg / New York 1991, ISBN 978-3-642-76149-2, S. 16 ([https://books.google.de/books?id=hN-jBwAAQBAJ&pg=PA16 Leseprobe]).</ref> oder in der [[Wissenschaft]]<ref>[[Peter Robert Hofstätter]], D. Wendt: ''Quantitative Methoden der Psychologie'', Band&nbsp;1: ''Deskriptive, Interferenz- und Korrelationsstatistik.'' 4.&nbsp;Auflage. Springer, Berlin/Heidelberg 2013, ISBN 978-3-642-47653-2, S. 4 ([https://books.google.de/books?id=T9anBgAAQBAJ&pg=PA4 Leseprobe]).</ref> verwendet. {{Anker|Diagnose}}In der [[Diagnose]] können Menschen und Tiere, aber auch Pflanzen auf [[Krankheit]]en oder deren [[Krankheitserreger|Erreger]] getestet werden, beispielsweise mit einem [[Bluttest]]. Ein positives Ergebnis im Sinn des Tests bedeutet dann, dass die vermutete Ursache bestätigt wurde, etwa indem ein Erreger, z.&nbsp;B. ein [[Viren|Virus]], nachgewiesen wurde. === Weblinks === {{Wiktionary}} {{Wiktionary|Testen}} {{Wiktionary|Testung}} == Einzelnachweise == <references /> {{Normdaten|TYP=s|GND=4367264-4|REMARK=Ansetzungsform GND: „Testen“.}} [[Kategorie:Qualitätssicherung]] [[Kategorie:Wissenschaftspraxis]] [[Kategorie:Prüftechnik]] 83u27hdmhv82ckcz2y8xu44ntkq9ods 613815 613808 2026-05-26T10:06:28Z ~2026-31321-30 26413 613815 wikitext text/x-wiki Das ist eine Testseite.... {{Test/In Arbeit||23:27, 12 July 2024 (UTC)}} == Definitionen unterschiedlicher Wissensgebiete (In Arbeit) == {{Test/In Arbeit||Zeitstempel}} Verschiedene Bereiche der [[Technik]] und [[Wirtschaft]] verwenden abweichende Definitionen. So steht Test teilweise als Synonym für die Qualitäts- oder Endprüfung, Erprobung oder [[Messung]]. Die [[Standardisierungsorganisation]]en [[ISO]] und [[International Electrotechnical Commission|IEC]] definieren den Test im Sinne einer Ermittlung.<ref name="Geiger">Walter Geiger: ''Qualitätslehre: Einführung – Systematik – Terminologie.'' 3.&nbsp;Auflage. Vieweg, Braunschweig/Wiesbaden 1998, ISBN 978-3-322-96924-8, S. 399–400 ([https://books.google.de/books?id=SdWbBgAAQBAJ&pg=PA399 Leseprobe]).</ref> Die [[DIN 1319]] verwendet hingegen die Bezeichnung [[Prüfen]], bei dem festgestellt wird, wie weit ein Prüfobjekt die Forderungen erfüllt.<ref>Marc Stephan Krützfeldt: ''Verfahren zur Analyse und zum Test von Fahrzeugdiagnosesystemen im Feld.'' Springer Vieweg, Wiesbaden 2015, ISBN 978-3-658-08862-0, S. 38 ([https://books.google.de/books?id=2SOmBgAAQBAJ&pg=PA38 Leseprobe]).</ref> Ein Teil des Test bzw. der Überprüfung kann auch ein [[Probebetrieb]] sein.<ref>Erich H. Peter Roitzsch: ''Analytische Softwarequalitätssicherung in Theorie und Praxis'', MV-Verlag, 2005, ISBN 9783865822024, S. 118 [https://books.google.de/books?id=4DtmGN61cDIC&pg=PA118]</ref> In der Technik wird ein Test häufig auch als [[Verifikation]] verstanden, d.&nbsp;h. ob sich ein Testobjekt unter möglichst realistischen Bedingungen wie erwartet verhält. Je wirklichkeitsnäher die Testbedingungen sind, desto aussagekräftiger ist der Test. Nicht immer ist es möglich, einen Test unter Realbedingungen durchzuführen, so müssen die Bedingungen möglichst realistisch [[Simulation|simuliert]] werden.<ref>Roland Felkai, Arndt Beiderwieden: ''Projektmanagement für technische Projekte: Ein prozessorientierter Leitfaden für die Praxis.'' 2.&nbsp;Auflage. Springer Vieweg, Wiesbaden 2013, ISBN 978-3-8348-2468-4, S. 182 ([https://books.google.de/books?id=cX0CAQAAQBAJ&pg=PA182&lpg=PA182 Leseprobe]).</ref> Während ein negativer Test einen Beweis für das Vorliegen von Fehlern liefert, kann die völlige [[Fehlerfreiheit]] durch einen positiven Test oft noch nicht bewiesen werden.<ref>Frank Koch: ''Handbuch Software- und Datenbank-Recht.'' Springer, Berlin/Heidelberg 2003, ISBN 978-3-642-55505-3, S. 78 ([https://books.google.de/books?id=nRLuBQAAQBAJ&pg=PA78 Leseprobe]).</ref> In der disziplinübergreifenden [[Qualitätsprüfung]] ist darunter vor allem der [[statistischer Test|statistische Test]] gemeint. Dabei wird mit [[Stichprobe]]n die Gültigkeit von Hypothesen überprüft.<ref Name="Geiger" /> In diesem Sinne wird Test z.&nbsp;B. bei technischen Produkten bzw. Prozessen,<ref>Günter Hachtel, Ulrich Holzbaur: ''Management für Ingenieure: Technisches Management für Ingenieure in Produktion und Logistik.'' Vieweg+Teubner, Wiesbaden 2010, ISBN 978-3-8348-0572-0, S. 230 ([https://books.google.de/books?id=g_P_Dtqcxk0C&pg=PA230 Leseprobe]).</ref> bei der [[Medizinische Diagnostik|medizinischen Diagnostik]]<ref>[[Johannes Köbberling]], Klaus Richter, Hans-Joachim Trampisch, [[Jürgen Windeler]]: ''Methodologie der medizinischen Diagnostik: Entwicklung, Beurteilung und Anwendung von Diagnoseverfahren in der Medizin.'' Springer-Verlag, Berlin / Heidelberg / New York 1991, ISBN 978-3-642-76149-2, S. 16 ([https://books.google.de/books?id=hN-jBwAAQBAJ&pg=PA16 Leseprobe]).</ref> oder in der [[Wissenschaft]]<ref>[[Peter Robert Hofstätter]], D. Wendt: ''Quantitative Methoden der Psychologie'', Band&nbsp;1: ''Deskriptive, Interferenz- und Korrelationsstatistik.'' 4.&nbsp;Auflage. Springer, Berlin/Heidelberg 2013, ISBN 978-3-642-47653-2, S. 4 ([https://books.google.de/books?id=T9anBgAAQBAJ&pg=PA4 Leseprobe]).</ref> verwendet. {{Anker|Diagnose}}In der [[Diagnose]] können Menschen und Tiere, aber auch Pflanzen auf [[Krankheit]]en oder deren [[Krankheitserreger|Erreger]] getestet werden, beispielsweise mit einem [[Bluttest]]. Ein positives Ergebnis im Sinn des Tests bedeutet dann, dass die vermutete Ursache bestätigt wurde, etwa indem ein Erreger, z.&nbsp;B. ein [[Viren|Virus]], nachgewiesen wurde. === Weblinks === {{Wiktionary}} {{Wiktionary|Testen}} {{Wiktionary|Testung}} == Einzelnachweise == <references /> {{Normdaten|TYP=s|GND=4367264-4|REMARK=Ansetzungsform GND: „Testen“.}} [[Kategorie:Qualitätssicherung]] [[Kategorie:Wissenschaftspraxis]] [[Kategorie:Prüftechnik]] e34o7exujdld62g4fou8j3opryhvj8s User:LuniZunie/scripts/WikiShield.js 2 124099 613751 608897 2026-05-25T17:02:05Z LuniZunie 25284 welp, lets test it 613751 javascript text/javascript !function(){"use strict";var e={4279(e){e.exports="@import url('https://fonts.googleapis.com/css2?family=Varela+Round&display=swap');\r\n\r\n:root {\r\n\t--max-z-index: 2147483647;\r\n\r\n --body-color: rgba(241, 245, 255, 1);\r\n --body-background: rgba(20, 20, 30, 1);\r\n\r\n font-family: 'Inter', sans-serif;\r\n \tfont-optical-sizing: auto;\r\n -webkit-font-smoothing: antialiased;\r\n\t-moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n* {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n::-webkit-scrollbar {\r\n\twidth: 10px;\r\n\theight: 10px;\r\n}\r\n\r\n::-webkit-scrollbar-track {\r\n\tbackground: transparent;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n\tborder: 2px solid transparent;\r\n border-radius: 10px;\r\n\r\n\t/* Theme dependent */\r\n\tbackground: rgba(255, 255, 255, .1);\r\n\tbackground-clip: content-box;\r\n\r\n\t&:hover {\r\n\t\tborder: 2px solid transparent;\r\n\t\tborder-radius: 10px;\r\n\r\n\t\t/* Theme dependent */\r\n\t\tbackground: rgba(255, 255, 255, .2);\r\n\t\tbackground-clip: content-box;\r\n\t}\r\n}\r\n\r\nhtml, body {\r\n width: 100%;\r\n\theight: 100%;\r\n\r\n\toverflow: hidden;\r\n\r\n /* Theme dependent */\r\n background: linear-gradient(135deg,\r\n\t\trgba(20, 30, 48, 1),\r\n\t\trgba(36, 59, 85, 1)\r\n\t);\r\n}\r\n\r\n@keyframes loading-dots {\r\n\t0%, 100% {\r\n\t\tcontent: '';\r\n\t}\r\n\t25% {\r\n\t\tcontent: '.';\r\n\t}\r\n\t50% {\r\n\t\tcontent: '..';\r\n\t}\r\n\t75% {\r\n\t\tcontent: '...';\r\n\t}\r\n}\r\n\r\n.animate-loading-dots::after {\r\n\tcontent: '';\r\n\r\n\tdisplay: inline-block;\r\n\r\n\tanimation: loading-dots 1.5s steps(3, start) infinite;\r\n}\r\n\r\n.auto-scroll {\r\n white-space: nowrap;\r\n overflow: auto hidden;\r\n\r\n scrollbar-width: none;\r\n -ms-overflow-style: none;\r\n\r\n\t&::-webkit-scrollbar { display: none; }\r\n\r\n & > .auto-scroll-item {\r\n display: inline-block;\r\n\r\n\t\t&:not(:last-child) {\r\n\t\t\tmargin-right: 20px;\r\n\t\t}\r\n }\r\n &:not(:has(> .auto-scroll-item)) {\r\n opacity: 0;\r\n }\r\n}"},5540(e){e.exports='<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <meta http-equiv="Content-Security-Policy">\n\n <title>WikiShield</title>\n\n <link rel="stylesheet" href="https://fonts.cdnfonts.com/css/open-dyslexic">\n <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.0/css/all.min.css">\n\n <link rel="stylesheet" href="../common/style.css">\n <link rel="stylesheet" href="style.css">\n\n <script type="module" src="script.js"><\/script>\n </head>\n <body>\n <div id="loading">\n <img class="icon" src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n </div>\n <div id="initial" class="hidden">\n\t\t\t<canvas id="dots-canvas"></canvas>\n\t\t\t<div id="welcome-container" class="shimmer shimmer-border">\n\t\t\t\t<div class="shield-container">\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="shield-icon">\n\t\t\t\t\t\t<img src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<h1>Welcome to <span id="wikishield-sikiwhield">WikiShield</span></h1>\n\t\t\t\t<div class="about-links">\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="about-link">About</a>\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia talk:WikiShield" target="_blank" class="about-link">Discuss</a>\n\t\t\t\t\t<span class="about-link">v<span class="VERSION"></span></span>\n\t\t\t\t</div>\n\t\t\t\t<div id="rollback-needed" class="hidden">\n\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<p>You can apply for rollback rights <a rel="noopener" class="request-link" href="https://www.wikidata.org/wiki/Q7765871" target="_blank">here</a>.</p>\n\t\t\t\t</div>\n\t\t\t\t<button type="button" id="start-button">\n\t\t\t\t\tStart WikiShield <i class="fas fa-arrow-right"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n <div id="app" class="hidden">\n <div id="container">\n <div id="queue">\n <div id="queue-top">\n <div id="queue-top-left" class="queue-button-cluster" data-zen-show="alerts,messages">\n <span class="fa fa-bell" id="alerts-icon" data-tooltip="Alerts" data-zen-show="alerts">\n <span id="alerts-count" class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n <span class="fa fa-inbox" id="messages-icon" data-tooltip="Messages" data-zen-show="messages">\n <span id="messages-count" class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="DEFCON">\n <div class="dot"></div>\n <span><span class="DEFCON-RPM">0</span> RPM</span>\n </div>\n <div id="queue-top-right" class="queue-button-cluster">\n <span class="fa fa-envelope" id="email-button" data-tooltip="Email Emergency, ArbCom, or Oversight" data-multiple-hrefs="email" href></span>\n <span class="fa fa-gear" id="settings-icon" data-tooltip="Settings"></span>\n </div>\n </div>\n <div id="queue-tabs">\n <div id="queue-tab-recent" class="queue-tab selected" data-tooltip="Recent edits">\n <span class="fas fa-stopwatch">\n <span class="icon-count hidden gray" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-pending" class="queue-tab" data-tooltip="Pending edits">\n <span class="fas fa-flag">\n <span class="icon-count hidden orange" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-users" class="queue-tab" data-tooltip="User creation logs">\n <span class="fas fa-user">\n <span class="icon-count hidden green" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-watchlist" class="queue-tab" data-tooltip="Watchlist edits">\n <span class="fas fa-book-bookmark">\n <span class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-abuselog" class="queue-tab" data-tooltip="Abuse logs">\n <span class="fas fa-filter-circle-xmark">\n <span class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n </div>\n </div>\n <div id="queue-items" class="queue-list">\n <div class="queue-empty">\n No edits in queue.\n </div>\n </div>\n <div class="width-adjust" id="queue-width-adjust"></div>\n <div id="clear-queue">\n <span class="fa fa-trash"></span>\n </div>\n </div>\n <div id="alerts-panel" class="notification-panel">\n <div id="alerts-header" class="notification-header">\n <span>Alerts</span>\n <span id="mark-all-alerts-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="alerts-list" class="notification-list"></div>\n </div>\n <div id="messages-panel" class="notification-panel">\n <div id="messages-header" class="notification-header">\n <span>Messages</span>\n <span id="mark-all-messages-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="messages-list" class="notification-list"></div>\n </div>\n <div id="right-container">\n <div id="right-content">\n <div id="main-container">\n <div id="edit-details">\n <div class="central">Nothing selected</div>\n </div>\n <div id="previous-item-button" class="nav-item-button">\n <i class="fas fa-chevron-left"></i>\n </div>\n <div id="next-item-button" class="nav-item-button">\n <i class="fas fa-chevron-right"></i>\n </div>\n <div id="ai-analysis-container" class="hidden shimmer shimmer-border">\n <div class="header">\n <i class="fas fa-robot"></i>\n <span class="title">AI Analysis</span>\n <span class="assessment"></span>\n <span class="confidence"></span>\n </div>\n <div class="explanation"></div>\n <div class="issues"></div>\n </div>\n <div id="diff-scroll-up" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-up"></i>\n </div>\n <div id="diff-container"></div>\n <div id="diff-scroll-down" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-down"></i>\n </div>\n <div id="pending-changes-container" class="hidden">\n <div class="accept">Accept</div>\n <div class="reject">Reject</div>\n </div>\n <div id="progress-bar-container"></div>\n <div id="bottom-tools" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-item" data-menu="revert" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-undo"></i>\n <span>Revert</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="warn" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-exclamation-triangle"></i>\n <span>Warn</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="user" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-user"></i>\n <span>User</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="page" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-file-lines"></i>\n <span>Page</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="edit" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-pen-to-square"></i>\n <span>Edit</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n </div>\n <div id="copy-link" data-tooltip="Copy link" data-queue-type="edit,logevent,abuselog">\n <div>\n <i class="fas fa-link"></i>\n </div>\n </div>\n </div>\n <div id="right-details">\n <div id="right-top">\n <div class="tabs">\n <div id="latest-edits-tab" class="tab hidden selected" data-tooltip="Latest edit">\n <i class="fas fa-user"></i>\n </div>\n <div id="consecutive-edits-tab" class="tab hidden" data-tooltip="Consecutive edits">\n <i class="fas fa-users"></i>\n </div>\n </div>\n\n <div class="icons"></div>\n </div>\n\n <div id="user-contributions" class="section" data-queue-type="edit,logevent,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-user-contributions" class="fas fa-rotate"></i> Contributions</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View all contributions</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div id="page-history" class="section" data-queue-type="edit,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-page-history" class="fas fa-rotate"></i> Page History</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View full page history</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div class="width-adjust" id="details-width-adjust"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="bottom-tool-menu" id="revert-menu"></div>\n <div class="bottom-tool-menu" id="warn-menu"></div>\n <div class="bottom-tool-menu" id="user-menu">\n <div id="user-open-user-page" class="menu-option">\n <i class="fas fa-user-circle"></i>\n <span>Open user page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-open-user-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open user talk</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-contribs" class="menu-option">\n <i class="fas fa-list"></i>\n <span>View contributions</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-filter-log" class="menu-option">\n <i class="fas fa-filter"></i>\n <span>View filter log</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="user-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist user</span>\n </div>\n <div id="user-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist user</span>\n </div>\n <div id="user-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight user</span>\n </div>\n <div id="user-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight user</span>\n </div>\n <div class="menu-divider"></div>\n <div id="user-welcome" class="menu-option submenu-trigger">\n <i class="fas fa-paper-plane"></i>\n <span>Welcome</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-aiv" class="menu-option submenu-trigger">\n <i class="fas fa-flag"></i>\n <span>Report (AIV)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-uaa" class="menu-option submenu-trigger">\n <i class="fas fa-user-slash"></i>\n <span>Report (UAA)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-request-global-block" class="menu-option submenu-trigger">\n <i class="fas fa-ban"></i>\n <span>Request global block</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-request-global-lock" class="menu-option submenu-trigger">\n <i class="fas fa-lock"></i>\n <span>Request global lock</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>Message user</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="page-menu">\n <div id="page-open-page" class="menu-option">\n <i class="fas fa-file"></i>\n <span>Open page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-open-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open talk page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-view-history" class="menu-option">\n <i class="fas fa-clock-rotate-left"></i>\n <span>View page history</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="page-watch" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>Watch page</span>\n </div>\n <div id="page-unwatch" class="menu-option">\n <i class="fas fa-eye-slash"></i>\n <span>Unwatch page</span>\n </div>\n <div id="page-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist page</span>\n </div>\n <div id="page-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist page</span>\n </div>\n <div id="page-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight page</span>\n </div>\n <div id="page-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight page</span>\n </div>\n <div class="menu-divider"></div>\n <div id="page-request-protection" class="menu-option submenu-trigger">\n <i class="fas fa-shield-halved"></i>\n <span>Request protection</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="page-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>New talk page topic</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="edit-menu">\n <div id="edit-view-revision" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>View revision</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="edit-view-diff" class="menu-option">\n <i class="fas fa-code-compare"></i>\n <span>View diff</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="edit-thank-user" class="menu-option">\n <i class="fas fa-heart"></i>\n <span>Thank user</span>\n </div>\n <div id="edit-rollback" class="menu-option submenu-trigger">\n <i class="fas fa-rotate-left"></i>\n <span>Rollback</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-rollback-goodfaith" class="menu-option submenu-trigger">\n <i class="fas fa-handshake"></i>\n <span>Rollback (good faith)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-undo" class="menu-option submenu-trigger">\n <i class="fas fa-arrow-rotate-left"></i>\n <span>Undo</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n\n <div id="settings-container">\n <div class="settings">\n <div class="settings-left">\n <div class="settings-category">\n <div class="settings-category-header">\n <span>CORE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-general-button">\n <span><i class="fas fa-gear"></i>General</span>\n </div>\n <div class="settings-left-menu-item" id="settings-audio-button">\n <span><i class="fas fa-volume-high"></i>Audio</span>\n </div>\n <div class="settings-left-menu-item" id="settings-controls-button">\n <span><i class="fas fa-keyboard"></i>Controls</span>\n </div>\n <div class="settings-left-menu-item" id="settings-zen-button">\n <span><i class="fas fa-spa"></i>Zen Mode</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>APPEARANCE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-app-button">\n <span><i class="fas fa-palette"></i>App</span>\n </div>\n <div class="settings-left-menu-item" id="settings-queue-button">\n <span><i class="fas fa-list"></i>Queue</span>\n </div>\n <div class="settings-left-menu-item" id="settings-accessibility-button">\n <span><i class="fas fa-universal-access"></i>Accessibility</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>TOOLS</span>\n </div>\n <div class="settings-left-menu-item" id="settings-auto-reporting-button">\n <span><i class="fas fa-flag"></i>Auto Reporting</span>\n </div>\n <div class="settings-left-menu-item" id="settings-gadgets-button">\n <span><i class="fas fa-toolbox"></i>Gadgets</span>\n </div>\n <div class="settings-left-menu-item" id="settings-AI-button">\n <span><i class="fas fa-robot"></i>AI Analysis</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WHITELIST</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-whitelist-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>HIGHLIGHT</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-highlight-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>DATA</span>\n </div>\n <div class="settings-left-menu-item" id="settings-statistics-button">\n <span><i class="fas fa-chart-area"></i>Statistics</span>\n </div>\n <div class="settings-left-menu-item" id="settings-save-button">\n <span><i class="fas fa-floppy-disk"></i>Save</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WIKISHIELD</span>\n </div>\n <div class="settings-left-menu-item" id="settings-changelog-button">\n <span><i class="fas fa-file-alt"></i>Changelog</span>\n </div>\n <div class="settings-left-menu-item" id="settings-about-button">\n <span><i class="fas fa-info"></i>About</span>\n </div>\n </div>\n </div>\n <div class="settings-right">\n <div class="general hidden">\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum edit count</div>\n <div class="settings-section-desc">Edits from users with more than this number of total edits will not be shown unless that user is highlighted.</div>\n <numeric-input id="settings-maximum-edit-count" step="5" min="0" value="50"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum queue size</div>\n <div class="settings-section-desc">Maximum number of edits to keep in the queue for review. Higher values may impact performance.</div>\n <numeric-input id="settings-maximum-queue-size" step="10" min="0" value="100"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Minimum ORES score</div>\n <div class="settings-section-desc">Minimum ORES score required for an edit to appear in the recent changes queue.</div>\n <numeric-input id="settings-minimum-ores-score" step="0.05" min="0" max="1" value="0"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">ORES bias</div>\n <div class="settings-section-desc">\n Select how ORES scores are calculated for edits in the recent changes queue. "Badfaith" is how likely an edit is to be made in bad faith, "Damaging" is how likely an edit is to be damaging.\n </div>\n <div id="settings-ores-bias" class="settings-slider">\n <div class="settings-slider-labels">\n <div class="settings-slider-label-left active">Badfaith<span class="percent">50%</span></div>\n <div class="settings-slider-label-right active">Damaging<span class="percent">50%</span></div>\n </div>\n <div class="settings-slider-track">\n <div class="settings-slider-thumb"></div>\n </div>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Watchlist expiry</div>\n <div class="settings-section-desc">Amount of time to leave warned user\'s talk pages on your watchlist.</div>\n <duration-input id="settings-watchlist-expiry"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Namespaces to monitor</div>\n <div class="settings-section-desc">Select which namespaces WikiShield should monitor for recent changes and pending changes.</div>\n <div id="settings-namespaces-container" class="checkbox-container">\n \x3c!-- Namespace checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="audio hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">ORES</span>\n <span>ORES Alerts</span>\n </div>\n <div class="settings-section compact inline" id="sound-alert-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Sound alerts for high ORES scores</div>\n <div class="settings-section-desc">Play a sound when an edit above the threshold is added to the queue</div>\n </div>\n <toggle-input id="settings-ORES-alert-toggle" value="false"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="sound-alert-ores-score">\n <div class="settings-section-content">\n <div class="settings-section-title">ORES score threshold</div>\n <div class="settings-section-desc">Play a sound alert when an edit with an ORES score above this value is added</div>\n </div>\n <numeric-input id="settings-ORES-alert-threshold" step="0.05" min="0" max="1" value="0.9"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Volume</div>\n <volume-control\n id="settings-master-volume"\n title="Master Volume"\n description="Controls the overall volume of all sounds"\n value="1"\n ></volume-control>\n <div id="settings-sounds-container" class="settings-section">\n \x3c!-- Individual sound settings will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="controls hidden">\n <div class="settings-section">\n <div class="settings-section-title">Keyboard shortcuts</div>\n <div class="settings-section-desc">Customize keyboard shortcuts for various actions in WikiShield.</div>\n <div class="settings-section compact inline" id="repeat-control-scripts">\n <div class="settings-section-content">\n <div class="settings-section-title">Repeat control scripts</div>\n <div class="settings-section-desc">Allow control scripts to be triggered repeatedly when holding down keys</div>\n </div>\n <toggle-input id="repeat-control-scripts-toggle" value="true"></toggle-input>\n </div>\n <button type="button" id="settings-new-control-script" class="add-action-button new-control-script"><span class="fa fa-plus"></span> Add new action</button>\n </div>\n </div>\n <div class="zen hidden">\n <div class="settings-section">\n <div class="settings-section-title">Zen Mode</div>\n <div class="settings-section-desc">Your distraction-free editing experience.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Zen Mode</div>\n <div class="settings-section-desc">Reduce on-screen distractions while reviewing edits.</div>\n </div>\n <toggle-input id="settings-zen-mode" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Customize Zen Mode</div>\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Sound</div>\n <div class="settings-section-desc">Play sound in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-sound" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Music</div>\n <div class="settings-section-desc">Play background music in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-music" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Alerts</div>\n <div class="settings-section-desc">Show alerts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-alerts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Messages</div>\n <div class="settings-section-desc">Show messages in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-messages" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Toasts</div>\n <div class="settings-section-desc">Show toasts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-toasts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Badges</div>\n <div class="settings-section-desc">Show badges in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-badges" value="true"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="app hidden">\n <div class="settings-section" data-electron="false">\n <div class="settings-section-title">Launch behavior</div>\n <div class="settings-section-desc">Choose whether WikiShield should open inthe current tabor a new tab when launched.</div>\n <div id="settings-launch-behavior" class="settings-radio-group">\n <div class="settings-radio-option selected" data-value="current_tab">Open in current tab</div>\n <div class="settings-radio-option" data-value="new_tab">Open in new tab</div>\n </div>\n </div>\n \x3c!-- <div class="settings-section">\n <div class="settings-section-title">App theme</div>\n <div class="settings-section-desc">Choose between light mode, dark mode, or automatic switching based on system settings.</div>\n <div id="settings-app-theme" class="settings-radio-group">\n <div class="settings-radio-option" data-value="light">Light mode</div>\n <div class="settings-radio-option selected" data-value="auto">Auto</div>\n <div class="settings-radio-option" data-value="dark">Dark mode</div>\n </div>\n </div> --\x3e\n <div class="settings-section">\n <div class="settings-section-title">Startup animation</div>\n <div class="settings-section-desc">Enable or disable the startup animation when launching WikiShield.</div>\n <div id="settings-startup-performance" class="settings-radio-group">\n <div class="settings-radio-option" data-value="always_off">Always off</div>\n <div class="settings-radio-option selected" data-value="adaptive">Adaptive (recommended)</div>\n <div class="settings-radio-option" data-value="always_on">Always on</div>\n </div>\n </div>\n </div>\n <div class="queue hidden">\n <div class="settings-section">\n <div class="settings-section-title">Queues</div>\n <div class="settings-section-desc">Enable or disable different edit queues, and customize their order.</div>\n <draggable-order-list id="settings-queues">\n \x3c!-- Queue items will be populated here --\x3e\n </draggable-order-list>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Color palette</div>\n <div class="settings-section-desc">Select the color palette used for highlighting users and pages.</div>\n <div id="settings-palette-selector" class="palette-selector">\n\n </div>\n </div>\n </div>\n <div class="accessibility hidden">\n <div class="settings-section">\n <div class="settings-section-title">Accessibility Options</div>\n <div class="settings-section-desc">Customize accessibility features for better usability.</div>\n <div class="settings-compact-grid">\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">Colorblind Mode</div>\n <div class="settings-section-desc">Add indicators to help distinguish colors for colorblind users.</div>\n <toggle-input id="settings-colorblind-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Dyslexia Friendly Font</div>\n <div class="settings-section-desc">Use a font that is easier to read for users with dyslexia.</div>\n <toggle-input id="settings-dyslexia-font" value="false"></toggle-input>\n </div>\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">High Contrast Mode</div>\n <div class="settings-section-desc">Increase contrast for better visibility.</div>\n <toggle-input id="settings-high-contrast-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Reduce Motion</div>\n <div class="settings-section-desc">Minimize motion effects for users sensitive to motion.</div>\n <toggle-input id="settings-reduce-motion" value="false"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="auto-reporting hidden">\n <div class="settings-section">\n <div class="settings-section-title">Enable Auto Reporting</div>\n <div class="settings-section-desc">Automatically report edits that receive certain warnings.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Auto Reporting</div>\n <div class="settings-section-desc">When enabled, edits that trigger selected warnings will be automatically reported.</div>\n </div>\n <toggle-input id="settings-auto-reporting-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Auto Reporting Warnings</div>\n <div class="settings-section-desc">Select which warnings should trigger automatic reporting.</div>\n <div id="settings-auto-reporting-warnings-container" class="checkbox-container">\n \x3c!-- Warning checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="gadgets hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-title">Gadgets</div>\n <div class="settings-section-desc">Toggle various Wikishield features.</div>\n <div class="settings-section compact inline" id="auto-welcome-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Automatic welcoming of new users</div>\n <div class="settings-section-desc">Automatically welcome new users with empty talk pages when moving past their constructive edits</div>\n </div>\n <toggle-input id="settings-auto-welcome-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="wikipedia-popups-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Popups</div>\n <div class="settings-section-desc">When enabled, links will be opened in a new window. Otherwise, they will be opened in your default browser. (Not supported by Opera or Safari browsers)</div>\n </div>\n <toggle-input id="settings-wikipedia-popups-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="talk-page-thanks-for-temporary-users-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Send talk page thanks for temporary users</div>\n <div class="settings-section-desc">If enabled, when you thank a temporary user with an empty talk page, WikiShield will send them a welcoming thank you message in addition to the standard thank you message.</div>\n </div>\n <toggle-input id="settings-edit-summaries-toggle" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Username Highlighting</div>\n <div class="settings-section compact inline" id="username-highlighting-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable username highlighting</div>\n <div class="settings-section-desc">Highlights usernames in edit summaries, edit diffs, and user creation logs.</div>\n </div>\n <toggle-input id="settings-username-highlighting-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="username-highlighting-mode-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Toggle fuzzy matching mode</div>\n <div class="settings-section-desc">\n When enabled, highlights similar usernames. Not recommended for users with short usernames.<br/>\n <strong>NOTE:</strong> This may cause performance issues for those with long usernames, or users on weaker devices.\n </div>\n </div>\n <toggle-input id="settings-username-highlighting-fuzzy-toggle" value="false"></toggle-input>\n </div>\n </div>\n </div>\n <div class="AI hidden">\n <div class="settings-section">\n <div class="settings-section-title">AI Analysis</div>\n <div class="settings-section-desc">Configure AI-powered analysis features.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Ollama AI Analysis &lpar;<a href="https://ollama.com">ollama.com</a>&rpar;</div>\n <div class="settings-section-desc">Use local AI models with complete privacy.</div>\n </div>\n <toggle-input id="settings-AI-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">Tools</span>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Edit Analysis</div>\n <div class="settings-section-desc">Suggests actions to take on edits.</div>\n </div>\n <toggle-input id="settings-AI-edit-analysis-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Username Analysis</div>\n <div class="settings-section-desc">Flags potentially problematic usernames and prompts you to report them to UAA</div>\n </div>\n <toggle-input id="settings-AI-username-analysis-toggle" value="true"></toggle-input>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-server-url">\n <div class="settings-section-title">Server URL</div>\n <div class="settings-section-desc">The URL of your local Ollama server</div>\n <div class="text-input-container">\n <input title="Ollama URL" type="text" id="ollama-url-input" autoComplete="off">\n <button type="button" id="settings-ollama-test-connection">Test Connection</button>\n </div>\n <div class="settings-section compact connection-status-container">\n <p id="settings-ollama-connection-status"></p>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-model-select">\n <div class="settings-section-title">\n Model Selection\n <button type="button" id="settings-ollama-refresh-models">\n <span class="fa fa-sync"></span> Refresh Models\n </button>\n </div>\n <div class="settings-section-desc">Select which Ollama model to use for edit analysis</div>\n <div class="settings-section compact models-container">\n <p id="settings-ollama-models-status">Click "Refresh Models" to load available models</p>\n <div id="settings-ollama-models"></div>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-setup">\n <div class="settings-section-title">Setup required</div>\n <div class="settings-section-desc">\n <details>\n <summary><strong>Windows (Permanent)</strong></summary>\n <ol class="pad-list">\n <li>Press <code>Win + R</code>, type <code>sysdm.cpl</code>, and press Enter</li>\n <li>Go to the "Advanced" tab and click on "Environment Variables"</li>\n <li>Create a new variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_HOST</code> and the value to <code>http://127.0.0.11434</code>\n <ul class="pad-list">\n <li><strong>NOTE:</strong> You can change the port (11434) if that port is already in use, but make sure to update the "Server URL" setting in WikiShield accordingly</li>\n </ul>\n </li>\n <li>Click "OK" to save the variable</li>\n <li>Create another variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_ORIGINS</code> and the value to <code>https://*.wikipedia.org</code></li>\n <li>Click "OK" to save the variable, you can now close the Environment Variables and System Properties windows</li>\n <li>Restart Ollama</li>\n </ol>\n </details>\n\n <details>\n <summary><strong>Windows (Temporary)</strong></summary>\n <pre>\n$env:OLLAMA_HOST="http://127.0.0.11434"\n$env:OLLAMA_ORIGINS="https://*.wikipedia.org"\nollama serve</pre>\n </details>\n\n <details>\n <summary><strong>macOS / Linux</strong></summary>\n Add the following to <code>~/.bashrc</code> or <code>~/.zshrc</code>:\n <pre>\nexport OLLAMA_HOST="http://127.0.0.11434"\nexport OLLAMA_ORIGINS="https://*.wikipedia.org"</pre>\n Then run:\n <pre>source ~/.bashrc && ollama serve</pre>\n </details>\n </div>\n </div>\n </div>\n\n <div class="whitelist users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted users</div>\n <div class="settings-section-desc">Amount of time before a whitelisted user is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-users-expiry" label="Default expiry for whitelisted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Users</div>\n <div class="settings-section-desc">Manage your list of whitelisted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-users-input" placeholder="Add user to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-whitelist-users-list" class="settings-section list-container">\n \x3c!-- Whitelisted users will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted pages</div>\n <div class="settings-section-desc">Amount of time before a whitelisted page is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-pages-expiry" label="Default expiry for whitelisted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Pages</div>\n <div class="settings-section-desc">Manage your list of whitelisted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-pages-input" placeholder="Add page to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-whitelist-pages-list" class="settings-section list-container">\n \x3c!-- Whitelisted pages will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted tags</div>\n <div class="settings-section-desc">Amount of time before a whitelisted tag is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-tags-expiry" label="Default expiry for whitelisted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Tags</div>\n <div class="settings-section-desc">Manage your list of whitelisted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-tags-input" placeholder="Add tag to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-whitelist-tags-list" class="settings-section list-container">\n \x3c!-- Whitelisted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="highlight users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted users</div>\n <div class="settings-section-desc">Amount of time before a highlighted user is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-users-expiry" label="Default expiry for highlighted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Users</div>\n <div class="settings-section-desc">Manage your list of highlighted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-users-input" placeholder="Add user to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-highlight-users-list" class="settings-section list-container">\n \x3c!-- Highlighted users will be populated here --\x3e\n </div>\n </div>\n <div class="highlight pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted pages</div>\n <div class="settings-section-desc">Amount of time before a highlighted page is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-pages-expiry" label="Default expiry for highlighted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Pages</div>\n <div class="settings-section-desc">Manage your list of highlighted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-pages-input" placeholder="Add page to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-highlight-pages-list" class="settings-section list-container">\n \x3c!-- Highlighted pages will be populated here --\x3e\n </div>\n </div>\n <div class="highlight tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted tags</div>\n <div class="settings-section-desc">Amount of time before a highlighted tag is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-tags-expiry" label="Default expiry for highlighted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Tags</div>\n <div class="settings-section-desc">Manage your list of highlighted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-tags-input" placeholder="Add tag to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-highlight-tags-list" class="settings-section list-container">\n \x3c!-- Highlighted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="statistics hidden">\n <div class="settings-section">\n <div class="settings-section-title">\n Statistics Overview\n <button type="button" id="reset-statistics-button">Reset Statistics</button>\n </div>\n <div class="stats-grid">\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-total-reviewed" class="stat-value"></div>\n <div class="stat-label">Edits Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have thanked <span id="stats-thanks-percentage"></span>% of the edits you reviewed\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-recent-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Recent Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n Recent changes make up <span id="stats-recent-changes-percentage"></span>% of your reviewed edits\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pending-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Pending Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have accepted <span id="stats-pending-changes-accepted"></span> &lpar;\n <span id="stats-pending-changes-accepted-percentage"></span>%\n &rpar; pending changes\n </div>\n <div class="stat-sublabel">\n You have rejected <span id="stats-pending-changes-rejected"></span> &lpar;\n <span id="stats-pending-changes-rejected-percentage"></span>%\n &rpar; pending changes from entering the public eye\n </div>\n <div class="stat-sublabel">\n Out of all the edits you&rsquo;ve reviewed, <span id="stats-pending-changes-percentage"></span>% of them were pending review\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-user-creations-reviewed" class="stat-value"></div>\n <div class="stat-label">User Creations Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-user-creations-percentage"></span>% of your reviews came from user creations\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-watchlist-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Watchlist Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-watchlist-changes-percentage"></span>% of your reviews came from your watchlist\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-abuselog-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Abuse Log Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-abuselog-changes-percentage"></span>% of your reviews came from your abuse log\n </div>\n </div>\n </div>\n </div>\n\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reverts-made" class="stat-value"></div>\n <div class="stat-label">Reverts Made</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reverts-percentage"></span>% of edits that cross your path are reverted by you\n </div>\n <div class="stat-sublabel">\n You assumed good faith <span id="stats-goodfaith-reverts-percentage"></span>% of the time\n </div>\n <div class="stat-sublabel">\n <span id="stats-recent-reverts-percentage"></span>% of your reverts were from recent changes\n </div>\n <div class="stat-sublabel">\n <span id="stats-pending-reverts-percentage"></span>% of your reverts were pending\n </div>\n <div class="stat-sublabel">\n <span id="stats-watchlist-reverts-percentage"></span>% of your reverts were from your watchlist\n </div>\n <div class="stat-sublabel">\n <span id="stats-abuselog-reverts-percentage"></span>% of your reverts were from your abuse log\n </div>\n <div class="stat-sublabel">\n &hellip;and the last <span id="stats-other-reverts-percentage"></span>% weren&rsquo;t even in your queue!\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-users-welcomed" class="stat-value"></div>\n <div class="stat-label">Users Welcomed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-welcomed-message"></span>\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-warnings" class="stat-value"></div>\n <div class="stat-label">Warnings Issued</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-warning-1-percentage"></span>% were level 1\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-2-percentage"></span>% were level 2\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-3-percentage"></span>% were level 3\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4-percentage"></span>% were level 4\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4im-percentage"></span>% were level 4im\n </div>\n <div class="stat-sublabel">\n &hellip;and the rest we were too lazy to track =&rpar;\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reports" class="stat-value"></div>\n <div class="stat-label">Reports Filed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n AIV accounted for <span id="stats-AIV-reports-percentage"></span>% of your reports\n </div>\n <div class="stat-sublabel">\n another <span id="stats-UAA-reports-percentage"></span>% were for UAA\n </div>\n <div class="stat-sublabel">\n <span id="stats-global-block-reports-percentage"></span>% were for global block requests\n </div>\n <div class="stat-sublabel">\n while <span id="stats-global-lock-reports-percentage"></span>% were for global lock requests\n </div>\n <div class="stat-sublabel">\n finally, <span id="stats-RFPP-reports-percentage"></span>% were posted at RFPP\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pages-watched" class="stat-value"></div>\n <div class="stat-label">Pages Watched</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-pages-unwatched"></span> pages were annoying enough to be unwatched\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-whitelisted" class="stat-value"></div>\n <div class="stat-label">Items Whitelisted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-whitelisted"></span> &lpar;\n <span id="stats-users-whitelisted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-whitelisted"></span> &lpar;\n <span id="stats-pages-whitelisted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-whitelisted"></span> &lpar;\n <span id="stats-tags-whitelisted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-highlighted" class="stat-value"></div>\n <div class="stat-label">Items Highlighted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-highlighted"></span> &lpar;\n <span id="stats-users-highlighted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-highlighted"></span> &lpar;\n <span id="stats-pages-highlighted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-highlighted"></span> &lpar;\n <span id="stats-tags-highlighted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-session-time" class="stat-value"></div>\n <div class="stat-label">Session Time</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reports-per-day"></span> reports per day\n </div>\n <div class="stat-sublabel">\n <span id="stats-reverts-per-hour"></span> reverts per hour\n </div>\n <div class="stat-sublabel">\n <span id="stats-reviews-per-minute"></span> reviews per minute\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="save hidden">\n <div class="save settings-section">\n <div class="save-settings-header">\n <div class="settings-section-title">Save Settings</div>\n <div class="settings-section-desc">Manage how and where your WikiShield settings are stored.</div>\n </div>\n\n <div class="save-settings-content">\n <div class="save-settings-card data-management-card">\n <div class="card-header">\n <div class="card-icon">\n <i class="fa fa-database"></i>\n </div>\n <div class="card-header-content">\n <div class="card-title">Data Management</div>\n <div class="card-desc">Import, export, or reset your WikiShield settings. Settings are encoded as base64 for easy sharing.</div>\n </div>\n </div>\n\n <div class="card-body">\n <div class="action-buttons-grid">\n <button type="button" id="settings-export-button" class="action-card export-card">\n <div class="action-card-icon">\n <i class="fa fa-download"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Export Settings</div>\n <div class="action-card-desc">Save your configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-import-button" class="action-card import-card">\n <div class="action-card-icon">\n <i class="fa fa-upload"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Import Settings</div>\n <div class="action-card-desc">Load saved configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-reset-button" class="action-card reset-card">\n <div class="action-card-icon">\n <i class="fa fa-undo"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Reset Settings</div>\n <div class="action-card-desc">Restore to defaults</div>\n </div>\n </button>\n </div>\n\n <div id="settings-save-status" class="status-message hidden"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="changelog hidden">\n <div class="settings-section">\n <div class="changelog-content">\n\n </div>\n </div>\n </div>\n <div class="about hidden">\n <div class="settings-section">\n <div class="about-content">\n <div class="about-version">\n <span class="fa fa-shield-alt"></span>\n <span>WikiShield v<span id="settings-about-version"></span></span>\n </div>\n\n <div class="about-tagline">\n <p>A powerful, real-time patrolling tool for Wikipedia editors</p>\n </div>\n\n <div class="about-links">\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="link-card docs">\n <div class="link-card-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Documentation</div>\n <div class="link-card-desc">Learn how to use WikiShield</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://github.com/LuniZunie/WikiShield-App" target="_blank" class="link-card source">\n <div class="link-card-icon">\n <span class="fa fa-code-branch"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Source Code</div>\n <div class="link-card-desc">View on GitHub</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia_talk:WikiShield" target="_blank" class="link-card feedback">\n <div class="link-card-icon">\n <span class="fa fa-comments"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Feedback</div>\n <div class="link-card-desc">Share your thoughts</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n </div>\n\n <div class="about-footer">\n <div class="footer-divider"></div>\n <div class="about-credits">\n <div>\n <div class="credit-card" data-link="https://about.luni.me">\n <div class="credit-icon">\n <span class="fa fa-code"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">LuniZunie</div>\n <div class="credit-role auto-scroll">Lead Developer</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Ingenuity">\n <div class="credit-icon">\n <span class="fa fa-lightbulb"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Ingenuity</div>\n <div class="credit-role auto-scroll">Original Creator</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Monkeysmashingkeyboards">\n <div class="credit-icon">\n <span class="fa fa-database"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Monkeysmashingkeyboards</div>\n <div class="credit-role auto-scroll">Backend</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:pro-anti-air">\n <div class="credit-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Pro-anti-air</div>\n <div class="credit-role auto-scroll">Documentation</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Chaotic_Enby">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Chaotic Enby</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:HurricaneZeta">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">HurricaneZeta</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="copyright-card" data-link="https://sound-effects.bbcrewind.co.uk">\n <div class="copyright-title auto-scroll">Nature sounds</div>\n <div class="copyright-desc auto-scroll">bbc.co.uk &ndash; &copy; copyright 2026 BBC</div>\n </div>\n <div class="copyright-card" data-link="https://pixabay.com/sound-effects">\n <div class="copyright-title auto-scroll">Sound effects</div>\n <div class="copyright-desc auto-scroll">pixabay.com &ndash; CC0 License</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </body>\n</html>'},2459(e){e.exports="@keyframes startup {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes particles {\n\t0%, 100% {\n\t\ttransform: translate(0, 0) rotate(0deg);\n\t}\n\t33% {\n\t\ttransform: translate(30px, -30px) rotate(120deg);\n\t}\n\t66% {\n\t\ttransform: translate(-20px, 20px) rotate(240deg);\n\t}\n}\n\n@keyframes container-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(30px) scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0) scale(1);\n\t}\n}\n\n@keyframes border-glow {\n\t0%, 100% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 40px rgba(102, 126, 234, .4),\n\t\t\t0 0 80px rgba(240, 147, 251, .3),\n\t\t\tinset 0 0 60px rgba(102, 126, 234, .15),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .2);\n\t}\n\t50% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 60px rgba(240, 147, 251, .6),\n\t\t\t0 0 120px rgba(102, 126, 234, .4),\n\t\t\tinset 0 0 80px rgba(240, 147, 251, .2),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .3);\n\t}\n}\n\n@keyframes shield-entrance {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: scale(0) rotate(-180deg);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: scale(1.15) rotate(10deg);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: scale(1) rotate(0deg);\n\t}\n}\n\n@keyframes shield-float {\n\t0%, 100% {\n\t\ttransform: translate(-50%, -50%) translateY(0px);\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) translateY(-10px);\n\t}\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: translate(-50%, -50%) scale(.8);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t\topacity: 0.8;\n\t}\n\t100% {\n\t\ttransform: translate(-50%, -50%) scale(1.5);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes sparkle {\n\t0%, 100% {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: scale(1.5);\n\t\topacity: 1;\n\t}\n}\n\n@keyframes title-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-20px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes links-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes warning-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes button-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(40px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes fade-in {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n@keyframes fade-out {\n\tfrom {\n\t\topacity: 1;\n\t}\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-in {\n\tfrom {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n}\n@keyframes scale-out {\n\tfrom {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n\tto {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-x {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n}\n\n@keyframes bottom-tool-menu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n@keyframes bottom-tool-submenu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateX(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n}\n\n@keyframes toast-alert-enter {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: translateX(100%) scale(.8);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: translateX(-10px) scale(1.05);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n}\n@keyframes toast-alert-leave {\n\t0% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n\t100% {\n\t\topacity: 0;\n\t\ttransform: translateX(150%) scale(.7);\n\t}\n}\n\n@keyframes music-toast-enter {\n from {\n opacity: 0;\n transform: translateX(150%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes music-toast-leave {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(150%);\n }\n}\n\n@keyframes tooltip-enter {\n from {\n\t\ttransform: scale(.8);\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes star-spin {\n 0% {\n transform: rotate(0deg) scale(1);\n }\n 50% {\n transform: rotate(180deg) scale(1.3);\n }\n 100% {\n transform: rotate(360deg) scale(1);\n }\n}\n\n@keyframes flash-highlight {\n 0%, 100% {\n filter: brightness(1);\n }\n 50% {\n filter: brightness(.5);\n }\n}\n\n@keyframes logo-loader {\n 0%, 100% {\n transform: scale(1);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 10px rgba(102, 126, 234, .4));\n }\n 50% {\n transform: scale(1.5);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 20px rgba(102, 126, 234, .6));\n }\n}\n\n@keyframes refresh-rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse-DEFCON {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.15);\n }\n 100% {\n transform: scale(1);\n }\n}\n\nbody {\n --transparency: 1;\n\n font-size: clamp(14px, 3vw, 16px);\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n background: rgba(20, 20, 30, 1);\n\n &.dyslexia-font {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n\n *:not(.fa):not(.fas):not(.far):not(.fal):not(.fab) {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n }\n }\n\n &.reduce-motion * {\n animation-duration: 0.001s !important;\n transition-duration: 0.001s !important;\n }\n\n & a {\n text-decoration: none;\n\n &:active {\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n }\n }\n\n & > #popup-blocker {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 1);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease;\n }\n\n & > #loading {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 2);\n\n opacity: 1;\n\n transition: opacity .5s ease;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n & > .icon {\n width: 100vmin;\n }\n }\n\n & > .icon {\n aspect-ratio: 1 / 1;\n width: 12.5vmin;\n\n animation: logo-loader 2s ease-in-out infinite;\n\n transition: width .5s cubic-bezier(0.6, -0.28, 0.735, 0.045);\n }\n }\n\n & > #initial {\n display: flex;\n align-items: center;\n\t justify-content: center;\n\n width: 100%;\n height: 100%;\n\n position: relative;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n display: none;\n }\n\n &:before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 0;\n background:\n radial-gradient(circle at 20% 50%, rgba(102, 126, 234, .08) 0%, transparent 50%),\n radial-gradient(circle at 80% 80%, rgba(118, 75, 162, .06) 0%, transparent 50%);\n pointer-events: none;\n }\n\n &:not(.hidden) {\n animation: startup 1.2s ease-out;\n\n & > #welcome-container {\n animation: container-fade-in 1.2s ease-out;\n\n & > .shield-container {\n animation: shield-entrance 1.5s ease 2s forwards;\n }\n\n & > h1 {\n animation: title-fade-in 0.8s ease-out 0.5s both;\n }\n\n & > .about-links {\n animation: link-slide-in 0.8s ease-out 0.7s both;\n }\n\n & > #rollback-needed {\n animation: warning-fade-in 1s ease-out 0.7s both;\n }\n\n & > button {\n animation: button-slide-in 2s ease-out 1s both;\n }\n }\n }\n\n & > #dots-canvas {\n width: 100%;\n height: 100%;\n\n position: absolute;\n z-index: 0;\n left: 0;\n top: 0;\n }\n\n & > #welcome-container {\n padding: 48px;\n\n border-radius: 16px;\n\n max-width: 480px;\n\n position: relative;\n z-index: 2;\n\n text-align: center;\n\n overflow: hidden;\n\n /* Theme dependent */\n border: 1px solid rgba(143, 163, 255, .15);\n box-shadow:\n 0 12px 40px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & * {\n position: relative;\n z-index: 1;\n }\n\n & > .shield-container {\n width: 100px;\n height: 100px;\n\n position: relative;\n\n margin: 0 auto 24px;\n\n opacity: 0;\n\n & > .glow-ring {\n width: 240px;\n height: 240px;\n\n position: absolute;\n left: 50%;\n top: 50%;\n\n border: 2px solid;\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: pulse 2.5s ease-in-out infinite;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n &:nth-child(2) {\n animation-delay: 0.4s;\n border-color: rgba(118, 75, 162, .25);\n }\n &:nth-child(3) {\n animation-delay: 0.8s;\n border-color: rgba(143, 163, 255, .2);\n }\n }\n\n & > .sparkle {\n width: 5px;\n height: 5px;\n\n position: absolute;\n\n border-radius: 50%;\n\n animation: sparkle 2s ease-in-out infinite;\n\n &:nth-child(4) {\n top: 15%;\n left: 25%;\n\n animation-delay: 0s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .6);\n box-shadow: 0 0 8px rgba(143, 163, 255, .6);\n }\n &:nth-child(5) {\n top: 25%;\n left: 18%;\n\n animation-delay: 0.4s;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .6);\n box-shadow: 0 0 8px rgba(102, 126, 234, .6);\n }\n &:nth-child(6) {\n bottom: 20%;\n\t left: 30%;\n\n animation-delay: 0.8s;\n\n /* Theme dependent */\n background: rgba(118, 75, 162, .5);\n box-shadow: 0 0 8px rgba(118, 75, 162, .5);\n }\n &:nth-child(7) {\n bottom: 25%;\n right: 25%;\n\n animation-delay: 1.2s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .5);\n box-shadow: 0 0 8px rgba(143, 163, 255, .5);\n }\n }\n\n & > .shield-icon {\n width: 100px;\n\n position: absolute;\n z-index: 2;\n left: 50%;\n top: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: shield-float 3s ease-in-out infinite;\n\n /* Theme dependent */\n filter: drop-shadow(0 0 8px rgba(102, 126, 234, .3));\n\n & > img {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 2.2em;\n font-weight: 700;\n line-height: 1.2;\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n }\n\n & > .subtitle {\n margin: 0 0 24px 0;\n\n font-size: 0.95em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 0.8);\n }\n\n & > .about-links {\n display: flex;\n justify-content: center;\n gap: 12px;\n flex-wrap: wrap;\n\n margin: 24px 0;\n\n & > .about-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n padding: 8px 14px;\n\n border: 1px solid;\n border-radius: 8px;\n\n font-size: 0.85em;\n font-weight: 500;\n text-decoration: none;\n\n transition: background .2s ease,\n transform .2s ease,\n color .2s ease,\n border-color .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 0.9);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .2);\n }\n }\n }\n\n & > #rollback-needed {\n margin: 20px 0;\n padding: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(247, 76, 60, .3);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n\t\t inset 0 1px 0 rgba(255, 255, 255, .05);\n background: rgba(247, 76, 60, .08);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n display: none;\n }\n\n & p {\n margin: 6px 0;\n\n font-weight: 400;\n font-size: 0.9em;\n\n /* Theme dependent */\n color: rgba(247, 76, 60, 0.95);\n }\n & a {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n & > button {\n cursor: pointer;\n\n width: 100%;\n\n padding: 12px 24px;\n\n border: 2px solid transparent;\n border-radius: 10px;\n\n position: relative;\n\n font-size: 1em;\n font-weight: 700;\n color: rgba(143, 163, 255, 1);\n letter-spacing: 0.5px;\n\n overflow: hidden;\n\n opacity: 1;\n\n transition: all .25s ease;\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.8), rgba(118, 75, 162, 0.8)) border-box;\n box-shadow:\n 0 0 10px rgba(102, 126, 234, .6),\n 0 0 20px rgba(118, 75, 162, .3),\n inset 0 0 10px rgba(102, 126, 234, .1);\n\n &.hidden {\n display: none;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(160, 180, 255, 1);\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 75, 162, 1)) border-box;\n box-shadow:\n 0 0 15px rgba(102, 126, 234, .8),\n 0 0 30px rgba(118, 75, 162, .5),\n inset 0 0 15px rgba(102, 126, 234, .2);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.7), rgba(118, 75, 162, 0.7)) border-box;\n box-shadow:\n 0 0 8px rgba(102, 126, 234, .5),\n 0 0 16px rgba(118, 75, 162, .3),\n inset 0 0 8px rgba(102, 126, 234, .1);\n }\n\n &::before {\n content: \"\";\n\n width: 100%;\n height: 100%;\n\n position: absolute;\n left: -100%;\n top: 0;\n\n transition: left .4s ease;\n\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1),\n transparent\n );\n }\n\n & > i {\n margin-right: 6px;\n font-size: 14px;\n transition: transform 0.3s ease;\n }\n\n &:hover > i {\n transform: translateX(2px);\n }\n }\n }\n }\n\n & > #app {\n width: 100%;\n height: 100%;\n\n line-height: 1.5;\n color: var(--body-color);\n\n overflow: hidden;\n\n background: var(--body-background);\n\n &.hidden {\n display: none;\n }\n\n & > #container {\n display: flex;\n width: 100%;\n height: 100%;\n\n margin: 0;\n\n overflow: hidden;\n\n & > #queue {\n width: 15vw;\n height: 100%;\n\n position: relative;\n\n border-right: 1px solid;\n\n /* Theme dependent */\n border-right-color: rgba(58, 61, 74, 1);\n\n & > #queue-top {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 69px;\n\n position: relative;\n z-index: 2;\n\n border-bottom: 2px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 8px;\n\n padding: 10px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-button-cluster {\n display: flex;\n align-items: center;\n gap: 20px;\n\n padding: 10px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n font-size: 1.2em;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .fa {\n position: relative;\n }\n\n & > span {\n cursor: pointer;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > #DEFCON {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n padding: 4px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .dot {\n flex: 0 0 auto;\n\n width: 10px;\n height: 10px;\n\n border-radius: 50%;\n\n animation: pulse-DEFCON 2s ease-in-out infinite;\n\n /* Theme dependent */\n background: rgba(100, 100, 100, 1);\n box-shadow: 0 0 0 4px rgba(100, 100, 100, .15);\n\n &.DEFCON-1 {\n background: rgba(255, 75, 75, 1);\n box-shadow: 0 0 0 4px rgba(255, 75, 75, .3);\n }\n &.DEFCON-2 {\n background: rgba(255, 165, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 165, 0, .3);\n }\n &.DEFCON-3 {\n background: rgba(255, 255, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 255, 0, .3);\n }\n &.DEFCON-4 {\n background: rgba(75, 255, 75, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 75, .3);\n }\n &.DEFCON-5 {\n background: rgba(75, 255, 255, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 255, .3);\n }\n }\n\n & > span {\n overflow: auto hidden;\n\n white-space: nowrap;\n font-size: 13px;\n font-weight: 500;\n }\n }\n }\n\n & > #queue-tabs {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-around;\n gap: 8px;\n\n position: relative;\n z-index: 2;\n\n border-radius: 0 0 12px 12px;\n padding: 10px 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: transparent;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-tab {\n cursor: pointer;\n\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n\n position: relative;\n\n border-radius: 50%;\n padding: 8px 14px;\n\n font-size: 1.4em;\n\n transition: transform .18s ease,\n color .18s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .85);\n\n &::after {\n content: \"\";\n\n height: 3px;\n\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n\n border-radius: 2px;\n\n transform: scaleX(0);\n\n transition: transform .22s cubic-bezier(.2, .9, .27, 1);\n\n /* Theme dependent */\n opacity: .95;\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, 1),\n rgba(118, 75, 162, 1)\n );\n }\n\n &:hover, &:focus-visible {\n transform: translateY(-2px);\n }\n\n &:not(.selected).mentions-me::after {\n animation: scale-x 1s ease-in-out infinite;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(244, 196, 32, 1),\n rgba(255, 107, 107, 1)\n );\n }\n\n &.selected {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n &::after {\n transform: scaleX(1);\n }\n }\n\n &.hidden {\n display: none;\n }\n\n & > .fas {\n position: relative;\n }\n }\n }\n\n & > .queue-list {\n height: calc(100% - 60px);\n\n position: relative;\n top: -60px;\n\n padding-top: 60px;\n padding-bottom: 10px;\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n right: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > #clear-queue {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-container {\n display: flex;\n flex-wrap: wrap;\n width: calc(100% - 15vw);\n\n & > #right-content {\n display: flex;\n width: 100%;\n height: 100%;\n\n & > #main-container {\n display: flex;\n flex-direction: column;\n gap: 0px;\n width: calc(100% - 15vw);\n height: 100%;\n\n padding-top: 69px;\n\n position: relative;\n\n & > #edit-details {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 4px;\n\n width: calc(100% - 20vmin);\n height: 69px;\n\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-top: none;\n border-radius: 8px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease;\n\n /* Theme dependent */\n background: rgba(30, 34, 45, 1);\n border-color: rgba(143, 163, 255, .2);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n inset 0 1px 0px rgba(255, 255, 255, .05);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .central {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n flex: 1;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: 1em;\n\n & > .page-title {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(119, 166, 215, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n\n & > a {\n color: inherit;\n\n white-space: nowrap;\n text-overflow: ellipsis;\n\n overflow: hidden;\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > a {\n color: inherit;\n }\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: calc(1rem + 4px);\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n\n & > .subheader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: .9em;\n\n & > .item-comment {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n &.none {\n opacity: .6;\n }\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n white-space: nowrap;\n\n overflow: auto hidden;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: .85rem;\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .nav-item-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 41px;\n height: 41px;\n\n position: absolute;\n top: 14px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: 0;\n }\n\n &#previous-item-button {\n left: calc(5vmin - calc(41px / 2));\n }\n &#next-item-button {\n right: calc(5vmin - calc(41px / 2));\n }\n\n & > i {\n font-size: 16px;\n }\n }\n\n & > #ai-analysis-container {\n flex-shrink: 0;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 12px;\n margin-bottom: 0;\n padding: 10px;\n\n overflow: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .2);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n align-items: center;\n gap: 6px;\n\n margin-bottom: 8px;\n\n & > .fa {\n font-size: 1.1em;\n }\n\n & > .title {\n font-size: .95em;\n letter-spacing: .3px;\n }\n\n & > .assessment {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .8em;\n font-weight: 700;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.review {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.suspicious {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.bad {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n &.error {\n /* Theme dependent */\n background: rgba(158, 158, 158, .25);\n }\n }\n\n & > .confidence {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .75em;\n font-weight: 600;\n }\n }\n\n & > .explanation {\n border-left: 3px solid;\n\n border-radius: 4px;\n margin-bottom: 6px;\n padding: 6px 8px;\n\n font-size: .8em;\n line-height: 1.3;\n\n /* Theme dependent */\n border-left-color: rgba(143, 163, 255, .4);\n }\n\n & > .issues {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n & > .issue {\n border-radius: 6px;\n padding: 4px 10px;\n\n font-size: .75em;\n font-weight: 600;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.medium {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.high {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.critical {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n }\n }\n }\n\n & > .notice {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 8px;\n\n border-left: 4px solid;\n border-radius: 4px;\n\n margin: 10px;\n padding: 8px 12px;\n\n font-size: .9em;\n\n &.edit-war {\n /* Theme dependent */\n color: rgba(120, 27, 20, 1);\n border-left-color: rgba(247, 50, 20, 1);\n background: rgba(255, 205, 199, 1);\n }\n\n &.outdated {\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-left-color: rgba(255, 193, 7, 1);\n background: rgba(255, 243, 205, 1);\n\n &.pending {\n /* Theme dependent */\n color: rgba(12, 84, 96, 1);\n border-left-color: rgba(23, 162, 184, 1);\n background: rgba(209, 236, 241, 1);\n }\n }\n\n & > .text {\n flex: 1;\n }\n\n & > .button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .85em;\n font-weight: 600;\n white-space: nowrap;\n text-decoration: none;\n\n transition: color .2s ease,\n border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-color: rgba(255, 193, 7, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .1);\n\n background: rgba(255, 235, 159, .45);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > i {\n font-size: 14px;\n\n transition: transform .3s ease;\n }\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n color: rgba(80, 60, 0, 1);\n border-color: rgba(255, 193, 7, .6);\n box-shadow: 0 4px 16px rgba(255, 193, 7, .25);\n\n background: rgba(255, 235, 159, .65);\n\n & > i {\n transform: translateX(3px);\n\n &.restore {\n transform: rotateZ(180deg);\n }\n }\n }\n }\n }\n\n & > .diff-scroll-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n opacity: 1;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > i {\n font-size: 16px;\n }\n\n &#diff-scroll-up {\n top: 77px;\n }\n &#diff-scroll-down {\n bottom: 8px;\n }\n }\n\n & > #diff-container {\n flex: 1;\n\n padding: 12px;\n\n scroll-behavior: smooth;\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(20, 22, 28, .3),\n transparent\n );\n\n & > .loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n & > .loading-spinner {\n margin-bottom: 24px;\n\n font-size: 56px;\n\n animation: logo-loader 2s ease-in-out infinite;\n }\n\n & > .loading-text {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n text-align: center;\n font-weight: 500;\n letter-spacing: .3px;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 1);\n }\n }\n\n & > table {\n width: 100%;\n\n border: 1px solid;\n border-collapse: separate;\n border-spacing: 0;\n\n border-radius: 14px;\n margin-bottom: 24px;\n\n overflow: hidden;\n\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: .8em;\n line-height: 1.6;\n vertical-align: baseline;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .1),\n inset 0 -1px 0px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(143, 163, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(35, 40, 52, .5),\n rgba(30, 35, 48, .4)\n );\n -webkit-backdrop-filter: blur(16px) saturate(110%);\n backdrop-filter: blur(16px) saturate(110%);\n\n & > tbody {\n .mw-diff-movedpara-left, .mw-diff-movedpara-right {\n text-decoration: none;\n }\n\n & > tr {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease;\n\n &:hover {\n & > td {\n /* Theme dependent */\n background: rgba(143, 163, 255, .12);\n }\n }\n\n &:not(.diff-addedline, .diff-deletedline) {\n & > td {\n /* Theme dependent */\n background: rgba(255, 255, 255, .02);\n }\n }\n\n .flash-highlight {\n animation: flash-highlight 1s ease-out infinite;\n }\n\n & > td {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease,\n color .25s ease;\n\n &:not(.diff-marker) {\n width: 50%;\n\n padding: 10px 14px;\n\n transition: background .25s ease;\n\n /* Theme dependent */\n color: rgba(200, 210, 230, 1);\n }\n\n &.diff-lineno {\n -webkit-user-select: none;\n user-select: none;\n\n border-bottom: 1px solid;\n\n padding: 10px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-align: center;\n letter-spacing: .6px;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .12),\n rgba(158, 115, 212, .08)\n );\n }\n\n &.diff-marker {\n -webkit-user-select: none;\n user-select: none;\n\n width: 40px;\n\n border-right: 1px solid;\n\n padding: 10px 8px;\n\n font-weight: 700;\n text-align: center;\n\n /* Theme dependent */\n border-right-color: rgba(143, 163, 255, .15);\n\n color: rgba(160, 170, 200, .9);\n\n background: linear-gradient(90deg,\n rgba(40, 45, 60, .3),\n rgba(35, 40, 52, .2)\n );\n\n &::before {\n content: attr(data-marker);\n }\n }\n\n &.diff-empty {\n /* Theme dependent */\n background: rgba(20, 25, 35, .3);\n }\n\n &:is(.diff-addedline, .diff-deletedline) {\n position: relative;\n\n border-left: 4px solid;\n\n transition: background .25s ease,\n border-left-color .25s ease,\n box-shadow .25s ease;\n\n &.diff-addedline {\n /* Theme dependent */\n border-left-color: rgba(76, 175, 80, .9);\n\n background: rgba(76, 175, 80, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(129, 199, 132, 1);\n background: rgba(129, 199, 132, .18);\n box-shadow: inset 0 0 12px rgba(76, 175, 80, .15);\n }\n }\n &.diff-deletedline {\n /* Theme dependent */\n border-left-color: rgba(244, 67, 54, .9);\n\n background: rgba(244, 67, 54, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(255, 112, 97, 1);\n background: rgba(255, 112, 97, .18);\n box-shadow: inset 0 0 12px rgba(244, 67, 54, .15);\n }\n }\n }\n\n & > div {\n & > :is(ins, del) {\n border-radius: 6px;\n padding: 2px 6px;\n\n font-weight: 600;\n text-decoration: none;\n\n transition: background .25s ease,\n transform .15s ease;\n }\n\n & > ins {\n /* Theme dependent */\n background: rgba(130, 169, 26, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(139, 195, 74, .6);\n\n transform: scale(1.08);\n }\n }\n & > del {\n /* Theme dependent */\n background: rgba(244, 67, 54, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 112, 97, .6);\n\n transform: scale(1.08);\n }\n }\n }\n\n a {\n text-decoration: none;\n\n /* Theme dependent */\n color: rgba(107, 163, 216, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n text-decoration: underline;\n }\n }\n }\n }\n }\n }\n }\n\n & > #pending-changes-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n\n position: fixed;\n left: 50%;\n bottom: 63px;\n z-index: 2;\n\n transform: translateX(-50%);\n\n &.hidden {\n display: none;\n }\n\n & > :is(.accept, .reject) {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n\n border-radius: 10px 10px 0 0;\n padding: 8px 12px;\n\n font-size: .95em;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease,\n border-color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.accept {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .14);\n box-shadow: 0 10px 26px rgba(46, 125, 50, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(46, 125, 50, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(46, 125, 50, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n &.reject {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .14);\n box-shadow: 0 10px 26px rgba(155, 40, 34, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(155, 40, 34, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(155, 40, 34, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n }\n }\n\n & > #progress-bar-container {\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-direction: column;\n\n position: absolute;\n top: 0px;\n bottom: 56px;\n right: 0px;\n\n padding: 0;\n\n overflow: hidden;\n\n & > .progress-bar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 180px;\n height: 32px;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 16px;\n margin-bottom: 10px;\n margin-right: 10px;\n\n overflow: hidden;\n\n font-size: .85em;\n font-weight: 400;\n\n opacity: 1;\n\n transition: width .3s ease,\n opacity .3s ease,\n border-color .3s ease,\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .1),\n rgba(158, 115, 212, .1)\n );\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.error {\n /* Theme dependent */\n border-color: rgba(239, 68, 68, .8);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .1),\n rgba(220, 38, 38, .1)\n );\n\n & > .progress-bar-overlay {\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .6),\n rgba(220, 38, 38, .6)\n );\n }\n }\n\n & > .progress-bar-overlay {\n width: 0;\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 16px;\n\n transition: width .4s cubic-bezier(.4, 0, .2, 1),\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .6),\n rgba(158, 115, 212, .6)\n );\n }\n\n & > .progress-bar-text {\n max-width: 100%;\n\n position: relative;\n\n padding: 0 12px;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .2);\n\n color: rgba(255, 255, 255, 1);\n }\n }\n }\n\n & > #bottom-tools {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n\n max-width: calc(100% - 20vmin);\n width: fit-content;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 8px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-radius: 16px;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .bottom-tool-item {\n position: relative;\n\n white-space: nowrap;\n\n transition: opacity .2s ease;\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n\n & > .bottom-tool-trigger {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease;\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.active {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n\n & > .bottom-tool-chevron {\n transform: rotate(180deg);\n }\n }\n\n & > .bottom-tool-chevron {\n font-size: .75em;\n\n transition: transform .2s ease;\n }\n }\n }\n\n & > .bottom-tool-action {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n }\n }\n\n & > #copy-link {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-details {\n width: 15vw;\n\n position: relative;\n\n border-left: 1px solid;\n\n /* Theme dependent */\n border-left-color: rgba(54, 62, 81, 1);\n\n & > #right-top {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n align-content: center;\n justify-content: center;\n\n width: 100%;\n height: 69px;\n\n border-bottom: 2px solid;\n border-left: 1px solid;\n border-bottom-left-radius: 8px;\n\n padding: 8px 15px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .tabs {\n display: flex;\n justify-content: center;\n width: 100%;\n\n & > .tab {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 2px solid;\n\n padding: 10px;\n\n opacity: .75;\n\n transition: background .35s cubic-bezier(.4, 0, .2, 1),\n opacity .35s cubic-bezier(.4, 0, .2, 1),\n box-shadow .35s cubic-bezier(.4, 0, .2, 1),\n border-color .35s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n &:hover, &:focus-visible {\n opacity: 1;\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 75, 162, .25)\n );\n }\n\n &.hidden {\n display: none;\n }\n\n &:first-child {\n border-radius: 10px 0 0 10px;\n }\n &:last-child {\n border-radius: 0 10px 10px 0;\n }\n }\n }\n\n & > .icons {\n display: flex;\n justify-content: center;\n width: 100%;\n\n font-size: 1.4em;\n\n & > .hidden {\n display: none;\n }\n }\n }\n\n & > .section {\n display: flex;\n flex-direction: column;\n height: calc(50% - calc(69px / 2) - 15px);\n\n margin: 10px 10px 0 10px;\n\n border: 1px solid;\n border-radius: 16px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n background: rgba(30, 35, 45, .8);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n\n padding: 14px 14px 12px;\n\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n background: rgba(30, 35, 45, .8);\n\n & > .title {\n font-weight: 600;\n font-size: .85em;\n text-transform: uppercase;\n letter-spacing: .07em;\n white-space: nowrap;\n\n & > i {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n\n margin-right: 4px;\n\n font-size: .9em;\n\n transition: transform .5s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n transform: rotate(180deg);\n }\n }\n }\n\n & > .pills {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n\n & > .pill {\n border: 1px solid;\n border-radius: 10px;\n padding: 4px 8px;\n\n font-size: .75em;\n font-weight: 500;\n\n white-space: nowrap;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(224, 228, 240, 1);\n background: rgba(140, 132, 255, .1);\n\n &.uw-1 {\n /* Theme dependent */\n border-color: rgba(107, 163, 216, .8);\n background: rgba(107, 163, 216, .1);\n color: rgba(107, 163, 216, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .8);\n background: rgba(143, 163, 255, .15);\n color: rgba(143, 163, 255, 1);\n }\n }\n &.uw-2 {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .8);\n background: rgba(255, 193, 7, .1);\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n color: rgba(255, 193, 7, 1);\n }\n }\n &.uw-3 {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, .8);\n background: rgba(255, 87, 34, .1);\n color: rgba(255, 87, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n background: rgba(255, 87, 34, .15);\n color: rgba(255, 87, 34, 1);\n }\n }\n &.uw-4 {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .8);\n background: rgba(244, 67, 54, .1);\n color: rgba(244, 67, 54, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, 1);\n background: rgba(244, 67, 54, .15);\n color: rgba(244, 67, 54, 1);\n }\n }\n &.uw-4im {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, .8);\n background: rgba(178, 34, 34, .1);\n color: rgba(178, 34, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, 1);\n background: rgba(178, 34, 34, .15);\n color: rgba(178, 34, 34, 1);\n }\n }\n\n &.ub {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, .8);\n background: rgba(255, 99, 132, .1);\n color: rgba(255, 99, 132, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, 1);\n background: rgba(255, 99, 132, .15);\n color: rgba(255, 99, 132, 1);\n }\n }\n }\n }\n }\n\n & > .queue-list {\n flex: 1;\n height: 100%;\n\n padding: 4px;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .3);\n }\n\n & > .footer {\n cursor: pointer;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n\n padding: 10px 14px;\n\n border-top: 1px solid;\n\n font-size: .85em;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(30, 35, 45, .8);\n border-top-color: rgba(143, 163, 255, .2);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n & > i {\n transform: translateX(3px);\n }\n }\n\n & > i {\n transition: transform .2s ease;\n }\n }\n }\n\n &:has(#user-contributions.hidden) {\n & > #page-history {\n height: calc(100% - 89px);\n }\n }\n &:has(#page-history.hidden) {\n & > #user-contributions {\n height: calc(100% - 89px);\n }\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n left: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > .height-adjust {\n touch-action: none;\n cursor: row-resize;\n\n height: 10px;\n width: 100%;\n\n position: absolute;\n left: 0;\n top: calc(50% - 5px);\n z-index: 3;\n }\n }\n }\n }\n }\n\n & > .bottom-tool-menu {\n display: none;\n max-width: calc(100vw - 40px);\n min-width: 200px;\n\n position: absolute;\n left: 0;\n bottom: calc(100% + 8px);\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n overflow-y: visible;\n\n animation: bottom-tool-menu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n }\n\n & > .menu-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border-radius: 8px;\n padding: 10px 12px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.hidden {\n display: none;\n }\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n\n & > i:first-child {\n opacity: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n opacity: 1;\n }\n }\n\n & > i:first-child {\n width: 18px;\n\n font-size: 1.1em;\n text-align: center;\n\n opacity: .8;\n\n transition: opacity .2s ease;\n }\n\n & > span {\n flex: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n margin-left: auto;\n\n font-size: .85em;\n\n opacity: .5;\n\n transition: opacity .2s ease;\n }\n\n & > .submenu {\n cursor: default;\n\n display: none;\n min-width: 240px;\n\n position: absolute;\n left: calc(100% + 4px);\n top: -6px;\n z-index: 4;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n color: var(--body-color);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n }\n\n & > .bottom-subcontent-title {\n border-bottom: 1px solid;\n\n margin-bottom: 12px;\n padding-bottom: 8px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n }\n\n & > .bottom-subcontent-input-title {\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > :is(select, input[type=\"text\"]) {\n width: 100%;\n\n font-size: .9em;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n\n & > .bottom-subcontent-button {\n --background: 123, 143, 245;\n\n display: block;\n width: 100%;\n\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n font-weight: 600;\n }\n }\n }\n\n &:is(#revert-menu, #warn-menu) {\n max-height: calc(100vh - 120px);\n\n overflow: hidden auto;\n\n & > .warning-menu {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 280px;\n\n position: relative;\n\n border-radius: 12px;\n padding: 8px;\n\n & > .warning-menu-no-items {\n text-align: center;\n padding: 20px;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n }\n\n & > .favorites-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 4px;\n\n & > .favorites-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .9);\n\n & > .icon {\n font-size: 1.1em;\n }\n }\n\n & > .favorites-container {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n }\n\n & > .favorites-separator {\n height: 1px;\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n }\n\n & > .favorites-section:not(:has(.warning-menu-item)) {\n display: none;\n\n & ~ .favorites-separator {\n display: none;\n }\n }\n\n & > .menu-option {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n color: rgba(224, 228, 240, 1);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .12);\n\n & > .icon {\n opacity: 1;\n transform: scale(1.1);\n }\n\n & > .submenu-arrow {\n opacity: 1;\n transform: translateX(2px);\n }\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .15);\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n opacity: .85;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > span:not(.icon):not(.submenu-arrow) {\n flex: 1;\n\n font-weight: 500;\n }\n\n & > .submenu-arrow {\n flex-shrink: 0;\n\n font-size: .8em;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n }\n }\n }\n\n & > .warning-submenu {\n display: none;\n max-width: calc(100vw - 60px);\n min-width: 420px;\n max-height: calc(100vh - 120px);\n\n position: absolute;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n overflow-y: auto;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(30, 33, 42, .98);\n -webkit-backdrop-filter: blur(25px);\n backdrop-filter: blur(25px);\n\n &.show {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n }\n\n .warning-menu-item {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n background: rgba(102, 126, 234, .12);\n }\n\n &.favorite-item {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n\n &.dragging {\n opacity: 0.5;\n transform: scale(0.95);\n }\n }\n\n & > .favorite-star {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border-radius: 4px;\n\n font-size: 1.2em;\n line-height: 1;\n\n transition: transform .2s cubic-bezier(.4, 0, .2, 1),\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .4);\n\n &:hover {\n transform: scale(1.2);\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .8);\n }\n\n &.favorited {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 152, 0, 1);\n }\n }\n\n &.spin {\n animation: star-spin 0.5s cubic-bezier(.4, 0, .2, 1);\n }\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > .warning-menu-title {\n flex: 1;\n\n font-size: .92em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 228, 240, 1);\n }\n\n & > .fa-circle-question {\n flex-shrink: 0;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .6);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .warning-menu-buttons {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n\n margin-left: 8px;\n }\n\n & > .warning-menu-buttons > .warning-menu-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 7px 14px;\n\n font-size: .82em;\n font-weight: 500;\n text-transform: capitalize;\n\n transition: border-color .2s ease,\n background .2s ease,\n color .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, .95);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .22);\n }\n\n &:active {\n transform: translateY(0);\n }\n\n &.warning-menu-no-warn-button {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .2);\n color: rgba(255, 193, 7, .95);\n background: rgba(255, 152, 0, .1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .4);\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 152, 0, .22);\n }\n }\n }\n }\n\n & > .levels-menu {\n display: none;\n min-width: 0px;\n\n position: fixed;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(28, 30, 38, .98);\n -webkit-backdrop-filter: blur(24px);\n backdrop-filter: blur(24px);\n\n &.show {\n display: flex;\n gap: 6px;\n }\n\n & > .levels-menu-item {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .95em;\n font-weight: 600;\n text-align: center;\n white-space: nowrap;\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n background: rgba(255, 255, 255, .05);\n border: 1px solid rgba(255, 255, 255, .1);\n\n &:hover {\n transform: translateY(-2px);\n background: rgba(255, 255, 255, .08);\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n\n &:active {\n transform: translateY(0);\n }\n }\n }\n\n .queue-list {\n overflow: hidden auto;\n\n &:is(#user-contributions-content, #page-history-content) {\n & > .queue-item {\n margin: 4px 0;\n }\n }\n\n & > .queue-empty {\n text-align: center;\n padding: 40px 20px;\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n }\n\n & > .historical-bar {\n height: 4px;\n width: 100%;\n\n position: relative;\n\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n\n & > .label {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n font-size: 1em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n\n & > .queue-item {\n cursor: pointer;\n\n display: flex;\n\n position: relative;\n\n border: 1px solid;\n border-radius: .75rem;\n\n margin: 4px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .4);\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n &:hover, &:focus-within {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 12px oklch(0 0 0 / 0.3);\n\n background: rgba(40, 43, 52, .6);\n }\n\n &.current {\n /* Theme dependent */\n border-color: linear-gradient(90deg,\n rgba(40, 43, 52, .4),\n rgba(40, 43, 82, .6)\n );\n box-shadow: 0 0 0 1px rgba(60, 63, 122, 1) inset;\n\n background: rgba(40, 43, 82, .6);\n\n & > .item-body {\n & > .item-tags {\n & > .tag {\n /* Theme dependent */\n color: rgba(145, 145, 165, 1);\n background: rgba(60, 63, 122, .4);\n border-color: rgba(60, 63, 122, .6);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .4);\n border-color: rgba(255, 193, 7, .6);\n }\n }\n }\n }\n }\n\n &.mentions-me {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 1) inset;\n\n background: rgba(40, 43, 52, .6);\n }\n\n & > .item-color {\n --ores-color: rgba(128, 128, 128, 1);\n\n flex-shrink: 0;\n width: 4px;\n\n position: relative;\n\n opacity: .85;\n\n /* Theme dependent */\n background: var(--ores-color);\n }\n\n & > .item-body {\n --ores-color: rgba(128, 128, 128, 1);\n --diff-color: rgba(128, 128, 128, 1);\n\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: .5rem;\n\n min-width: 0;\n\n padding: .75rem 1rem;\n\n & > .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: .75rem;\n\n & > .page-title {\n display: flex;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n font-size: clamp(.825rem, .85rem + .35vw, .95rem);\n font-weight: 600;\n\n word-wrap: break-word;\n word-break: break-word;\n\n line-height: 1.35;\n\n /* Theme dependent */\n color: rgba(205, 204, 202, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n }\n\n & > .timestamp {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 4px;\n\n min-width: 3ex;\n\n padding-top: 1px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n width: 100%;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 500;\n\n hyphens: auto;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n }\n\n & > .chips {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-grow: 1;\n gap: 4px;\n\n & > .ores-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--ores-color);\n background: color-mix(in srgb, var(--ores-color) 15%, transparent);\n }\n\n & > .diff-chips {\n display: flex;\n align-items: center;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: var(--diff-color);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .item-comment {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n overflow: hidden;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n font-style: italic;\n white-space: nowrap;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .item-tags {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .5rem;\n\n & > .tag {\n display: flex;\n align-items: center;\n gap: 2px;\n\n padding: 1px .5rem;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .7rem;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(135, 135, 135, 1);\n background: rgba(45, 44, 51, 1);\n border-color: rgba(38, 37, 35, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border-color: rgba(255, 193, 7, .4);\n }\n }\n }\n }\n\n & > .remove-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n\n position: absolute;\n right: 0px;\n bottom: 0px;\n\n border-top-left-radius: 8px;\n\n line-height: 1;\n\n transition: color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n background: rgba(255, 255, 255, 0);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 70, 0, 1);\n background: rgba(255, 70, 0, .15);\n }\n }\n }\n }\n\n .tooltip {\n min-width: 0;\n max-height: 80vh;\n\n position: fixed;\n left: 0;\n top: 0;\n z-index: calc(var(--max-z-index) - 3);\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 4px 6px;\n\n overflow-wrap: break-word;\n overflow: hidden auto;\n\n font-size: .95em;\n line-height: 1.45;\n word-wrap: break-word;\n white-space: normal;\n\n animation: tooltip-enter .1s ease-out forwards;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n box-shadow: 0 10px 30px rgba(6, 12, 24, .6),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n color: rgba(234, 240, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .03),\n rgba(255, 255, 255, .01)\n );\n -webkit-backdrop-filter: blur(14px) brightness(.7);\n backdrop-filter: blur(14px) brightness(.7);\n\n &:not(.buttons) {\n pointer-events: none;\n\n max-width: 460px;\n }\n\n &.buttons {\n display: flex;\n flex-direction: row;\n gap: 8px;\n\n z-index: calc(var(--max-z-index) - 2);\n\n white-space: nowrap;\n\n & > .button {\n cursor: pointer;\n\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 4px 8px;\n\n font-size: .95em;\n font-weight: 500;\n letter-spacing: .3px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .05);\n\n color: rgba(240, 245, 255, .92);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .08),\n rgba(255, 255, 255, .02)\n );\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .14),\n rgba(255, 255, 255, .06)\n );\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 1px 4px rgba(0, 0, 0, .3),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .tooltip-title {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-bottom: 1px solid;\n\n border-radius: 6px;\n margin-bottom: 12px;\n padding: 8px 10px;\n\n font-size: 1.04em;\n font-weight: 700;\n letter-spacing: .25px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .05);\n\n color: rgba(255, 255, 255, .92);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(0, 0, 0, .04)\n );\n -webkit-backdrop-filter: blur(6px);\n backdrop-filter: blur(6px);\n }\n\n & > .tooltip-item {\n display: flex;\n flex-direction: column;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 10px;\n margin: 10px 0;\n padding: 10px 12px;\n\n overflow: hidden;\n overflow-wrap: anywhere;\n\n word-wrap: break-word;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .075),\n rgba(0, 0, 0, .25)\n );\n\n &:is(.user-warnings, .user-blocks) {\n & > .tooltip-item-level {\n display: block;\n width: 100%;\n\n border-bottom: 1px solid;\n\n border-radius: 6px 6px 0 0;\n padding: 6px 10px;\n\n font-size: .95em;\n font-weight: 700;\n letter-spacing: .3px;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 120, .25);\n\n color: rgba(255, 255, 120, .95);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 120 .22),\n rgba(255, 255, 120, .08)\n );\n }\n\n & > .tooltip-item-details {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n\n & > :is(.tooltip-item-user, .tooltip-item-time) {\n font-size: .82em;\n font-weight: 400;\n\n opacity: .8;\n\n &.tooltip-item-user {\n /* Theme dependent */\n color: rgba(150, 210, 255, .9);\n }\n &.tooltip-item-time {\n /* Theme dependent */\n color: rgba(220, 225, 235, .9);\n\n & > span:not(:first-of-type) {\n margin-left: 1ex;\n }\n }\n }\n }\n }\n\n & > .tooltip-more {\n border-top: 1px solid;\n\n border-radius: 8px;\n margin-top: 14px;\n padding-top: 10px;\n\n font-size: .92em;\n font-style: italic;\n text-align: center;\n\n opacity: .95;\n\n /* Theme dependent */\n border-top-color: rgba(255, 255, 255, .04);\n\n color: rgba(240, 240, 255, .75);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .015),\n rgba(0, 0, 0, .03)\n );\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n }\n }\n }\n\n .confirmation-modal-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 6);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease-out;\n\n &.closing {\n animation: fade-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal {\n max-width: 500px;\n min-width: 400px;\n\n border: 1px solid;\n\n border-radius: 16px;\n\n word-wrap: break-word;\n\n animation: scale-in .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .7),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: rgba(41, 47, 60, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.closing {\n animation: scale-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal-header {\n border-bottom: 1px solid;\n\n padding: 20px 24px;\n\n /* Theme dependent */\n border-bottom-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-title {\n font-size: 1.2em;\n font-weight: 700;\n }\n }\n\n & > .confirmation-modal-body {\n max-height: 70vh;\n\n padding: 24px;\n\n line-height: 1.5;\n\n overflow: hidden auto;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n\n & > .confirmation-modal-username {\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(91, 154, 255, 1);\n }\n\n & > .confirmation-modal-input {\n width: 100%;\n\n border: 1px solid;\n border-radius: 4px;\n\n margin-top: 10px;\n padding: 8px;\n\n /* Theme dependent */\n color: white;\n border-color: rgba(255, 255, 255, .2);\n background: rgba(0, 0, 0, .3);\n }\n }\n\n & > .confirmation-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n\n border-top: 1px solid;\n\n padding: 16px 24px;\n\n /* Theme dependent */\n border-top-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-footer-right {\n display: flex;\n gap: 12px;\n }\n\n &.confirmation-modal-footer-vertical {\n flex-direction: column;\n align-items: stretch;\n\n & > .confirmation-modal-button {\n width: 100%;\n }\n }\n }\n\n .confirmation-modal-button {\n font-size: .95em;\n font-weight: 500;\n }\n }\n }\n\n .notification-panel {\n pointer-events: none;\n\n display: flex;\n flex-direction: column;\n width: 480px;\n max-height: 600px;\n\n position: absolute;\n left: 15px;\n top: 55px;\n z-index: calc(var(--max-z-index) - 9);\n\n border: 1px solid;\n border-radius: 18px;\n\n overflow: hidden;\n\n opacity: 0;\n\n transform: translateY(-20px) scale(.95);\n\n transition: opacity .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 20px 60px rgba(0, 0, 0, .8),\n 0 0 0 1px rgba(255, 255, 255, .08),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n\n background: rgba(25, 27, 36, .96);\n -webkit-backdrop-filter: blur(25px) brightness(0.95);\n backdrop-filter: blur(25px) brightness(0.95);\n\n a {\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(160, 195, 255, 1);\n }\n\n &:visited {\n /* Theme dependent */\n color: rgba(150, 185, 255, 1);\n }\n }\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n\n & > .notification-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border-bottom: 1px solid;\n\n padding: 18px 22px;\n\n font-size: 1.12em;\n font-weight: 700;\n letter-spacing: 0.3px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .08);\n\n color: rgba(245, 245, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(120, 145, 255, .12),\n rgba(140, 100, 200, .08)\n );\n\n & > .mark-all-read {\n cursor: pointer;\n\n font-size: 0.78em;\n font-weight: 500;\n letter-spacing: 0.2px;\n\n padding: 6px 12px;\n border-radius: 6px;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n background: rgba(120, 170, 255, .08);\n\n &:hover {\n /* Theme dependent */\n background: rgba(120, 170, 255, .15);\n color: rgba(160, 200, 255, 1);\n }\n\n &:active {\n opacity: .85;\n }\n }\n }\n\n & > .notification-list {\n max-height: 520px;\n\n overflow: hidden auto;\n\n padding: 8px;\n\n & > .notifications-empty {\n padding: 40px 20px;\n\n text-align: center;\n\n font-size: 0.95em;\n\n /* Theme dependent */\n color: rgba(120, 125, 145, 1);\n\n & strong {\n /* Theme dependent */\n color: rgba(150, 155, 175, 1);\n }\n }\n\n & > .notification {\n cursor: pointer;\n\n display: flex;\n align-items: flex-start;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 18px;\n margin-bottom: 8px;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(50, 55, 75, .4),\n rgba(40, 45, 65, .3)\n );\n\n &:hover {\n opacity: 1;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .3);\n box-shadow: 0 8px 24px rgba(120, 170, 255, .15),\n inset 0 1px 0 rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(80, 100, 160, .15),\n rgba(70, 85, 145, .1)\n );\n\n transform: translateY(-2px);\n }\n\n &.unread {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .5);\n box-shadow: 0 0 20px rgba(120, 170, 255, .2),\n inset 0 1px 0 rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(120, 170, 255, .1),\n rgba(100, 145, 255, .05)\n );\n }\n\n &.read {\n opacity: .72;\n\n border-color: rgba(255, 255, 255, .04);\n }\n\n & > .notification-icon {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n\n border-radius: 10px;\n\n overflow: hidden;\n\n background: rgba(60, 75, 120, .5);\n\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n & > .notification-content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 5px;\n\n & > .notification-header {\n margin: 0;\n\n font-size: .95rem;\n font-weight: 600;\n letter-spacing: 0.2px;\n\n /* Theme dependent */\n color: rgba(235, 240, 255, 1);\n }\n\n & > .notification-body {\n font-size: .82rem;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 180, 205, 1);\n }\n\n & > .notification-links {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n\n margin-top: 6px;\n\n & > a {\n border: none;\n\n padding: 4px 8px;\n border-radius: 5px;\n\n font-size: .8rem;\n font-weight: 500;\n text-decoration: none;\n\n background: rgba(120, 170, 255, .12);\n opacity: 1;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n color: rgba(140, 185, 255, 1);\n\n &:hover {\n opacity: 1;\n\n background: rgba(120, 170, 255, .22);\n\n /* Theme dependent */\n color: rgba(180, 210, 255, 1);\n }\n\n &:active {\n opacity: .85;\n\n transform: scale(0.98);\n }\n }\n }\n }\n\n & > .notification-right {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n gap: 10px;\n\n & > .notification-unread-indicator {\n cursor: pointer;\n\n width: 12px;\n height: 12px;\n\n border-radius: 50%;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n background: rgba(120, 170, 255, 1);\n box-shadow: 0 0 8px rgba(120, 170, 255, .5);\n\n &:hover, &:focus {\n transform: scale(1.35);\n\n /* Theme dependent */\n box-shadow: 0 0 16px rgba(120, 170, 255, .8);\n }\n }\n\n & > .notification-timestamp {\n font-size: .72rem;\n font-weight: 500;\n\n opacity: .8;\n\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(140, 150, 175, 1);\n }\n }\n }\n }\n }\n\n .icon-count {\n --color: 255, 255, 255;\n --background: 255, 255, 255;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n\n position: absolute;\n right: -11px;\n top: -11px;\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 50%;\n padding: 0 8px;\n\n font-family: sans-serif;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n\n transition: transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(var(--background), .3);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(var(--background), .15);\n\n color: rgba(--color, 1);\n text-shadow: 0 1px 0 rgba(0, 0, 0, .35);\n\n background: linear-gradient(135deg,\n rgba(var(--background), .7),\n rgba(var(--background), .5)\n );\n -webkit-backdrop-filter: blur(6px) brightness(0%);\n backdrop-filter: blur(6px) brightness(0%);\n\n &.red {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 255, 60, 60;\n }\n &.green {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 205, 80;\n }\n &.blue {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 120, 255;\n }\n &.yellow {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 215, 60;\n }\n &.orange {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 165, 60;\n }\n &:is(.gray, .grey) {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 150, 150, 150;\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n transform: scale(0);\n }\n }\n\n .toast-alert {\n display: flex;\n align-items: center;\n gap: 14px;\n max-width: 500px;\n min-width: 320px;\n\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: calc(var(--max-z-index) - 4);\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 20px;\n\n opacity: 0;\n\n transform: translateX(100%) scale(.8);\n\n animation: toast-alert-enter .5s cubic-bezier(.68, -.55, .265, 1.55);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 12px 40px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(25px) saturate(180%);\n backdrop-filter: blur(25px) saturate(180%);\n\n &.success {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(76, 175, 80, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .25)\n );\n }\n &.warning {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(255, 152, 0, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 152, 0, .25),\n rgba(245, 124, 0, .25)\n );\n }\n &.error {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(244, 67, 54, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .25)\n );\n }\n &.dev {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(156, 39, 176, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(156, 39, 176, .25),\n rgba(123, 31, 162, .25)\n );\n }\n\n &.show {\n opacity: 1;\n\n transform: translateX(0) scale(1);\n }\n\n &.hidden {\n animation: toast-alert-leave .4s cubic-bezier(.6, -.28, .735, .045) forwards;\n }\n\n & > .toast-icon {\n flex-shrink: 0;\n\n font-size: 1.8em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .3));\n }\n\n & > .toast-content {\n flex: 1;\n\n & > .toast-title {\n margin-bottom: 4px;\n\n font-size: 1.05em;\n font-weight: 700;\n letter-spacing: .3px;\n }\n\n & > .toast-message {\n font-size: .9em;\n line-height: 1.4;\n\n opacity: .95;\n }\n }\n\n & > .toast-close {\n cursor: pointer;\n\n flex-shrink: 0;\n\n border-radius: 6px;\n padding: 4px;\n\n font-size: 1.3em;\n\n background: transparent;\n opacity: .8;\n\n transition: opacity .2s ease,\n transform .2s ease,\n background .2s ease;\n\n &:hover {\n opacity: 1;\n\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n }\n }\n\n .minor-indicator {\n border: 1px solid;\n\n border-radius: 4px;\n margin-right: 4px;\n padding: 0 4px;\n\n font-size: .9em;\n font-weight: 700;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(153, 153, 153, 1);\n\n background: rgba(60, 64, 76, .9);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n .menu-divider {\n height: 1px;\n\n margin: 6px 8px;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n\n .profanity {\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n margin: 20px;\n padding: 20px;\n\n border-radius: 12px;\n border: 1px solid;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .8);\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .3);\n\n & > .profanity-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n\n padding-bottom: 16px;\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n\n & > .profanity-score {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n & > .score-label {\n font-size: .85em;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n }\n\n & > .score-value {\n font-size: 2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(255, 200, 100, 1);\n }\n }\n\n & > .profanity-risk {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 16px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n background: rgba(60, 64, 76, .6);\n\n &.risk-high {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n background: rgba(211, 47, 47, .2);\n border: 1px solid rgba(211, 47, 47, .4);\n }\n\n &.risk-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border: 1px solid rgba(255, 193, 7, .3);\n }\n\n &.risk-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n background: rgba(66, 165, 245, .15);\n border: 1px solid rgba(66, 165, 245, .3);\n }\n }\n }\n\n & > .profanity-matches-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .profanity-matches-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n & > .profanity-match {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n border-radius: 8px;\n padding: 12px 14px;\n border-left: 3px solid;\n\n transition: background .2s ease,\n border-color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n background: rgba(45, 50, 62, .7);\n border-left-color: rgba(255, 150, 150, .5);\n\n &:hover {\n transform: translateX(4px);\n\n /* Theme dependent */\n background: rgba(50, 56, 70, .85);\n border-left-color: rgba(255, 150, 150, .8);\n }\n\n & > .match-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: .95em;\n\n & > .match-text {\n font-family: 'Courier New', monospace;\n font-weight: 600;\n\n border-radius: 4px;\n padding: 4px 8px;\n\n /* Theme dependent */\n color: rgba(255, 180, 180, 1);\n background: rgba(211, 47, 47, .2);\n }\n\n & > .match-arrow {\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .match-name {\n font-family: 'Courier New', monospace;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n }\n\n & > .match-details {\n display: flex;\n gap: 16px;\n\n & > .match-stat {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n & > .stat-label {\n font-size: .75em;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .stat-value {\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n &.severity-critical {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n }\n &.severity-high {\n /* Theme dependent */\n color: rgba(255, 150, 100, 1);\n }\n\n &.severity-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n &.severity-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n }\n }\n }\n }\n\n & > .match-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n margin-top: 6px;\n padding: 10px 12px;\n border-radius: 6px;\n\n font-size: .85em;\n line-height: 1.5;\n\n /* Theme dependent */\n background: rgba(30, 33, 43, .6);\n border: 1px solid rgba(100, 150, 255, .2);\n\n & > .fa {\n margin-top: 2px;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(100, 150, 255, .8);\n }\n\n & > .note-text {\n flex: 1;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n }\n }\n }\n\n & > .profanity-no-matches {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n padding: 20px;\n\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(100, 200, 100, 1);\n }\n }\n\n & > #settings-container {\n z-index: calc(var(--max-z-index) - 7);\n\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n\n opacity: 0;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n\n & > .settings {\n transform: scale(1);\n }\n }\n\n & > .settings {\n display: flex;\n max-width: 1100px;\n width: 90vw;\n\n border: 1px solid;\n\n border-radius: 20px;\n\n overflow: hidden;\n\n transform: scale(.75);\n\n transition: transform .1s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(30, 33, 42, .95);\n -webkit-backdrop-filter: blur(30px);\n backdrop-filter: blur(30px);\n\n & > div {\n height: 80vh;\n\n &.settings-left {\n width: 250px;\n\n border-right: 1px solid;\n\n padding: 20px 0;\n\n overflow-y: auto;\n\n /* Theme dependent */\n border-right-color: rgba(255, 255, 255, .1);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(255, 255, 255, .05)\n );\n\n & > .settings-category {\n &:not(:last-child) {\n margin-bottom: 20px;\n }\n\n & > .settings-category-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n margin-bottom: 4px;\n padding: 12px 20px;\n\n font-size: .7em;\n font-weight: 800;\n letter-spacing: 1.5px;\n text-transform: uppercase;\n }\n\n & > .settings-left-menu-compact {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n padding: 0 12px;\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 10px;\n padding: 12px;\n\n font-size: 1.2em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:first-child {\n margin-left: 12px;\n }\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n }\n }\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n border-radius: 10px;\n margin: 2px 12px;\n padding: 12px 20px;\n\n font-size: .95em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n & > span > i {\n height: 1em;\n aspect-ratio: 1 / 1;\n\n margin-right: 12px;\n\n text-align: center;\n }\n }\n }\n }\n\n &.settings-right {\n flex: 1;\n\n padding: 20px 30px;\n\n overflow-y: auto;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .5);\n\n & > .hidden {\n display: none;\n }\n\n a {\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n color: rgba(176, 192, 255, 1);\n }\n }\n\n pre, code {\n border-radius: 4px;\n padding: 2px 4px;\n\n font-size: .95em;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n\n .settings-compact-grid {\n & > .compact {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n & > .numeric-input-container {\n & > .numeric-input {\n width: calc(100% - 70px);\n }\n }\n\n & > select {\n width: 100%;\n }\n }\n }\n\n .settings-section, .settings-toggles-section {\n display: block;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 25px;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n\n background: rgba(35, 38, 48, .8);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n .settings-section-title {\n margin-bottom: 5px;\n\n font-size: 1em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n &.collapse-title {\n margin-bottom: 0;\n }\n }\n\n .settings-section-desc {\n margin-bottom: 0;\n\n font-size: .85em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .pad-list {\n margin: 8px 0;\n padding-left: 20px;\n }\n\n &:not(:last-child) {\n margin-bottom: 30px;\n }\n\n &.compact {\n margin-bottom: 0;\n padding: 18px;\n\n & > .settings-section-title {\n font-size: 1.05em;\n\n &.collapse-title {\n margin-bottom: 15px;\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 12px;\n\n font-size: .85em;\n }\n }\n\n &.inline {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .6);\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .settings-section-content {\n flex: 1;\n }\n }\n\n &.collapsed {\n & > .collapse-title::after {\n transform: rotate(-180deg);\n }\n }\n\n & > .collapse-title {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n &::after{\n content: \"\\f077\";\n\n float: right;\n\n font-family: \"Font Awesome 6 Free\";\n font-weight: 900;\n\n transition: transform .2s ease;\n }\n }\n\n & > .collapsible-content {\n padding: initial;\n\n overflow: hidden;\n\n transition: padding .2s ease;\n\n &.collapsed {\n padding: 0;\n }\n }\n\n & > .settings-section-title {\n margin-bottom: 15px;\n\n font-size: 1.4em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 8px;\n }\n }\n\n & > .settings-section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n\n margin-bottom: 15px;\n\n font-size: 1.2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 0;\n }\n\n & > .settings-section-header-icon {\n font-size: 1.3em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .2));\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 20px;\n\n font-size: .95em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .checkbox-container {\n display: flex;\n flex-wrap: wrap;\n\n & > div {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 200px;\n\n margin-bottom: 8px;\n\n &:hover {\n & > .checkbox-box {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .checkbox-box {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: block;\n\n position: relative;\n\n border-radius: 5px;\n\n font-size: .95em;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(213, 213, 213, 1);\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n position: absolute;\n width: 0;\n height: 0;\n\n border-radius: 5px;\n\n opacity: 0;\n\n &:checked ~ .checkmark {\n /* Theme dependent */\n background: linear-gradient(45deg,\n rgba(100, 61, 219, 1),\n rgba(217, 21, 239, 1)\n );\n\n &::after {\n opacity: 1;\n }\n }\n }\n\n & > .checkmark {\n width: 1.3em;\n height: 1.3em;\n\n position: relative;\n left: 0;\n top: 0;\n\n border-radius: 5px;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(204, 204, 204, 1);\n\n &::after {\n content: \"\";\n\n width: .25em;\n height: .5em;\n\n position: absolute;\n left: .45em;\n top: .25em;\n\n border-width: 0 .15em .15em 0;\n border-style: solid;\n\n opacity: 0;\n\n transform: rotate(45deg);\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, 1);\n }\n }\n }\n }\n }\n\n .numeric-input-container {\n display: flex;\n\n & > .numeric-input-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n width: 35px;\n height: 35px;\n\n border: 1px solid;\n\n border-radius: 8px;\n\n font-size: 1.3em;\n\n transition: background .2s ease,\n border-color .2s ease,\n color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .8);\n\n &:hover {\n transform: scale(1.05);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n }\n\n & > .numeric-input {\n width: 100px;\n\n border-radius: 8px;\n margin: 0 5px;\n padding: 6px 12px;\n\n font-size: 1.1em;\n }\n }\n\n .volume-control {\n display: block;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 20px 0;\n padding: 20px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .volume-control-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n\n margin-bottom: 16px;\n\n & > .volume-control-info {\n flex: 1;\n\n & > .volume-control-title {\n margin-bottom: 6px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .volume-control-desc {\n font-size: .9em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .volume-control-preview {\n --background: 123, 143, 245;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 18px;\n\n font-size: .9em;\n font-weight: 500;\n }\n }\n\n & > .volume-control-slider-container {\n display: flex;\n align-items: center;\n gap: 16px;\n\n & > .volume-control-slider {\n flex: 1;\n height: 6px;\n\n outline: none;\n\n border-radius: 3px;\n\n -webkit-appearance: none;\n appearance: none;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n\n &::-webkit-slider-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n\n &::-moz-range-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border: none;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n }\n\n & > .volume-control-input {\n width: 70px;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-size: .95em;\n text-align: center;\n }\n }\n }\n\n .settings-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 60px;\n height: 32px;\n\n position: relative;\n\n &:hover {\n & > .toggle-switch {\n transform: scale(1.02);\n }\n }\n\n &.active {\n & > .toggle-switch {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n & > .toggle-slider {\n left: 30px;\n\n /* Theme dependent */\n box-shadow: 0 4px 10px rgba(0, 0, 0, .3),\n 0 2px 4px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .toggle-switch {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n border: 2px solid;\n\n border-radius: 16px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n\n & > .toggle-slider {\n width: 24px;\n height: 24px;\n\n position: absolute;\n left: 2px;\n top: 2px;\n\n border-radius: 50%;\n\n transition: left .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n 0 1px 2px rgba(0, 0, 0, .15);\n\n background: rgba(255, 255, 255, 1);\n }\n }\n }\n\n .settings-radio-group {\n display: flex;\n flex-direction: row;\n gap: 12px;\n\n border-radius: 100vh;\n padding: 8px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-radio-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n flex: 1;\n\n text-align: center;\n\n border-radius: 100vh;\n padding: 10px 16px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 1);\n }\n\n &.selected {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n color: rgba(224, 224, 224, 1);\n }\n }\n }\n\n .settings-slider {\n display: flex;\n flex-direction: column;\n gap: 14px;\n\n border-radius: 14px;\n padding: 16px 20px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-slider-labels {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n & > .settings-slider-labels > .settings-slider-label-left,\n & > .settings-slider-labels > .settings-slider-label-right {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &.active {\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .percent {\n font-size: .85em;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n }\n\n & > .settings-slider-labels > .settings-slider-label-right {\n text-align: right;\n }\n\n & > .settings-slider-track {\n cursor: pointer;\n\n height: 8px;\n\n position: relative;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n &::before {\n content: '';\n\n width: var(--fill, 50%);\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .6),\n rgba(118, 75, 162, .6)\n );\n }\n\n & > .settings-slider-thumb {\n cursor: grab;\n\n width: 22px;\n height: 22px;\n\n position: absolute;\n top: 50%;\n\n border: 2px solid;\n\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n transition: transform .15s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .4),\n 0 0 12px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: translate(-50%, -50%) scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 12px rgba(0, 0, 0, .5),\n 0 0 20px rgba(102, 126, 234, .5);\n }\n\n &:active, &.dragging {\n cursor: grabbing;\n\n transform: translate(-50%, -50%) scale(1.2);\n\n /* Theme dependent */\n box-shadow: 0 4px 16px rgba(0, 0, 0, .5),\n 0 0 24px rgba(102, 126, 234, .6);\n }\n }\n }\n }\n\n .palette-selector {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n\n margin-top: 20px;\n\n & > .palette-option {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 12px;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 20px rgba(20, 20, 30, .4);\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4);\n }\n\n & > .palette-name {\n pointer-events: none;\n\n font-size: .9em;\n font-weight: 600;\n text-align: center;\n }\n\n & > .palette-preview {\n pointer-events: none;\n\n display: flex;\n gap: 4px;\n height: 40px;\n\n border-radius: 8px;\n margin-bottom: 12px;\n\n overflow: hidden;\n\n & > canvas {\n flex: 1;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .tracklist {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n\n & > .track {\n position: relative;\n\n border-radius: 8px;\n\n overflow: hidden;\n\n & > .thumbnail {\n display: block;\n width: 100%;\n aspect-ratio: 1 / 1;\n\n overflow: hidden;\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n\n overflow: hidden;\n }\n }\n\n & > .info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n\n padding: 10px 12px;\n\n /* Theme dependent */\n background: linear-gradient(180deg,\n rgba(0, 0, 0, 0),\n rgba(0, 0, 0, .35),\n rgba(0, 0, 0, .65)\n );\n\n & > .title {\n font-size: .95em;\n font-weight: 600;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n\n color: rgba(255, 255, 255, 1);\n }\n\n & > :is(.artist, .length) {\n font-size: .8em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n }\n }\n\n & > .preview-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0;\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n top: 8px;\n\n border-radius: 50%;\n padding: 0;\n }\n }\n }\n\n .control-container {\n border: 1px solid;\n\n border-radius: 12px;\n margin-bottom: 15px;\n padding: 18px 22px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .control-container-title {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.margin-top {\n margin-top: 10px;\n }\n }\n\n & > .control-keys {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n & > div {\n display: flex;\n align-items: center;\n width: max-content;\n\n border: 1px solid;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-weight: 500;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .3);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .9);\n\n &:not(.key-select):hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(60, 64, 78, .95);\n }\n\n &.key-select {\n border: 2px dashed;\n\n font-style: italic;\n\n /* Theme dependent */\n border-color: rgba(192, 192, 192, .6);\n box-shadow: 0 0 10px rgba(192, 192, 192, .4);\n\n background: rgba(192, 192, 192, .1);\n }\n\n &.duplicate {\n border: 2px dashed;\n\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n box-shadow: 0 0 10px rgba(255, 87, 34, .5);\n\n background: rgba(255, 87, 34, .1);\n }\n\n & > .key-elem-title {\n margin-right: 10px;\n }\n\n &.add, & > .remove {\n cursor: pointer;\n }\n }\n }\n\n & > .control-actions {\n .control-action {\n border-left: 2px solid;\n\n margin-top: 12px;\n padding-left: 16px;\n\n /* Theme dependent */\n border-left-color: rgba(102, 126, 234, .5);\n\n & > .control-action-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n margin-bottom: 8px;\n\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n span {\n margin-right: 5px;\n }\n\n & > .control-action-title-left {\n white-space: nowrap;\n\n overflow-x: auto;\n\n & > span {\n width: 17px;\n }\n\n & > select {\n border-radius: 6px;\n margin: 0 5px;\n padding: 6px 10px;\n }\n\n & > .params {\n font-size: .85em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n & > .condition-parameter {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n margin: 0 4px;\n\n & > select,\n & > input:not([type=checkbox]) {\n border-radius: 6px;\n padding: 6px 10px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n }\n }\n }\n\n & > .control-action-title-right {\n display: flex;\n\n & > span {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display:flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n\n border-radius: 5px;\n margin-right: 0;\n\n font-size: 1.2em;\n\n transition: background .1s ease;\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n }\n }\n }\n\n & > .action-parameter {\n border: 1px solid;\n\n border-radius: 8px;\n margin-top: 10px;\n padding: 12px 14px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .3);\n\n & > .parameter-title {\n margin-bottom: 8px;\n\n font-size: .9em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n\n & > select,\n & > input:not([type=checkbox]),\n & > duration-input {\n width: 100%;\n\n border-radius: 6px;\n padding: 8px 12px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 20px;\n height: 20px;\n }\n }\n }\n\n & > .control-bottom-container {\n display: flex;\n justify-content: space-between;\n\n margin-top: 10px;\n\n & > div {\n display: flex;\n\n & > .add-action-button {\n width: max-content;\n\n border-radius: 8px;\n padding: 8px 16px;\n\n font-weight: 500;\n }\n }\n }\n }\n }\n\n .text-input-container {\n display: flex;\n gap: 12px;\n\n border-style: 2px dashed;\n\n border-radius: 12px;\n margin-top: 18px;\n padding: 16px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .35);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 0.15),\n rgba(118, 75, 162, 0.15)\n );\n\n & > input[type=\"text\"] {\n flex: 1;\n\n border-style: dashed;\n\n border-radius: 10px;\n padding: 10px 16px;\n\n font-size: .95em;\n\n &:focus {\n border-style: solid;\n }\n }\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n\n margin-top: 20px;\n\n & > .stat-card {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n width: 100%;\n height: 150px;\n\n background-color: transparent;\n\n perspective: 1000px;\n\n transition: transform .3s ease;\n\n &:hover, &:active {\n transform: scale(1.05);\n\n & > .inside {\n transform: rotateY(180deg);\n\n &::before {\n opacity: 1;\n }\n }\n }\n\n & > .inside {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n transform-style: preserve-3d;\n\n transition: transform 0.8s linear(\n 0, 0.005, 0.02 2.2%, 0.046 4.5%, 0.182 11.5%,\n 0.318 16.3%, 0.459 20.6%, 0.601 24.6%, 0.738 28.6%,\n 0.863 32.7%, 0.954 37%, 1.015 41.8%, 1.049 47.4%,\n 1.059, 1.047 57.3%, 1.03 63.5%, 1.012 70.9%,\n 1.002 79.5%, 1\n );\n\n &::before {\n inset: -2px;\n\n border-radius: 14px;\n padding: 2px;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n }\n\n & > :is(.front, .back) {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n position: absolute;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n text-align: center;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .25);\n\n &.front {\n justify-content: center;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .15),\n rgba(118, 75, 162, .15)\n );\n }\n &.back {\n transform: rotateY(180deg);\n\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(118, 75, 162, .15),\n rgba(102, 126, 234, .15)\n );\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 4px;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .4);\n }\n &::-webkit-scrollbar-track {\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n }\n\n & > .stat-value {\n margin-bottom: 8px;\n\n font-size: 2.2em;\n font-weight: 700;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n /* Theme independent */\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .stat-label {\n margin-bottom: 4px;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .stat-sublabel {\n font-size: .8em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n &:not(:last-child) {\n margin-bottom: 8px;\n }\n }\n }\n }\n }\n }\n\n .changelog-content {\n & > .changelog-header {\n border-bottom: 2px solid;\n\n padding-bottom: 24px;\n margin-bottom: 8px;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n & > h1 {\n margin: 0 0 10px 0;\n\n font-size: 2.5em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n\n & > i {\n margin-right: 12px;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > .changelog-subtitle {\n margin: 0 0 20px 0;\n\n font-size: 1.1em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .9);\n }\n\n & > .changelog-nav {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n gap: 8px;\n\n & > .changelog-nav-item {\n cursor: pointer;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 6px 16px;\n\n font-size: .85em;\n font-weight: 600;\n text-decoration: none;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(200, 200, 200, .9);\n background: rgba(102, 126, 234, .08);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n color: rgba(255, 255, 255, 1);\n background: rgba(102, 126, 234, .2);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .3),\n rgba(118, 168, 255, .3)\n );\n box-shadow: 0 0 12px rgba(102, 126, 234, .3);\n }\n }\n }\n }\n\n & > .changelog-divider {\n height: 2px;\n\n margin: 48px auto 8px;\n\n border-radius: 1px;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(102, 126, 234, .4) 20%,\n rgba(118, 168, 255, .4) 50%,\n rgba(102, 126, 234, .4) 80%,\n transparent\n );\n }\n\n & > .changelog-version {\n margin-top: 32px;\n padding: 24px;\n\n border: 1px solid;\n border-radius: 16px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(30, 33, 42, .4);\n\n & > .changelog-version-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n\n border-bottom: 1px solid;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n & > .version-badge-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n margin-bottom: 12px;\n\n & > .version-badge {\n display: inline-block;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 4px 16px;\n\n font-size: .8em;\n font-weight: 700;\n font-family: 'Courier New', monospace;\n letter-spacing: .5px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(118, 168, 255, 1);\n background: rgba(102, 126, 234, .12);\n }\n\n & > .version-tag {\n display: inline-block;\n\n border-radius: 20px;\n padding: 4px 12px;\n\n font-size: .7em;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 1px;\n\n &.latest {\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .4);\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 1.6em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .changelog-version-subtitle {\n margin: 0;\n\n font-size: .9em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .7);\n\n & > i {\n margin-right: 4px;\n }\n }\n }\n\n & > .changelog-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: 24px;\n\n margin: 0 auto;\n padding: 0;\n\n & > .card {\n position: relative;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n overflow: hidden;\n\n transition: border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n background: rgba(40, 43, 52, .6);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &::before {\n content: '';\n\n height: 3px;\n\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n }\n\n &:hover {\n transform: translateY(-4px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5),\n 0 0 0 1px rgba(102, 126, 234, .2);\n\n background: rgba(40, 43, 52, .85);\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n transform: scale(1.1) rotate(5deg);\n }\n }\n\n &.featured {\n grid-column: 1 / -1;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: linear-gradient(135deg,\n rgba(40, 43, 52, .8),\n rgba(50, 53, 62, .8)\n );\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 168, 255, .25)\n );\n }\n }\n\n & > .card-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n\n border-radius: 12px;\n margin-bottom: 16px;\n\n transition: transform .3s ease;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n\n & > i {\n font-size: 24px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 168, 255, 1)\n );\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > h2 {\n margin: 0 0 12px 0;\n\n font-size: 1.35em;\n font-weight: 700;\n letter-spacing: -0.02em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .95);\n }\n\n & > p {\n margin: 0 0 16px 0;\n\n font-size: .95em;\n line-height: 1.6em;\n\n /* Theme dependent */\n color: rgba(118, 168, 255, .9);\n }\n\n & > ul {\n margin: 0;\n padding-left: 24px;\n\n font-size: .9em;\n line-height: 1.7em;\n\n /* Theme dependent */\n color: rgba(229, 229, 229, .9);\n\n & > li {\n margin-bottom: 8px;\n padding-left: 4px;\n\n &::marker {\n /* Theme dependent */\n color: rgba(102, 126, 234, .8);\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n & > strong {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n }\n\n & > code {\n border-radius: 4px;\n padding: 2px 6px;\n\n font-family: 'Courier New', monospace;\n font-size: .9em;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n color: rgba(118, 168, 255, 1);\n }\n\n & > ul {\n margin-top: 6px;\n padding-left: 20px;\n\n & > li {\n font-size: .95em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .85);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .about-content {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 0;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .25);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(30, 33, 42, .95),\n rgba(25, 28, 36, .9)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & > .about-version {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n\n padding: 32px;\n\n font-size: 1.3em;\n font-weight: 700;\n letter-spacing: .5px;\n\n /* Theme dependent */\n box-shadow: 0 4px 20px rgba(143, 163, 255, .25),\n inset 0 1px 0 rgba(255, 255, 255, .15),\n inset 0 -1px 0 rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .25),\n rgba(118, 75, 162, .2)\n );\n\n & > .fa {\n font-size: 1.5em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n filter: drop-shadow(0 2px 8px rgba(143, 163, 255, .6));\n }\n }\n\n & > .about-tagline {\n padding: 24px 32px;\n\n text-align: center;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 255, .08);\n\n & > p {\n margin: 0;\n\n font-size: 1.05em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(180, 185, 200, 1);\n }\n }\n\n & > .about-links {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n padding: 16px;\n\n & > .link-card {\n display: flex;\n align-items: center;\n gap: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n margin-bottom: 12px;\n padding: 16px 20px;\n\n text-decoration: none;\n\n transition:\n border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease,\n border-left-color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n border-left: 3px solid rgba(143, 163, 255, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .6) 40%\n );\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &:hover {\n transform: translateX(6px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .5);\n border-left-color: rgba(143, 163, 255, .8);\n box-shadow: 0 6px 24px rgba(143, 163, 255, .2),\n 0 2px 12px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .15),\n rgba(118, 75, 162, .08) 50%\n );\n\n & > .link-card-icon {\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .25);\n }\n\n & > .link-card-arrow {\n transform: translateX(4px);\n\n opacity: 1;\n }\n }\n\n & > .link-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n\n border-radius: 10px;\n\n font-size: 1.3em;\n\n transition:\n transform .3s ease,\n background .3s ease;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .15);\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .link-card-content {\n flex: 1;\n text-align: left;\n\n & > .link-card-title {\n margin-bottom: 4px;\n\n font-size: 1em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .link-card-desc {\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n & > .link-card-arrow {\n font-size: 1.2em;\n\n opacity: .5;\n\n transition:\n transform .3s ease,\n opacity .3s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .about-footer {\n padding: 0;\n\n & > .footer-divider {\n height: 1px;\n\n margin: 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(143, 163, 255, .3) 20%,\n rgba(143, 163, 255, .3) 80%,\n transparent\n );\n }\n\n & > .about-credits {\n padding: 24px;\n\n & > div {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(max(280px, calc(50% - 6px)), 1fr));\n gap: 12px;\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .credit-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n border-radius: 14px;\n padding: 14px 16px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n border-top: 2px solid rgba(143, 163, 255, .18);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .4) 30%\n );\n\n &:hover {\n transform: translateY(-3px) scale(1.01);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n border-top-color: rgba(143, 163, 255, .5);\n box-shadow: 0 6px 20px rgba(143, 163, 255, .18),\n 0 2px 8px rgba(0, 0, 0, .25);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .1),\n rgba(40, 43, 52, .6) 40%\n );\n }\n\n & > .credit-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n\n border-radius: 50%;\n\n font-size: 1.1em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .15)\n );\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .credit-info {\n flex: 1;\n min-width: 0;\n text-align: left;\n\n & > .credit-name {\n position: relative;\n overflow: hidden;\n\n margin-bottom: 2px;\n\n font-size: .95em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n & > span {\n display: inline-block;\n white-space: nowrap;\n }\n }\n\n & > .credit-role {\n font-size: .8em;\n line-height: 1.4;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n &:hover {\n & > .credit-info {\n & > .credit-name > span {\n animation: scroll-text 3s linear infinite;\n }\n }\n }\n }\n\n & > .copyright-card {\n cursor: pointer;\n\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n text-align: center;\n overflow: hidden;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: rgba(35, 38, 46, .3);\n\n & > .copyright-title {\n margin-bottom: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > .copyright-desc {\n font-size: .75em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(140, 140, 140, 1);\n }\n }\n }\n }\n }\n }\n\n &#ollama-server-url {\n & > .connection-status-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n &:has(#settings-ollama-connection-status:empty) {\n display: none;\n }\n\n &.testing {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.connected {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .7);\n box-shadow: 0 2px 8px rgba(76, 175, 80, .4);\n\n background: rgba(76, 175, 80, .1);\n }\n &.failed {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > #settings-connection-status {\n font-size: .9em;\n }\n }\n }\n\n &#ollama-model-select {\n .models-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n text-align: center;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n &.searching {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .7);\n box-shadow: 0 2px 8px rgba(143, 163, 255, .4);\n\n background: rgba(143, 163, 255, .1);\n }\n &.none {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.error {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > p {\n font-size: .9em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n & > #settings-ollama-models {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 8px;\n\n &:not(:empty) {\n margin-top: 8px;\n }\n\n & > .model {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 12px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(50, 54, 66, .9);\n }\n\n &.selected {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 0 15px rgba(143, 163, 255, .5);\n\n background: rgba(143, 163, 255, .1);\n\n & > .model-top {\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .model-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n\n & > .fa {\n /* Theme dependent */\n color: rgba(128, 128, 128, .5);\n }\n\n & > .model-name {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .pseudo-indicator {\n pointer-events: none;\n\n opacity: 0;\n }\n }\n\n & > .model-bottom {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n }\n }\n }\n\n &#ollama-setup {\n & > .settings-section-title {\n /* Theme dependent */\n color: rgba(255, 54, 34, 1);\n }\n & > .settings-section-desc {\n border-left: 4px solid;\n\n border-radius: 6px;\n padding: 10px;\n\n /* Theme dependent */\n border-left-color: rgba(255, 193, 7, 1);\n\n background: rgba(255, 193, 7, .125);\n\n color: rgba(225, 225, 225, 1);\n }\n }\n\n &.save {\n & > .save-settings-header {\n margin-bottom: 16px;\n }\n\n & > .save-settings-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .save-settings-card {\n border: 1px solid;\n border-radius: 12px;\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .5);\n box-shadow: 0 2px 12px rgba(0, 0, 0, .2);\n\n transition: border-color .3s ease, box-shadow .3s ease;\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n }\n\n & > .card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(50, 54, 66, .6),\n rgba(40, 43, 52, .6)\n );\n border-bottom: 1px solid rgba(255, 255, 255, .06);\n\n & > .card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 10px;\n\n font-size: 1.25em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(143, 163, 255, .15);\n }\n\n & > .card-header-content {\n flex: 1;\n\n & > .card-title {\n font-size: 1.1em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(232, 232, 232, 1);\n }\n\n & > .card-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n }\n }\n\n & > .card-toggle {\n flex-shrink: 0;\n }\n }\n\n & > .card-body {\n padding: 12px;\n\n & > .action-buttons-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n\n & > .action-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(46, 52, 66, .6);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .25);\n background: rgba(56, 62, 76, .7);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n }\n\n & > .action-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 8px;\n\n font-size: 1.15em;\n flex-shrink: 0;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n\n & > .action-card-content {\n flex: 1;\n\n & > .action-card-title {\n font-size: .95em;\n font-weight: 600;\n margin-bottom: 1px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .action-card-desc {\n font-size: .85em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n &.export-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .2),\n rgba(56, 142, 60, .2)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.import-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .5);\n background: rgba(76, 175, 80, .1);\n\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .3),\n rgba(56, 142, 60, .3)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n }\n\n &.reset-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .2),\n rgba(183, 28, 28, .2)\n );\n color: rgba(211, 47, 47, 1);\n }\n }\n }\n }\n\n & > .status-message {\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n animation: scale-in .3s ease;\n\n &.hidden {\n display: none;\n }\n\n & > .status-content {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n & > .status-icon {\n font-size: 1.25em;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n & > .status-text {\n flex: 1;\n\n & > .status-title {\n font-size: .95em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(240, 240, 240, 1);\n }\n\n & > .status-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(210, 210, 210, 1);\n }\n }\n }\n\n &.success {\n /* Theme dependent */\n border: 1px solid rgba(76, 175, 80, .4);\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .15),\n rgba(56, 142, 60, .1)\n );\n box-shadow: 0 4px 16px rgba(76, 175, 80, .2);\n\n & > .status-content > .status-icon {\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.error {\n /* Theme dependent */\n border: 1px solid rgba(211, 47, 47, .4);\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .15),\n rgba(183, 28, 28, .1)\n );\n box-shadow: 0 4px 16px rgba(211, 47, 47, .2);\n\n & > .status-content > .status-icon {\n color: rgba(211, 47, 47, 1);\n }\n }\n\n &.info {\n /* Theme dependent */\n border: 1px solid rgba(255, 193, 7, .4);\n background: linear-gradient(135deg,\n rgba(255, 193, 7, .15),\n rgba(255, 152, 0, .1)\n );\n box-shadow: 0 4px 16px rgba(255, 193, 7, .2);\n\n & > .status-content > .status-icon {\n color: rgba(255, 193, 7, 1);\n }\n }\n }\n\n & > .import-textarea {\n width: 100%;\n min-height: 140px;\n\n border: 2px solid;\n\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n font-family: 'Courier New', Consolas, monospace;\n font-size: .88em;\n line-height: 1.6;\n\n resize: vertical;\n\n animation: scale-in .3s ease;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n background: rgba(20, 23, 32, .8);\n color: rgba(220, 220, 220, 1);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3);\n\n &:focus {\n outline: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .6);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3),\n 0 0 0 3px rgba(143, 163, 255, .15);\n }\n\n &.hidden {\n display: none;\n }\n\n &::placeholder {\n /* Theme dependent */\n color: rgba(130, 130, 130, 1);\n }\n }\n }\n }\n }\n }\n\n .list-container {\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border: 1px solid;\n\n border-radius: 8px;\n margin-bottom: 8px;\n padding: 8px;\n padding-left: 15px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n &.empty {\n padding: 20px;\n\n text-align: center;\n\n opacity: .6;\n }\n\n & > div {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n a > {\n font-weight: 600;\n word-break: break-all;\n }\n\n & > span {\n font-size: .85em;\n\n opacity: .7;\n }\n\n & > .add-action-button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n\n border-radius: 6px;\n\n font-size: 1em;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n\n &.remove-button {\n /* Theme dependent */\n background: rgba(211, 47, 47, .1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(211, 47, 47, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(211, 47, 47, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n }\n }\n }\n }\n }\n\n .settings-compact-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 18px;\n\n margin-bottom: 25px;\n }\n\n .draggable-order-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n\n &.is-dragging .draggable-order-item {\n pointer-events: none;\n\n &:hover {\n transform: none;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: none;\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n opacity: .5;\n\n color: inherit;\n }\n }\n }\n\n & > .draggable-order-item-wrapper {\n position: relative;\n\n transition: transform .2s cubic-bezier(0.2, 0, 0, 1);\n\n &.dragging {\n z-index: 4;\n\n &::after {\n content: '';\n\n width: 100%;\n height: 100%;\n\n border: 2px dashed;\n\n border-radius: 10px;\n\n position: absolute;\n top: 0;\n left: 0;\n\n pointer-events: none;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4),\n inset 0 0 20px rgba(102, 126, 234, .15);\n\n background: rgba(102, 126, 234, .1);\n }\n\n & > .draggable-order-item {\n visibility: hidden;\n }\n }\n }\n\n .draggable-order-item {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 10px;\n padding: 14px 18px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n content: '\\f0c9';\n\n font-family: 'Font Awesome 6 Free';\n font-size: .9em;\n font-weight: 900;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n color .2s ease;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 6px 24px rgba(0, 0, 0, .4);\n\n background: rgba(50, 54, 66, .9);\n\n &::before {\n opacity: .8;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n &:active {\n cursor: grabbing;\n\n transform: scale(1.02);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n box-shadow: 0 8px 32px rgba(102, 126, 234, .3);\n\n background: rgba(60, 65, 80, .95);\n }\n\n &.disabled {\n opacity: .5;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .05);\n\n background: rgba(30, 32, 38, .6);\n\n & > .draggable-order-item-name {\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .draggable-order-item-toggle {\n /* Theme dependent */\n background: rgba(80, 80, 80, .5);\n\n &::before {\n transform: translateX(0);\n\n /* Theme dependent */\n background: rgba(120, 120, 120, 1);\n }\n }\n\n &:hover {\n opacity: .7;\n\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n }\n }\n\n & > .draggable-order-item-name {\n flex: 1;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(230, 230, 230, 1);\n }\n\n & > .draggable-order-item-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 44px;\n height: 24px;\n\n border-radius: 100vh;\n\n position: relative;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 75, 162, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .3);\n\n &::before {\n content: '';\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n position: absolute;\n top: 3px;\n left: 3px;\n\n transform: translateX(20px);\n\n transition: transform .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, .2);\n }\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5);\n }\n }\n }\n }\n }\n }\n }\n }\n\n select, input:not([type=range]), textarea, button {\n border: 1px solid transparent;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-family: inherit;\n font-size: inherit;\n color: var(--color, inherit);\n\n transition: border .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 8px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .3), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .9);\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .4), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), 1);\n }\n &:not(input, textarea):active {\n /* Theme dependent */\n box-shadow: 0 1px 4px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .2), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .95);\n }\n\n &[type=number] {\n -moz-appearance: textfield;\n appearance: textfield;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n appearance: none;\n\n margin: 0;\n }\n }\n }\n\n button {\n cursor: pointer !important;\n\n &:hover {\n transform: translateY(-2px);\n }\n &:active {\n transform: translateY(0);\n }\n }\n\n duration-input {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n font-family: inherit;\n font-size: .9em;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n background: rgba(40, 43, 52, .7);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n background: rgba(40, 43, 52, .85);\n }\n\n & > .infinity-label {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 10px 14px;\n\n font-weight: 500;\n font-size: .95em;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(220, 220, 220, 1);\n background: rgba(35, 38, 48, .6);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2);\n\n &::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n\n position: absolute;\n top: 50%;\n right: 12px;\n\n font-size: 13px;\n line-height: 1;\n\n opacity: 0;\n transform: translateY(-50%) scale(0);\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n & > span {\n flex: 1;\n letter-spacing: .3px;\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(45, 48, 58, .8);\n box-shadow: 0 3px 10px rgba(0, 0, 0, .3);\n }\n\n &.selected {\n border-color: rgba(102, 126, 234, .5);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .2) 0%,\n rgba(118, 75, 162, .2) 100%\n );\n box-shadow: 0 3px 12px rgba(102, 126, 234, .25),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n &::after {\n opacity: 1;\n transform: translateY(-50%) scale(1);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .6);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25) 0%,\n rgba(118, 75, 162, .25) 100%\n );\n box-shadow: 0 4px 16px rgba(102, 126, 234, .35),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n }\n }\n }\n\n & > .duration-inputs {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n\n opacity: 1;\n transform: scale(1);\n\n transition: opacity .2s ease,\n transform .2s cubic-bezier(.4, 0, .2, 1);\n\n & > label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n\n & > span {\n font-size: .75em;\n font-weight: 600;\n letter-spacing: .5px;\n text-align: center;\n text-transform: uppercase;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .85);\n }\n\n & > input {\n cursor: text;\n\n width: 100%;\n\n border: 1px solid;\n border-radius: 6px;\n padding: 8px 10px;\n\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: .95em;\n font-weight: 500;\n text-align: center;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(230, 230, 230, 1);\n background: rgba(30, 33, 42, .9);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n\n &::placeholder {\n color: rgba(150, 154, 170, .6);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(35, 38, 48, 1);\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &:focus {\n outline: none;\n border-color: rgba(102, 126, 234, .6);\n background: rgba(40, 43, 52, 1);\n box-shadow: 0 0 0 2px rgba(102, 126, 234, .2),\n 0 2px 10px rgba(102, 126, 234, .15),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n }\n }\n\n &:has(.infinity-label.selected) > .duration-inputs {\n opacity: .4;\n transform: scale(.98);\n pointer-events: none;\n }\n }\n\n #reset-statistics-button {\n float: right;\n\n font-size: 1rem;\n\n /* Theme dependent */\n --background: 211, 51, 51;\n }\n\n #settings-ollama-refresh-models {\n float: right;\n\n font-size: 1rem;\n }\n }\n\n .ws-username-highlight {\n position: relative;\n\n &::before {\n content: \"\";\n\n pointer-events: none;\n\n position: absolute;\n inset: 0;\n\n border-radius: 10px;\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n }\n }\n}"},4192(e,t){function n(){return crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}Object.defineProperty(t,"__esModule",{value:!0}),t.generateRandomUUID=function(){return 0===s.length?n():s.pop()};const s=[];"function"==typeof requestIdleCallback&&requestIdleCallback(function e(){s.length<256&&s.push(n()),requestIdleCallback(e)})},4041(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.CreateDOMElement=function(e,t={}){const n=document.createElement(e);"id"in t&&(n.id=t.id);"class"in t&&(n.className=t.class);"text"in t&&(n.textContent=t.text);"html"in t&&(n.innerHTML=t.html);"content"in t&&n.append(t.content);"value"in t&&(n.value=t.value);if("attributes"in t)for(const[e,s]of Object.entries(t.attributes||{}))n.setAttribute(e,s);if("dataset"in t)for(const[e,s]of Object.entries(t.dataset||{}))n.dataset[e]=s;if("style"in t)for(const[e,s]of Object.entries(t.style||{}))n.style.setProperty(e,s);return n}},5643(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.fullTrim=void 0;t.fullTrim=e=>{const t=e.split("\n"),n=t.length;let s=!0,i=1/0,a=[],r=[];for(let e=0;e<n;e++){const n=t[e];if(""===n.trim()){if(s)continue;a.push("")}else{s?s=!1:(r=r.concat(a),a=[]);const e=n.match(/^(\s*)/)[0].length;i=Math.min(i,e),r.push(n)}}const o=r.length;if(0===o)return"";const l=[];for(let e=0;e<o;e++){const t=r[e].trimEnd();""===t?l.push(""):l.push(t.slice(i))}return l.join("\n")}},2852(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Memory=void 0;t.Memory=class{constructor(e={}){this.order=[],this.store=new Map,this.timeouts=new Map,"timeout"in e&&(this.timeout=e.timeout),"size"in e&&(this.maxSize=e.size)}clear(){this.order=[],this.store.clear(),this.timeouts.clear()}has(e){return this.store.has(e)}get(e){return this.store.get(e)}set(e,t){const n=this.order.indexOf(e);-1!==n&&this.order.splice(n,1),this.order.push(e),this.store.set(e,t),this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e)),void 0!==this.timeout&&this.timeouts.set(e,setTimeout(()=>{this.delete(e)},this.timeout)),void 0!==this.maxSize&&this.store.size>this.maxSize&&this.delete(this.order.shift())}add(e){this.store.has(e)||this.set(e,!0)}delete(e){const t=this.order.indexOf(e);-1!==t&&this.order.splice(t,1),this.store.delete(e),clearTimeout(this.timeouts.get(e)),this.timeouts.delete(e)}size(){return this.store.size}}},2595(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Stack=void 0;t.Stack=class{constructor(e=50){this.items=[],this.maxSize=e}push(e){this.items.push(e),this.items.length>this.maxSize&&this.items.shift()}pop(){return this.items.pop()}unshift(e){this.items.unshift(e),this.items.length>this.maxSize&&this.items.pop()}shift(){return this.items.shift()}peek(){return this.items[this.items.length-1]}clear(){this.items=[]}get length(){return this.items.length}set length(e){this.items.length=Math.min(e,this.maxSize)}}},6873(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Trie=void 0;var s=n(4192);function i(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function a(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var r=new WeakSet;function o(e){var t;this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e)),this.timeouts.delete(e);const n=this.order[e];delete this.order[e];const s=[{children:this.store}];let i=this.store;for(const e of n){const t=i.get(e);s.push(t),i=t.children}const a=s.pop();if(a.defined=!1,delete a.value,!((null===(t=a.children)||void 0===t?void 0:t.size)>0))for(let e=s.length-1;e>=0;e--){const t=s[e],i=n.pop();if(t.children.delete(i),t.children.size>0||t.defined)break;t.terminal=!0,delete t.children}}t.Trie=class{constructor(e={}){i(this,r),this.order={},this.store=new Map,this.timeouts=new Map,"timeout"in e&&(this.timeout=e.timeout),"size"in e&&(this.maxSize=e.size)}clear(){this.order={},this.store.clear(),this.timeouts.clear()}has(...e){var t;const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return!1;const e=s.get(t);if(e.terminal)return!1;s=e.children}return!0===(null===(t=s.get(n))||void 0===t?void 0:t.defined)}get(...e){var t;const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.value}set(...e){var t;const n=e.pop();let i=((e,t)=>{const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.UUID})(e);delete this.order[i],void 0===i&&(i=(0,s.generateRandomUUID)());const l=e.pop();let d=this.store;for(const t of e)if(d.has(t)){var c;const e=d.get(t);e.terminal=!1,null!==(c=e.children)&&void 0!==c||(e.children=new Map),d=e.children}else{const e={defined:!1,terminal:!1,children:new Map};d.set(t,e),d=e.children}const u=null!==(t=d.get(l))&&void 0!==t?t:{terminal:!0};u.UUID=i,u.defined=!0,u.value=n,d.set(l,u),this.order[i]=e.concat([l]),this.timeouts.has(i)&&clearTimeout(this.timeouts.get(i)),void 0!==this.timeout&&this.timeouts.set(i,setTimeout(()=>{a(r,this,o).call(this,i)},this.timeout)),void 0!==this.maxSize&&Object.keys(this.order).length>this.maxSize&&a(r,this,o).call(this,this.order.shift())}add(e){this.store.has(e)||this.set(e,!0)}delete(...e){const t=((e,t)=>{const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.UUID})(e);void 0!==t&&a(r,this,o).call(this,t)}size(){return Object.keys(this.order).length}}},4551(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.truncate=function(e,t){return e.length>t?`${e.substring(0,t-3).trimEnd()}...`:e}},1289(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.convertToUTCString=void 0;t.convertToUTCString=e=>`${e.getUTCFullYear().toString().padStart(4,"0")}-${(e.getUTCMonth()+1).toString().padStart(2,"0")}-${e.getUTCDate().toString().padStart(2,"0")}T${e.getUTCHours().toString().padStart(2,"0")}:${e.getUTCMinutes().toString().padStart(2,"0")}:${e.getUTCSeconds().toString().padStart(2,"0")}`},8678(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Ollama=t.AI=void 0;var s=n(4018),i=n(5643);function a(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o=new WeakSet;class l{static registerProvider(e,t){l.providers[e]=t}setup(e,t){if(this.analysis[e].has(t.id)){const n=this.analysis[e].get(t.id);return n.count++,n.request}const n=new AbortController,s=this.fetch(e,t,n.signal);return this.analysis[e].set(t.id,{request:s,abortController:n,count:1}),s.finally(()=>{this.analysis[e].delete(t.id)}),s}async fetch(e,t,n){return{error:"No service has been selected"}}constructor(e,t){a(this,o),r(this,"analysis",{edit:new Map,username:new Map}),r(this,"cache",{username:new Set}),r(this,"analyze",{edit:e=>this.setup("edit",e),username:e=>this.cache.username.has(e.user.name)?Promise.resolve({flag:!1,confidence:1,issues:[],explanation:"Username previously analyzed."}):(this.cache.username.add(e.user.name),this.setup("username",e))}),r(this,"cancel",{all:(e=!0)=>{if(!0===e)for(const e of Object.keys(this.analysis))for(const n of null===(t=this.analysis[e])||void 0===t?void 0:t.keys()){var t;this.cancel[e](n)}else for(const t of null===(n=this.analysis[e])||void 0===n?void 0:n.keys()){var n;this.cancel[e](t)}},edit:e=>{const t=this.analysis.edit.get(e);t&&(t.count--,t.count<=0&&(t.abortController.abort("Edit analysis canceled by user"),this.analysis.edit.delete(e)))},username:e=>{const t=this.analysis.username.get(e);t&&(t.count--,t.count<=0&&(t.abortController.abort("Username analysis canceled by user"),this.analysis.username.delete(e)))}}),r(this,"prompt",{edit:async e=>{var t,n;const a=function(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}(o,this,d).call(this,e.diff),r=null!==(t=s.namespaces.find(t=>t.id===e.ns))&&void 0!==t?t:s.namespaces[0];let l="registered";e.user.temp?l="temporary (unregistered)":e.user.ip&&(l="IP (unregistered)");const c=e.page.categories.join(", ")||"(none)",u=e.page.categories.some(e=>/living people/i.test(e));return(0,i.fullTrim)(`\nYou are an automated Wikipedia item reviewer. Analyze the following item and determine whether the CHANGES INTRODUCED violate Wikipedia policy.\n\nCRITICAL: You are evaluating what this item CHANGED, not the page content before it. The diff shows removed lines (prefixed "-") and added lines (prefixed "+"). Only ADDED content can be a new violation. Removing bad content is a GOOD item. Adding references, citations, and sources is GOOD — it improves verifiability, not the opposite.\n\nitem CONTEXT:\n- Page: "${e.page.title}" (${r.name} namespace)\n- Categories: ${c}${u?"\n- ⚠ BLP: This page is about a living person. Unsourced negative claims are a serious concern.":""}\n- User: "${e.user.name}" (${l}, warning level: ${e.user.warning}/4)\n- ORES vandalism probability: ${(100*e.ores).toFixed(0)}%\n- Size change: ${e.sizediff>0?"+":""}${e.sizediff} bytes\n- Flagged minor: ${e.minor?"yes":"no"}\n- Summary: ${e.comment||"(empty)"}\n- Tags: ${(null===(n=e.tags)||void 0===n?void 0:n.join(", "))||"(none)"}\n\nWHAT TO CHECK:\n1. VANDALISM: Does the item add nonsense, profanity as attacks, hoaxes, blanking, or deliberate misinformation? (WP:VANDALISM)\n2. NPOV: Does the item add clearly biased or one-sided language that is not presented neutrally? (WP:NPOV)\n3. VERIFIABILITY: Does the item add claims that are extraordinary or contentious WITHOUT any sourcing? Note: adding "<ref>" tags, URLs, or citation templates is adding sources — this is the OPPOSITE of a verifiability problem. (WP:V)\n4. ORIGINAL RESEARCH: Does the item add novel analysis, synthesis, or unpublished interpretation not attributable to any source? Simply adding text IS NOT original research if it restates commonly known facts or is sourced. Adding citations is NEVER original research. (WP:NOR)\n5. BLP: If this is a BLP article, does the item add unsourced or poorly-sourced negative material about the subject? (WP:BLP)\n\nWHAT IS NOT A VIOLATION:\n- Adding references, citations, "<ref>" tags, or URLs (this IMPROVES the article)\n- Removing vandalism or bad content\n- Fixing grammar, spelling, formatting, or wikilinks\n- Content about controversial topics written in a neutral, encyclopedic tone\n- Wikipedia is NOT censored — explicit content on appropriate pages is allowed (WP:NOTCENSORED)\n- Absent or auto-generated item summaries (e.g. "/* Section name */") are normal, not violations\n- ORES scores and warning levels are hints — do NOT treat them as evidence by themselves\n\nASSESSMENT SCALE:\n- "Good": No policy issues. Normal constructive item.\n- "Review": Minor concerns; a human should glance at it.\n- "Suspicious": Likely problematic; warrants close scrutiny.\n- "Bad": Clear policy violation.\n\nWhen in doubt between two ratings, choose the LESS severe one. Most items on Wikipedia are constructive — reflect that in your assessments.\n\nFor issues, use short policy codes (e.g. "WP:VANDALISM", "WP:NPOV", "WP:BLP"). Keep your explanation to 1-3 sentences.\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: <b>Clear vandalism</b> — added <code>lol hacked</code> which violates <i>WP:VANDALISM</i>.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n\nDIFF:\n${a}\n`)},username:async e=>{var t;return(0,i.fullTrim)(`\nYou are an automated Wikipedia username policy reviewer. Determine whether the username below violates Wikipedia's username policy.\n\nUSERNAME: ${e.user.name}\nPAGE CONTEXT: ${(null===(t=e.page)||void 0===t?void 0:t.title)||"(unknown)"}\n\nThe page context is provided ONLY to check for potential conflict-of-interest (e.g. a user named "AcmeCorp" iteming the Acme Corporation article). A controversial page topic does NOT make the username problematic.\n\nVIOLATION CATEGORIES (flag ONLY if the username clearly and unambiguously fits one):\n\n1. Offensive — The name is unambiguously profane, threatening, sexually explicit, or promotes vandalism. Merely edgy, weird, or humorous names do NOT qualify. (WP:U#OFFENSIVE)\n2. Disruptive — The name clearly declares intent to disrupt or vandalize (e.g. "I Will Vandalize"). (WP:U#DISRUPTIVE)\n3. Libelous — The name makes a clearly false or disparaging claim about a specific real person, or reveals private personal information. (WP:U#LIBEL)\n4. Misleading — The name impersonates a specific real person, or falsely claims special permissions by including terms like "admin", "sysop", "bureaucrat", "checkuser". (WP:U#MISLEADING)\n5. Promotional — The name is a URL or email address whose clear purpose is advertising or revenue. Containing a brand name alone is NOT enough. (WP:U#PROMO)\n6. Shared — The name unambiguously represents a company, organization, or role rather than an individual (e.g. "XYZ Foundation", "Secretary of ABC"). Names like "JohnAtAcme" or "AcmeFan123" are fine — they clearly identify an individual. (WP:U#SHARED)\n\nDECISION RULES:\n- Flag ONLY clear, unambiguous violations. Borderline = no flag.\n- Numbers at the end of a username (e.g. "itemor2847", "WikiFan99") are completely normal and NOT a violation of any kind.\n- Creative, odd, humorous, or meaningless usernames are NOT violations.\n- Containing a real word that could be offensive in some context is NOT enough — the name must be clearly and intentionally offensive.\n- When in doubt: do NOT flag. Set flag to false.\n- If not flagging, set explanation to "No violation."\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: Username contains <code>sysop</code> which falsely implies <i>WP:U#MISLEADING</i> permissions.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n`)}}),this.ws=e,this.settings=e.store.settings.AI,this.config=t}async test(){return!1}async models(){return[]}}function d(e){var t;const n=document.createElement("div");n.innerHTML=e;const s=[];for(const e of n.querySelectorAll("tr")){const t=e.querySelector(".diff-deletedline"),n=e.querySelector(".diff-addedline"),i=e.querySelector(".diff-context");t&&s.push(`- ${t.textContent.trim()}`),n?s.push(`+ ${n.textContent.trim()}`):i&&s.push(` ${i.textContent.trim()}`)}return s.length>0?s.join("\n"):(null===(t=n.textContent)||void 0===t?void 0:t.trim())||""}t.AI=l,r(l,"providers",{});const c={type:"object",properties:{issues:{type:"array",items:{type:"object",properties:{policy:{type:"string"},severity:{type:"string",enum:["Low","Medium","High","Critical"]}},required:["policy","severity"]}},explanation:{type:"string"},assessment:{type:"string",enum:["Good","Review","Suspicious","Bad"]},confidence:{type:"number",minimum:0,maximum:1}},required:["assessment","confidence","issues","explanation"]},u={type:"object",properties:{issues:{type:"array",items:{type:"object",properties:{policy:{type:"string",enum:["Offensive","Disruptive","Libelous","Misleading","Promotional","Shared"]},severity:{type:"string",enum:["Low","Medium","High","Critical"]}},required:["policy","severity"]}},explanation:{type:"string"},flag:{type:"boolean"},confidence:{type:"number",minimum:0,maximum:1}},required:["flag","confidence","issues","explanation"]};class p extends l{async test(){try{return(await fetch(`${this.config.server}/api/version`,{method:"GET"})).ok}catch(e){return!1}}async models(){try{const e=await fetch(`${this.config.server}/api/tags`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);return(await e.json()).models||[]}catch(e){throw e}}async fetch(e,t,n=null){try{const s=this.prompt[e](t),i={method:"POST",headers:{"Content-Type":"application/json"}},a={model:this.config.model,prompt:await s,stream:!1,options:{temperature:.1,top_p:.9,num_predict:1024},format:"edit"===e?c:u};let r;i.body=JSON.stringify(a),n&&(i.signal=n);try{if(r=await fetch(`${this.config.server}/api/generate`,i),!r.ok)throw new Error(`Ollama API error: ${r.status} ${r.statusText}`);const e=await r.json();if(!e.response)throw new Error("Empty response from Ollama");return JSON.parse(e.response)}catch(e){return{error:e.message||"Ollama request failed"}}}catch(e){return{error:e.message||"Ollama request failed"}}}}t.Ollama=p,l.registerProvider("Ollama",p)},8169(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.AudioManager=void 0;var s=n(4192),i=n(1258);const a={startup:{type:"sound",title:"Startup Sound",description:"Sound played when WikiShield starts up.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/startup.wav"},music:{type:"category",title:"Music",description:"Background music tracks.",volume:1,properties:{zen_mode:{type:"sound",title:"Zen Mode",description:"Background audio played in Zen mode.",volume:1,data:"custom://zen_mode",preview:!1}}},ui:{type:"category",title:"User Interface Sounds",description:"Sounds used for user interface interactions.",volume:1,properties:{click:{type:"sound",title:"Click Sound",description:"Sound played when clicking on interface elements.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/click.wav"}}},queue:{type:"category",title:"Queue Sounds",description:"Sounds played for queue events.",volume:1,properties:{ores:{type:"sound",title:"ORES Alert",description:"Sound played due to a high ORES score.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/ores.wav"},mention:{type:"sound",title:"Mention Alert",description:"Sound played when your username is mentioned in an edit.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/mention.wav"}}},notification:{type:"category",title:"Notification Sounds",description:"Sounds played for various notifications.",volume:1,properties:{alert:{type:"sound",title:"Alert Sound",description:"Sound played for alerts.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/alert.wav"},message:{type:"sound",title:"Message Sound",description:"Sound played for messages.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/message.wav"},toast:{type:"sound",title:"Toast Sound",description:"Sound played for toast notifications.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/toast.wav"}}},action:{type:"category",title:"Action Sounds",description:"Sounds played for various user actions.",volume:1,properties:{default:{type:"sound",title:"Default Action Sound",description:"Sound played for default actions.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/action.wav"},failed:{type:"sound",title:"Failed Action Sound",description:"Sound played when an action fails.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/failed.wav"},report:{type:"sound",title:"Report Action Sound",description:"Sound played for report actions.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/report.wav"}}}};t.AudioManager=class{constructor(e){this.ws=e,this.audio=a,this.soundEffects=new Map,this.previews=new Map,this.previewing=!1}async init(){this.zengine=new i.Zengine,this.zengine.debug=this.ws.__DEV__,await this.zengine.init(),this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"])}async playSound(e,t,n=!1,i){if(!n){const e=this.ws.store.settings.zen_mode;if(e.enabled&&!e.sound.enabled)return}const a=this.getSound(e);if(!a||!a.data)return;const r=this.getVolume(e),o=new Audio(a.data);o.volume=!n&&this.previewing?0:r,"mediaSession"in navigator&&(navigator.mediaSession.setActionHandler("play",()=>{}),navigator.mediaSession.setActionHandler("pause",()=>{}),navigator.mediaSession.setActionHandler("previoustrack",()=>{}),navigator.mediaSession.setActionHandler("nexttrack",()=>{}));const l=(0,s.generateRandomUUID)();n&&(this.muteId=l,this.previewing=!0,this.stopPreviews(),this._muteAll(),this.previews.set(o,e)),this.soundEffects.set(o,e);const d=new Promise((e,t)=>{o.resolve=e,o.reject=t});o.onended=()=>{o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))},o.onerror=()=>{o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))};let c=!1;return o.onplay=()=>{c||(c=!0,i&&i())},null==t||t.addEventListener("abort",()=>{o.pause(),o.src="",o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))}),o.play(),d}async previewSound(e){const t=this.getSound(e);if(!t||!t.data)return;this._muteAll();const n=new Audio(t.data);n.volume=this.getVolume(e),this.previews.set(n,e);const s=()=>{this.previews.delete(n),0===this.previews.size&&this._unmuteAll()};n.onended=s,n.onerror=s,await n.play()}stopPreviews(){for(const e of this.previews.keys())e.resolve(),e.pause(),e.onended=null,e.onerror=null,e.src="";this.previews.clear(),this._unmuteAll()}onvolumechanged(){if(this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"]),this.previewing)for(const[e,t]of this.previews.entries()){const n=this.getVolume(t);e.volume=n}else for(const[e,t]of this.soundEffects.entries()){const n=this.getVolume(t);e.volume=n}}_muteAll(){for(const e of this.soundEffects.keys())e.volume=0}_unmuteAll(){for(const[e,t]of this.soundEffects.entries())e.volume=this.getVolume(t)}getSound(e){let t={type:"category",properties:this.audio};for(const n of e){if("category"!==t.type)return null;if(t=t.properties[n],!t)return null}return t}getVolume(e){const t=this.ws.store.settings.audio.volume;let n=t.master,s={type:"category",properties:this.audio};const i=["master"];for(const a of e){if(i.push(a),"category"!==s.type)return n;if(s=s.properties[a],!s)break;const e=t[i.join(".")];void 0!==e&&(n*=e)}return n}}},1258(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Zengine=void 0;class n{constructor(){this.audioContext=null,this.masterGain=null,this.isPlaying=!1,this.debug=!1,this.layers={bass:{oscillators:[],gains:[],compressor:null},pad:{oscillators:[],gains:[],filter:null,reverb:null}},this.nextChordTimeout=null,this.baseFrequency=65.41,this.currentKey=0,this.chordLibrary={maj7:{bass:[0],pad:[0,7,11,16,19],tension:.1},min7:{bass:[0],pad:[0,7,10,15,19],tension:.15},maj9:{bass:[0],pad:[0,7,11,14,19],tension:.12},min9:{bass:[0],pad:[0,7,10,14,19],tension:.18},sus2:{bass:[0],pad:[0,7,12,14,19],tension:.25},sus4:{bass:[0],pad:[0,7,12,17,19],tension:.28},add9:{bass:[0],pad:[0,7,14,16,21],tension:.15},madd9:{bass:[0],pad:[0,7,14,15,21],tension:.2},openvoice:{bass:[0],pad:[0,7,12,19,24],tension:.08},"6add9":{bass:[0],pad:[0,7,9,14,19],tension:.18}},this.chordCompatibility={maj7:["maj9","min7","sus2","add9","openvoice","6add9"],min7:["maj7","min9","sus4","madd9","openvoice"],maj9:["maj7","add9","sus2","6add9","openvoice"],min9:["min7","madd9","sus2","maj9"],sus2:["maj7","maj9","add9","openvoice","sus4"],sus4:["maj7","sus2","min7","openvoice"],add9:["maj9","sus2","maj7","openvoice","6add9"],madd9:["min9","min7","add9","sus2"],openvoice:["sus2","maj7","add9","maj9"],"6add9":["maj7","maj9","add9","sus2"]},this.currentChordName="maj7",this.currentTension=.1}init(){this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGain=this.audioContext.createGain(),this.masterGain.connect(this.audioContext.destination),this.masterGain.gain.value=.2,this.setupLayerEffects())}async start(){this.isPlaying||(this.init(),"suspended"===this.audioContext.state&&await this.audioContext.resume(),this.isPlaying=!0,this.currentKey=Math.floor(12*Math.random()),this.playNextChord())}setupLayerEffects(){const e=this.audioContext.createDynamicsCompressor();e.threshold.value=-30,e.knee.value=40,e.ratio.value=12,e.attack.value=.003,e.release.value=.25,e.connect(this.masterGain),this.layers.bass.compressor=e;const t=this.audioContext.createBiquadFilter();t.type="lowpass",t.frequency.value=1200,t.Q.value=.5;const n=this.audioContext.createDelay(2);n.delayTime.value=.4;const s=this.audioContext.createGain();s.gain.value=.3,t.connect(n),n.connect(s),s.connect(t),t.connect(this.masterGain),this.layers.pad.filter=t,this.layers.pad.reverb={delay:n,gain:s}}playNextChord(){if(!this.isPlaying)return;const e=this.chooseNextChord(),t=this.currentChordName;if(this.currentChordName=e,this.currentTension=this.chordLibrary[e].tension,this.debug&&console.log("[MusicEngine] Chord changed",{from:t,to:e,tension:this.currentTension,key:this.currentKey,timestamp:this.audioContext.currentTime}),Math.random()<.08){const e=this.currentKey;this.currentKey=(this.currentKey+[2,5,7][Math.floor(3*Math.random())])%12,this.debug&&console.log("[MusicEngine] Key changed",{from:e,to:this.currentKey})}this.transitionToChord(e);const n=12e3+1e4*Math.random();this.nextChordTimeout=setTimeout(()=>this.playNextChord(),n)}chooseNextChord(){const e=this.chordCompatibility[this.currentChordName]||Object.keys(this.chordLibrary),t=e.map(e=>({name:e,weight:this.chordLibrary[e].tension<.2?2:1})),n=t.reduce((e,t)=>e+t.weight,0);let s=Math.random()*n;for(const e of t)if(s-=e.weight,s<=0)return e.name;return e[0]}transitionToChord(e){const t=this.chordLibrary[e];if(!t)return;const n=6+3*Math.random();["bass","pad"].forEach(e=>this.createLayer(e,t[e],n))}createLayer(e,t,n){if(null==t||!t.length)return;const s=this.audioContext.currentTime,i=this.layers[e];if(i.gains&&i.gains.length>0){const e=[...i.oscillators],t=[...i.gains];t.forEach(e=>{try{e.gain.cancelScheduledValues(s),e.gain.setValueAtTime(e.gain.value,s),e.gain.linearRampToValueAtTime(0,s+n)}catch(e){}}),setTimeout(()=>{e.forEach(e=>{try{e.stop(),e.disconnect()}catch(e){}}),t.forEach(e=>{try{e.disconnect()}catch(e){}})},1e3*n+100)}const a=[],r=[],o=[];t.forEach((t,l)=>{const d=this.baseFrequency*Math.pow(2,(this.currentKey+t)/12);o.push(d);const c=this.audioContext.createOscillator();c.type="bass"===e?"sine":"triangle",c.frequency.value=d,c.detune.value=6*(Math.random()-.5);const u=this.audioContext.createGain();u.gain.value=0,c.connect(u),"bass"===e&&i.compressor?u.connect(i.compressor):i.filter&&u.connect(i.filter),c.start(s),a.push(c),r.push(u);const p="bass"===e?.15:.08-.01*l;u.gain.setValueAtTime(0,s),u.gain.linearRampToValueAtTime(p,s+n)}),this.debug&&console.log("[MusicEngine] Layer created",{layer:e,frequencies:o,volumes:r.map(e=>e.gain.value),fadeDuration:n}),i.oscillators=a,i.gains=r}stop(){this.isPlaying=!1,this.nextChordTimeout&&clearTimeout(this.nextChordTimeout),this.debug&&console.log("[MusicEngine] Stopping music engine",{timestamp:this.audioContext.currentTime});const e=this.audioContext.currentTime;if(Object.values(this.layers).forEach(t=>{t.gains&&t.gains.forEach(t=>{try{t.gain.setValueAtTime(t.gain.value,e),t.gain.linearRampToValueAtTime(0,e+.5)}catch(e){}}),t.oscillators&&setTimeout(()=>{t.oscillators.forEach(e=>{try{e.stop(),e.disconnect()}catch(e){}}),t.oscillators=[],t.gains&&(t.gains.forEach(e=>{try{e.disconnect()}catch(e){}}),t.gains=[])},550)}),this.masterGain)try{this.masterGain.gain.setValueAtTime(this.masterGain.gain.value,e),this.masterGain.gain.linearRampToValueAtTime(0,e+.5)}catch(e){}}setMasterVolume(e){if(this.masterGain){const t=this.masterGain.gain.value;this.masterGain.gain.value=e,this.debug&&console.log("[MusicEngine] Master volume changed",{from:t,to:e})}}}t.Zengine=class{constructor(){this.audioContext=null,this.sounds=[],this.activeSounds=new Map,this.masterGainNode=null,this.isRunning=!1,this.currentEnvironment=null,this.eventLoopInterval=null,this.activityLevel=4,this.musicEngine=null,this.debug=!1}async init(){this.musicEngine=new n,this.musicEngine.init(),this.musicEngine.debug=this.debug;const e=await fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/bbc-sounds.json"),t=await e.json();return this.sounds=this.categorizeSounds(t),this.debug&&console.log("[Zengine] Initialized",{soundCount:this.sounds.length,categories:[...new Set(this.sounds.map(e=>e.category))]}),this.sounds.length}categorizeSounds(e){return e.map(e=>{var t;const n=(e.tags||[]).map(e=>e.toLowerCase()),s=(e.description||"").toLowerCase(),i=parseFloat((null===(t=e.technicalMetadata)||void 0===t?void 0:t.duration)||e.duration)||0,a=this.detectCategory(n,s),r=i>60?"ambient":i>15?"feature":"event";return{id:e.id,duration:i,description:e.description,category:a,role:r}})}detectCategory(e,t){const n=[...e,t].join(" ");return/rain|drizzle/i.test(n)?"rain":/ocean|sea|wave/i.test(n)?"ocean":/stream|river|water/i.test(n)?"water-flow":/wind|breeze/i.test(n)?"wind":/bird/i.test(n)?"bird":/cricket|insect/i.test(n)?"insect":"other"}generateEnvironment(){const e=[{name:"Gentle Rain",requiredAmbient:["rain"],commonCategories:["bird"],weather:"rain"},{name:"Ocean Shore",requiredAmbient:["ocean"],commonCategories:["bird","wind"],weather:"clear"},{name:"Forest Stream",requiredAmbient:["water-flow"],commonCategories:["bird","insect"],weather:"clear"}],t=e[Math.floor(Math.random()*e.length)];return this.debug&&console.log("[Zengine] Environment generated",{name:t.name,weather:t.weather,ambientRequirements:t.requiredAmbient,commonSounds:t.commonCategories}),t}getEnvironmentSounds(e){return{ambient:this.sounds.filter(t=>"ambient"===t.role&&e.requiredAmbient.includes(t.category)),events:this.sounds.filter(t=>"event"===t.role&&e.commonCategories.includes(t.category))}}async start(){this.isRunning||(0===this.sounds.length&&await this.init(),this.musicEngine.isPlaying||await this.musicEngine.start(),this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGainNode=this.audioContext.createGain(),this.masterGainNode.connect(this.audioContext.destination),this.masterGainNode.gain.value=.3),"suspended"===this.audioContext.state&&await this.audioContext.resume(),this.isRunning=!0,this.currentEnvironment=this.generateEnvironment(),this.debug&&console.log("[Zengine] Engine started",{environment:this.currentEnvironment.name,audioContextState:this.audioContext.state}),await this.startAmbientLayers(),this.startEventLoop())}async startAmbientLayers(){const e=this.getEnvironmentSounds(this.currentEnvironment),t=Math.min(e.ambient.length,2);for(let n=0;n<t;n++){const t=e.ambient[Math.floor(Math.random()*e.ambient.length)];this.activeSounds.has(t.id)||await this.playSound(t,"ambient",.35+.1*Math.random())}}startEventLoop(){this.eventLoopInterval=setInterval(()=>this.processEvents(),3e3),this.debug&&console.log("[Zengine] Event loop started")}async processEvents(){if(!this.isRunning)return;const e=this.getEnvironmentSounds(this.currentEnvironment);if(Array.from(this.activeSounds.values()).filter(e=>"ambient"!==e.role).length<this.activityLevel&&e.events.length>0&&Math.random()<.5){const t=e.events[Math.floor(Math.random()*e.events.length)];await this.playSound(t,"event",.12+.08*Math.random())}}async playSound(e,t,n){if(!this.activeSounds.has(e.id))try{const s=e.url||`https://sound-effects-media.bbcrewind.co.uk/mp3/${e.id}.mp3`,i=new Audio;i.crossOrigin="anonymous",i.src=s,i.preload="auto";const a=this.audioContext.createMediaElementSource(i),r=this.audioContext.createGain();r.gain.value=n,a.connect(r),r.connect(this.masterGainNode),this.activeSounds.set(e.id,{sound:e,audio:i,source:a,gainNode:r,role:t,volume:n}),this.debug&&console.log("[Zengine] Sound started playing",{soundId:e.id,description:e.description,role:t,volume:n,category:e.category,duration:e.duration,activeCount:this.activeSounds.size}),i.addEventListener("ended",()=>{this.removeSound(e.id),"ambient"===t&&this.isRunning&&setTimeout(()=>this.playSound(e,t,n),1e3)}),i.addEventListener("error",()=>this.removeSound(e.id)),await i.play()}catch(t){console.error("[Zengine] Sound error:",e.id,t)}}removeSound(e){const t=this.activeSounds.get(e);if(t){try{t.audio.pause(),t.gainNode.disconnect(),t.source.disconnect()}catch(e){}this.debug&&console.log("[Zengine] Sound removed",{soundId:e,description:t.sound.description,activeCount:this.activeSounds.size-1}),this.activeSounds.delete(e)}}stop(){this.musicEngine.isPlaying&&this.musicEngine.stop(),this.isRunning=!1,this.eventLoopInterval&&(clearInterval(this.eventLoopInterval),this.eventLoopInterval=null),this.debug&&console.log("[Zengine] Engine stopping",{activeSounds:this.activeSounds.size}),this.activeSounds.forEach((e,t)=>{try{e.audio.pause(),e.audio.currentTime=0}catch(e){}const n=this.audioContext.currentTime;e.gainNode.gain.cancelScheduledValues(n),e.gainNode.gain.setValueAtTime(e.gainNode.gain.value,n),e.gainNode.gain.linearRampToValueAtTime(0,n+.5),setTimeout(()=>this.removeSound(t),500)}),this.audioContext&&"running"===this.audioContext.state&&this.audioContext.suspend(),this.debug&&console.log("[Zengine] Engine stopped")}setMasterVolume(e){if(this.masterGainNode){const t=this.masterGainNode.gain.value;this.masterGainNode.gain.value=e,this.debug&&console.log("[Zengine] Master volume changed",{from:t,to:e,musicEngineVolume:.25*e})}this.musicEngine.setMasterVolume(.25*e)}}},870(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.conditions=void 0;var s=n(372);t.conditions={true:{title:"True",check:(e,t,n)=>!0},false:{title:"False",check:(e,t,n)=>!1},"account-admin":{title:"You are an admin",check:(e,t,n)=>!0===e.groups.sysop},"item-selected":{title:"An item is selected",check:(e,t,n)=>null!==t},"edit-selected":{title:"An edit is selected",check:(e,t,n)=>"edit"===s.Queue.groups[null==t?void 0:t.type]},"logevent-selected":{title:"A logentry is selected",check:(e,t,n)=>"logevent"===s.Queue.groups[null==t?void 0:t.type]},revertable:{title:"Current item is revertable",check:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"===s.Queue.groups[i]}},pending:{title:"Current item is pending review",check:(e,t,n)=>!!e.queue.pending.has(t.id)},"user-registered":{title:"Selected user is registered",check:(e,t,n)=>!1===t.user.anon},"user-ip":{title:"Selected user is an IP address",check:(e,t,n)=>!0===t.user.ip},"user-temp":{title:"Selected user is a temporary account",check:(e,t,n)=>!0===t.user.temp},"user-empty-talk":{title:"Selected user's talk page is empty",check:(e,t,n)=>void 0===t.user.talk},"user-blocked":{title:"Selected user is blocked",check:(e,t,n)=>!0===t.user.blocked},"user-edit-count":{title:"Selected user's edit count is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"count",title:"Edit count",type:"number",default:0}],check:(e,t,n)=>{const s=-1===t.user.editcount?1/0:t.user.editcount||0,i=Number(n.count);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"user-final-warning":{title:"Selected user at final warning level",check:(e,t,n)=>"4"===t.user.warning||"4im"===t.user.warning},"user-has-warnings":{title:"Selected user has no warnings",check:(e,t,n)=>"0"!==t.user.warning},"edit-pending":{title:"Edit is pending",check:(e,t,n)=>e.queue.pending.has(null==t?void 0:t.id)},"edit-minor":{title:"Edit is marked as minor",check:(e,t,n)=>!0===t.minor},"edit-size":{title:"Edit size is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"size",title:"Size",type:"number",default:0}],check:(e,t,n)=>{const s=t.sizediff||0,i=Number(n.size);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"abs-edit-size":{title:"Absolute edit size is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"size",title:"Size",type:"number",min:0,default:0}],check:(e,t,n)=>{const s=Math.abs(t.sizediff||0),i=Number(n.size);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"edit-ores-score":{title:"Edit ORES score is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"score",title:"Score",type:"number",min:0,max:1,default:0}],check:(e,t,n)=>{const s=t.ores_score||0,i=Number(n.score);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"user-highlighted":{title:"Selected user is highlighted",check:(e,t,n)=>e.store.highlight.users.has(t.user.name)},"user-whitelisted":{title:"Selected user is whitelisted",check:(e,t,n)=>e.store.whitelist.users.has(t.user.name)},"page-highlighted":{title:"Selected page is highlighted",check:(e,t,n)=>e.store.highlight.pages.has(t.page.title)},"page-whitelisted":{title:"Selected page is whitelisted",check:(e,t,n)=>e.store.whitelist.pages.has(t.page.title)},"page-watched":{title:"Selected page is watched",check:(e,t,n)=>!0===t.page.watched},"tag-highlighted":{title:"Selected edit has a highlighted tag",check:(e,t,n)=>{for(const n of t.tags)if(e.store.highlight.tags.has(n))return!0;return!1}},"tag-whitelisted":{title:"Selected edit has a whitelisted tag",check:(e,t,n)=>{for(const n of t.tags)if(e.store.whitelist.tags.has(n))return!0;return!1}},"in-recent-queue":{title:"In recent changes queue",check:(e,t,n)=>"recent"===e.queue.current.type},"in-pending-queue":{title:"In pending changes queue",check:(e,t,n)=>"pending"===e.queue.current.type},"in-user-queue":{title:"In user creations queue",check:(e,t,n)=>"users"===e.queue.current.type},"in-watchlist-queue":{title:"In watchlist queue",check:(e,t,n)=>"watchlist"===e.queue.current.type}}},9808(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.validateShortcut=t.controls=t.buildShortcut=void 0;const n=t.controls=new Set(["!","@","#","$","%","^","&","*","(",")","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","-","=","[","]","\\",";","'",",",".","/","_","+","{","}","|",":",'"',"<",">","?"," ","arrowleft","arrowup","arrowdown","arrowright"]);t.buildShortcut=e=>{const t=[];["ctrl","shift","alt"].forEach(n=>{e[`${n}Key`]&&t.push(n)});const s=e.key.toLowerCase();return n.has(s)&&t.push(s),t.join("+")};t.validateShortcut=e=>{const t=e.toLowerCase().split("+");if(0===t.length)return!1;const s=new Set;for(const e of t){if(s.has(e))return!1;if(s.add(e),"ctrl"!==e&&"shift"!==e&&"alt"!==e&&!n.has(e))return!1}return t.some(e=>"ctrl"!==e&&"shift"!==e&&"alt"!==e)}},985(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.events=void 0;var s=n(372),i=n(7054),a=n(955),r=n(863),o=n(5643);t.events={"next-item":{title:"Go to next item",icon:"fas fa-arrow-right",script:(e,t,n)=>(e.queue.next(),{valid:!0})},"previous-item":{title:"Go to previous item",icon:"fas fa-arrow-left",script:(e,t,n)=>(e.queue.previous(),{valid:!0})},"clear-queue":{title:"Clear queue",icon:"fas fa-trash-can",valid:(e,t,n)=>"pending"===e.queue.current.type?{valid:!1,reason:"Pending edits queue cannot be cleared."}:{valid:!0},script:(e,t,n)=>(e.queue.clear(e.queue.current.type),{valid:!0})},"next-queue":{title:"Go to next queue",icon:"fas fa-forward",script:(e,t,n)=>{const i=s.Queue.types.map(t=>({name:t,...e.store.settings.queue[t]}));i.sort((e,t)=>e.order-t.order);const a=i.findIndex(t=>t.name===e.queue.current.type);return e.queue.switch(i[(a+1)%i.length].name),{valid:!0}}},"previous-queue":{title:"Go to previous queue",icon:"fas fa-forward",script:(e,t,n)=>{const i=s.Queue.types.map(t=>({name:t,...e.store.settings.queue[t]}));i.sort((e,t)=>e.order-t.order);const a=i.findIndex(t=>t.name===e.queue.current.type);return e.queue.switch(i[(a-1+i.length)%i.length].name),{valid:!0}}},"accept-pending-edit":{title:"Accept pending edit",icon:"fas fa-check",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Accepting pending edit",valid:(e,t,n)=>e.rights.review?e.queue.pending.has(t.id)?{valid:!0}:{valid:!1,reason:"Pending edit can only be accepted when a pending edit is selected."}:{valid:!1,reason:"You do not have permission to review pending changes."},script:async(e,t,n)=>{const s=e.queue.pending.get(t.id);if(!s)return{valid:!1,reason:"Pending edit not found."};const i=`${s.count||""} pending revision${1===s.count?"":"s"}`,a=Object.entries(s.users||{}).map(t=>[e.api.user(t[0]),t[1]]);a.sort((e,t)=>t[1]-e[1]);const r=Math.max(a.reduce((e,t)=>{const n=t[0].length;return e[0]+n<=250?[e[0]+n,e[1]+1]:e},[0,0])[1],1);let o="";const l=a.length;if(l>r){const e=a.slice(0,r).map(e=>e[0]),t=l-e.length;o=`${e.join(", ")}, and ${t} other${1===t?"":"s"}`}else o=(e=>{switch(e.length){case 0:case 1:return e[0]||"";case 2:return`${e[0]} and ${e[1]}`;default:return`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`}})(a.map(e=>e[0]));return await e.api.acceptPendingEdit(t.pending.revid,e.api.summary(`Accepted ${i} by ${o}`,n.summary))},successful:(e,t,n)=>{e.store.statistics.pending_changes_reviewed.accepted++}},"reject-pending-edit":{title:"Reject pending edit",icon:"fas fa-xmark",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Rejecting pending edit",valid:(e,t,n)=>e.rights.review?e.queue.pending.has(t.id)?{valid:!0}:{valid:!1,reason:"Pending edit can only be rejected when a pending edit is selected."}:{valid:!1,reason:"You do not have permission to review pending changes."},script:async(e,t,n)=>{const s=e.queue.pending.get(t.id);if(!s)return{valid:!1,reason:"Pending edit not found."};const i=`${s.count||""} pending revision${1===s.count?"":"s"}`,a=Object.entries(s.users||{}).map(t=>[e.api.user(t[0]),t[1]]);a.sort((e,t)=>t[1]-e[1]);const r=Math.max(a.reduce((e,t)=>{const n=t[0].length;return e[0]+n<=250?[e[0]+n,e[1]+1]:e},[0,0])[1],1);let o="";const l=a.length;if(l>r){const e=a.slice(0,r).map(e=>e[0]),t=l-e.length;o=`${e.join(", ")}, and ${t} other${1===t?"":"s"}`}else o=(e=>{switch(e.length){case 0:case 1:return e[0]||"";case 2:return`${e[0]} and ${e[1]}`;default:return`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`}})(a.map(e=>e[0]));return await e.api.rejectPendingEdit(t.id,s.prior,t.page.title,e.api.summary(`Rejected ${i} by ${o} to [[Special:Diff/${s.prior}|last stable revision]]`,n.summary))},successful:(e,t,n)=>{e.store.statistics.pending_changes_reviewed.rejected++}},revert:{title:"Revert and auto warn/report",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]}],progress:"Reverting edit",valid:(e,t,n)=>{let i=t.type;if("abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i])return{valid:!1,reason:"Edit can only be reverted when an edit is selected."};return"summary"in(0,a.getWarningFromLookup)(n.warning)?{valid:!0}:{valid:!1,reason:"Selected warning template does not support reverting."}},script:async(e,t,n)=>{var r;const l=(0,a.getWarningFromLookup)(n.warning);if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Reverting yourself","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to revert their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to revert the edit on it?`)||null!==(r=t.tags)&&void 0!==r&&r.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to revert it?"))return{valid:!1,reason:"Revert cancelled by user."};const d=await(async()=>await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted edits by ${e.api.user(t.user.name)}`,l.summary)))();if(!d.valid)return d;switch(e.store.statistics.reverts_made.total++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}let c;const u=await(async()=>{const n=`User talk:${t.user.name}`,i=e.util.monthSectionName(),a=(await e.api.getPagesContent([n]))[n]||"",r=e.util.getPageSections(a);let o="new";const d=r.length;for(let e=0;e<d;e++)r[e].title===i&&(o=e+1);let u;c=e.queue.getWarningLevel(a),u="string"==typeof l.auto?l.auto:"function"==typeof l.auto?l.auto(t,c):l.auto[c];const p=l.templates.find(e=>e.name===u.toString());if(!p)return{valid:!0};let g="Message about ";"edit"===s.Queue.groups[t.type]?g+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?g+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:g+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:g+=`[[${t.page.title}]]`;let h="";h="new"===o?`{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)`:`${r[o-1].heading}\n${r[o-1].content}\n\n{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)`;const m=await e.api.editSection(n,o,i,h,e.api.summary(g,`${l.name} (${p.name})`));if(m.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(u)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,u),e.store.statistics.warnings_issued.total++,u){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return m})();if(!u.valid)return u;if(("4"===c||"4im"===c)&&l.reportable&&e.store.settings.auto_report.enabled&&e.store.settings.auto_report.for.has(n.warning)){if(!(await(async()=>await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}}))()).valid)return{valid:!0};e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}return{valid:!0}}},"warn-and-report":{title:"Auto warn/report",icon:"fas fa-exclamation-triangle",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]}],progress:"Warning user",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be warned when an item is selected."},script:async(e,t,n)=>{var r;const l=(0,a.getWarningFromLookup)(n.warning);if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Warning yourself","You are about to warn yourself. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to warn them?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`)||null!==(r=t.tags)&&void 0!==r&&r.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?"))return{valid:!1,reason:"Warn cancelled by user."};let d;const c=await(async()=>{const n=`User talk:${t.user.name}`,i=e.util.monthSectionName(),a=(await e.api.getPagesContent([n]))[n]||"",r=e.util.getPageSections(a);let o="new";const c=r.length;for(let e=0;e<c;e++)r[e].title===i&&(o=e+1);let u;d=e.queue.getWarningLevel(a),u="string"==typeof l.auto?l.auto:"function"==typeof l.auto?l.auto(t,d):l.auto[d];const p=l.templates.find(e=>e.name===u.toString());if(!p)return{valid:!0};let g="Message about ";"edit"===s.Queue.groups[t.type]?g+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?g+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:g+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:g+=`[[${t.page.title}]]`;let h="";h="new"===o?`{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)`:`${r[o-1].heading}\n${r[o-1].content}\n\n{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)`;const m=await e.api.editSection(n,o,i,h,e.api.summary(g,`${l.name} (${p.name})`));if(m.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(u)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,u),e.store.statistics.warnings_issued.total++,u){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return m})();if(!c.valid)return c;if(("4"===d||"4im"===d)&&l.reportable&&e.store.settings.auto_report.enabled&&e.store.settings.auto_report.for.has(n.warning)){if(!(await(async()=>await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}}))()).valid)return{valid:!0};e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}return{valid:!0}}},"warn-user":{title:"Warn user",icon:"fas fa-exclamation-triangle",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]},{dependencies:["warning"],id:"level",title:"Warning level",type:"choice",options:e=>["auto",...a.warningsLookup[e.warning].templates.filter(e=>void 0===e.generic).map(e=>e.name)],default:"auto"}],continuity:!0,progress:"Issuing warning to user",valid:(e,t,n)=>{var s;return t?"auto"!==n.level&&null===(null===(s=(0,a.getWarningFromLookup)(n.warning))||void 0===s?void 0:s.templates[n.level])?{valid:!1,reason:"Selected warning template does not support automatic level selection."}:{valid:!0}:{valid:!1,reason:"User can only be warned when an item is selected."}},script:async(e,t,n)=>{var i;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Warning yourself","You are about to warn yourself. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to warn them?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`)||null!==(i=t.tags)&&void 0!==i&&i.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?"))return{valid:!1,reason:"Warning cancelled by user."};const r=(0,a.getWarningFromLookup)(n.warning),o=`User talk:${t.user.name}`,l=e.util.monthSectionName(),d=(await e.api.getPagesContent([o]))[o]||"",c=e.util.getPageSections(d);let u="new";const p=c.length;for(let e=0;e<p;e++)c[e].title===l&&(u=e+1);let g;g="auto"===n.level?"string"==typeof r.auto?r.auto:"function"==typeof r.auto?r.auto(t,e.queue.getWarningLevel(d)):r.auto[e.queue.getWarningLevel(d)]:n.level;const h=r.templates.find(e=>e.name===g.toString());if(!h)return"auto"!==n.level?{valid:!1,reason:"Selected warning template does not support the specified level."}:{valid:!0};let m="Message about ";"edit"===s.Queue.groups[t.type]?m+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?m+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:m+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:m+=`[[${t.page.title}]]`;let v="";v="new"===u?`{{subst:${h.template}|${t.page.title}|${h.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)`:`${c[u-1].heading}\n${c[u-1].content}\n\n{{subst:${h.template}|${t.page.title}|${h.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)`;const f=await e.api.editSection(o,u,l,v,e.api.summary(m,`${r.name} (${h.name})`));if(f.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(g)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,g),e.store.statistics.warnings_issued.total++,g){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return f}},"rollback-edit":{title:"Rollback edit",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Rolling back edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be rolled back when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Rollbacking own edit","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to rollback it?"))return{valid:!1,reason:"Rollback cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted edits${i}`,n.summary))},successful:(e,t,n)=>{switch(e.store.statistics.reverts_made.total++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}}},"rollback-goodfaith-edit":{title:"Rollback good faith edit",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Rolling back good faith edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be rolled back when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Rollbacking own edit","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to rollback it?"))return{valid:!1,reason:"Rollback cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted [[Wp:AGF|Good faith]] edits${i}`,n.summary))},successful:(e,t,n)=>{switch(e.store.statistics.reverts_made.total++,e.store.statistics.reverts_made.good_faith++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}}},"undo-edit":{title:"Undo edit",icon:"fas fa-undo",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Undoing edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be undone when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Undoing own edit","You are about to undo your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to undo their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to undo the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to undo it?"))return{valid:!1,reason:"Undo cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.undoEdit(t.page.title,t.id,e.api.summary(`Undid revision ${e.api.revision(t.id)}${i}`,n.summary))}},"restore-edit":{title:"Restore edit",icon:"fas fa-redo",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Restoring edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be restored when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>await e.api.restoreEdit(t.page.title,t.id,e.api.summary(`Restored revision ${e.api.revision(t.id)} by ${e.api.user(t.user.name)}`,n.summary))},"send-message-to-user-talk":{title:"Send message to user talk page",icon:"fas fa-comment",parameters:(e,t)=>[{id:"heading",title:"Section heading",type:"text"},{id:"message",title:"Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC))",type:"text"}],progress:"Sending message to user talk page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Message can only be sent when an item is selected."},script:async(e,t,n)=>await e.api.editSection(`User talk:${t.user.name}`,"new",n.heading,n.message,e.api.summary(`Message from ${e.api.username}: ${n.heading}`))},"send-message-to-page-talk":{title:"Send message to page talk page",icon:"fas fa-comment",parameters:(e,t)=>[{id:"heading",title:"Section heading",type:"text"},{id:"message",title:"Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC))",type:"text"}],progress:"Sending message to page talk page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Message can only be sent when an item is selected."},script:async(e,t,n)=>{const s=t.page.title.split(":");let i="Talk";s.length>1&&(i=s[0].toLowerCase().includes("talk")?s[0]:`${s[0]} talk`);const a=`${i}:${1===s.length?s[0]:s.slice(1).join(":")}`;return await e.api.editSection(a,"new",n.heading,n.message,e.api.summary(`Message from ${e.api.username}: ${n.heading}`))}},"report-user-to-aiv":{title:"Report user to AIV",icon:"fas fa-flag",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Vandalism past final warning","Vandalism-only account","Vandalism after recent release of block","Spambot or compromised account","Long-term abuse"],default:"Vandalism past final warning"},{id:"summary",title:"Summary (optional)",type:"text"}],continuity:!0,progress:"Reporting user to AIV",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be reported when an item is selected."},script:async(e,t,n)=>t.user.name===e.api.username?{valid:!1,reason:"You cannot report yourself, silly!"}:(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to report them?`)?{valid:!1,reason:"User report cancelled by user."}:await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; ${n.reason}${n.summary?`: ${n.summary}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}})),successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}},"report-user-to-uaa":{title:"Report user to UAA",icon:"fas fa-user-slash",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Disruptive username","Offensive username","Promotional username","Misleading username"],default:"Disruptive username"},{id:"summary",title:"Summary (optional)",type:"text"}],continuity:!0,progress:"Reporting user to UAA",valid:(e,t,n)=>t?t.user.anon?{valid:!1,reason:"User cannot be reported because they are anonymous."}:{valid:!0}:{valid:!1,reason:"User can only be reported when an item is selected."},script:async(e,t,n)=>{if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot report yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to report them?`))return{valid:!1,reason:"User report cancelled by user."};if(await e.api.areUsersBlocked([t.user.name])[t.user.name])return{valid:!1,reason:"User cannot be reported because they are blocked."};const s="Offensive username"===n.reason?"offensive username":e.api.user(t.user.name);return await e.api.append(i.WikiShield.config.pages.UAA,null,(0,o.fullTrim)(`\n * {{user-uaa|${t.user.name}}} &ndash; ${n.reason}${n.summary?`: ${n.summary}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${s}`),n=>{var s;return{valid:!(null!==(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))&&void 0!==s&&s.content.includes(`{{user-uaa|${t.user.name}}`)),reason:"User has already been reported to UAA."}})},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.UAA++}},"request-page-protection":{title:"Request page protection",icon:"fas fa-shield-alt",parameters:(e,t)=>[{id:"level",title:"Protection level",type:"choice",options:[...e.api.hasPendingChanges?["Pending changes protection"]:[],"Semi-protection","Extended-confirmed protection","Full protection","Move protection","Template protection"],default:"Semi-protection"},{id:"reason",title:"Reason",type:"choice",options:["Generic","Persistent vandalism","Disruptive editing","Edit warring","BLP violations","Sockpuppetry","Arbitration enforcement"],default:"Generic"},{id:"duration",title:"Duration",type:"choice",options:["Temporary","Indefinite"],default:"Temporary"},{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Requesting page protection",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Page protection can only be requested for edits."}:{valid:!0}},script:async(e,t,n)=>{if(await e.gui.settings.waitForClose(),e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to request protection for it?`))return{valid:!1,reason:"Page protection request cancelled by user."};const s="Generic"===n.reason?n.summary:`${n.reason} &ndash; ${n.summary}`;return await e.api.append(i.WikiShield.config.pages.RFPP,null,`\n${(0,o.fullTrim)(`\n === [[${t.page.title}]] ===\n * {{pagelinks|${t.page.title}}}\n '''${n.duration} ${n.level.toLowerCase()}'''${s?`: ${s}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting ${n.level} protection for [[${t.page.title}]]`),n=>({valid:!e.util.getPageSections(n).some(e=>e.title===`[[${t.page.title}]]`),reason:"Page protection has already been requested for this page."}))},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.RFPP++}},"request-global-block":{title:"Request global block",icon:"fas fa-ban",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Generic","Long-term abuse","Cross-wiki abuse","Spam / spambot","Compromised account"],default:"Generic"},{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Requesting global block",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Global block can only be requested when an item is selected."},script:async(e,t,n)=>{var s;if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot request a global block for yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to request a global block for them?`))return{valid:!1,reason:"Global block request cancelled by user."};if(await e.api.isUserGloballyLocked(t.user.name))return{valid:!1,reason:"User is globally locked."};const a="Generic"===n.reason?n.summary:`${n.reason}. ${n.summary}`,r=(await e.api.getPagesContent([i.WikiShield.config.pages.SRG],!0,"meta.wikimedia.org"))[i.WikiShield.config.pages.SRG]||"",l=e.util.getPageSections(r);return await e.api.append(i.WikiShield.config.pages.SRG,Number(null===(s=Object.entries(l).find(([,e])=>2===e.level&&"Requests for global (un)block"===e.title))||void 0===s?void 0:s[0])+1||void 0,`\n${(0,o.fullTrim)(`\n === Global block for ${t.user.name} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{Luxotool|${t.user.name}}}\n ${a?`${a} `:""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting global block for ${e.api.user(t.user.name)}`),n=>{let s=!1,i=[];for(const t of e.util.getPageSections(n))if(2===t.level){if("Requests for global (un)block"===t.title)s=!0;else if(s)break}else s&&3===t.level&&i.push(t);return i=i.filter(e=>!e.content.match(/^{{Status\|not done}}/i)),{valid:!i.some(n=>{const s=n.content;return!!s.match(new RegExp(`{{Luxotool\\|(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}}}`,"i"))||!!s.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(?:\\|hidename=1)?(?:\\||})`,"i"))}),reason:"User has already been requested for global block."}},!1,"meta.wikimedia.org")},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.global_block++}},"request-global-lock":{title:"Request global lock",icon:"fas fa-lock",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Generic","Long-term abuse","Cross-wiki abuse","Abusive-username","Spam / spambot","Compromised account"],default:"Generic"},{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Requesting global lock",valid:(e,t,n)=>t?t.user.anon?{valid:!1,reason:"Global lock cannot be requested for anonymous users."}:{valid:!0}:{valid:!1,reason:"Global lock can only be requested when an item is selected."},script:async(e,t,n)=>{var s;if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot request a global lock for yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to request a global lock for them?`))return{valid:!1,reason:"Global lock request cancelled by user."};if(await e.api.isUserGloballyLocked(t.user.name))return{valid:!1,reason:"User is already globally locked."};const a="Generic"===n.reason?n.summary:`${n.reason}. ${n.summary}`,r="Yes"===n.hide_username?"":` for ${e.api.centralAuthUser(t.user.name)}`,l=(await e.api.getPagesContent([i.WikiShield.config.pages.SRG],!0,"meta.wikimedia.org"))[i.WikiShield.config.pages.SRG]||"",d=e.util.getPageSections(l);return await e.api.append(i.WikiShield.config.pages.SRG,Number(null===(s=Object.entries(d).find(([,e])=>2===e.level&&"Requests for global (un)lock and (un)hiding"===e.title))||void 0===s?void 0:s[0])+1||void 0,`\n${(0,o.fullTrim)(`\n === Global lock${r} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{LockHide|${t.user.name}${"Yes"===n.hide_username?"|hidename=1":""}}}\n ${a?`${a} `:""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting global lock${r}`),n=>{let s=!1,i=[];for(const t of e.util.getPageSections(n))if(2===t.level){if("Requests for global (un)lock and (un)hiding"===t.title)s=!0;else if(s)break}else s&&3===t.level&&i.push(t);return i=i.filter(e=>!e.content.match(/^{{Status\|not done}}/i)),{valid:!i.some(n=>{const s=n.content;return!!s.match(new RegExp(`{{LockHide\\|(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(\\|hidename=1)?}}`,"i"))||!!s.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(?:\\|hidename=1)?(?:\\||})`,"i"))}),reason:"User has already been requested for global lock."}},!1,"meta.wikimedia.org")},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.global_lock++}},"thank-user":{title:"Thank user",icon:"fas fa-handshake",progress:"Thanking user",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"User can only be thanked when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{const s=e.api.summary(`Thank you for [[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`),i=`User talk:${t.user.name}`;if(t.user.temp){const n=await e.api.thankRevision(t.id);return(n.valid||e.store.settings.talk_page_thanks_for_temporary_users.enabled)&&void 0===(await e.api.pagesExist(i))[i]&&await e.api.editSection(i,"new","Thank you!","{{subst:Thanks-autosign}}",s),n}return t.user.ip?await e.api.editSection(i,"new","Thank you!","{{subst:Thanks-autosign}}",s):await e.api.thankRevision(t.id)},successful:(e,t,n)=>{e.store.statistics.edits_reviewed.thanked++}},"welcome-user":{title:"Welcome user",icon:"fas fa-paper-plane",parameters:(e,t)=>[{id:"template",title:"Template",type:"choice",options:Object.keys(r.welcomes),default:Object.keys(r.welcomes)[0]}],progress:"Welcoming user",valid:(e,t,n)=>t?void 0!==t.user.talk?{valid:!1,reason:"User cannot be welcomed because their talk page is not empty."}:{valid:!0}:{valid:!1,reason:"User can only be welcomed when an item is selected."},script:async(e,t,n)=>await(async()=>{const s=`User talk:${t.user.name}`;if(void 0!==(await e.api.pagesExist([s]))[s])return{valid:!1,reason:"User cannot be welcomed because their talk page is not empty."};let i=r.welcomes[n.template];if(!i)return{valid:!1,reason:"Selected welcome template does not exist."};const a=new Set([i]);for(;"function"==typeof(null===(o=i)||void 0===o?void 0:o.template);){var o,l;if(i=r.welcomes[i.template(e,t)],a.has(i))return null!==(l=void e.gui.dialog.toast("REPORT TO DEVELOPER","Uh oh! Something has gone <i>cat</i>astrophically wrong. Please report this to a developer, and include the error code below:<br><br><code>WELCOME_TEMPLATE_LOOP</code>","dev",-1))&&void 0!==l?l:{valid:!1};if(!i)return{valid:!1,reason:"Selected welcome template does not exist."};a.add(i)}const d=`{{subst:${i.template}}}${i.sign?" [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:02, 25 May 2026 (UTC)":""}`;return await e.api.append(s,null,d,e.api.summary("Welcome to Wikipedia!"))})(),successful:(e,t,n)=>{e.store.statistics.users_welcomed.total++,e.queue.talks.set(t.user.name,!0),e.gui.renderQueue()}},"watch-page":{title:"Watch page",icon:"fas fa-eye",progress:"Watching page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be watched when an item is selected."},script:async(e,t,n)=>await e.api.watchPage(t.page.title,e.util.utcString(e.util.expiryToDate(e.store.settings.expiry.watchlist))),successful:(e,t,n)=>{e.store.statistics.watchlist.watched++,e.queue.watchlist.set(t.page.title,!0)}},"unwatch-page":{title:"Unwatch page",icon:"fas fa-eye-slash",progress:"Unwatching page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be unwatched when an item is selected."},script:async(e,t,n)=>await e.api.unwatchPage(t.page.title),successful:(e,t,n)=>{e.store.statistics.watchlist.unwatched++,e.queue.watchlist.set(t.page.title,!1)}},"whitelist-user":{title:"Add user to whitelist",icon:"fas fa-user-check",progress:"Adding user to whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be added to whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.users.set(t.user.name,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.whitelist.users).valueOf()]),e.store.statistics.items_whitelisted.total++,e.store.statistics.items_whitelisted.users++,e.gui.renderQueue(),{valid:!0})},"unwhitelist-user":{title:"Remove user from whitelist",icon:"fas fa-user-minus",progress:"Removing user from whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be removed from whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.users.delete(t.user.name),e.gui.renderQueue(),{valid:!0})},"whitelist-page":{title:"Add page to whitelist",icon:"fas fa-check",progress:"Adding page to whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be added to whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.pages.set(t.page.title,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.whitelist.pages).valueOf()]),e.store.statistics.items_whitelisted.total++,e.store.statistics.items_whitelisted.pages++,e.gui.renderQueue(),{valid:!0})},"unwhitelist-page":{title:"Remove page from whitelist",icon:"fas fa-minus",progress:"Removing page from whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be removed from whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.pages.delete(t.page.title),e.gui.renderQueue(),{valid:!0})},"highlight-user":{title:"Add user to highlighted users",icon:"fas fa-star",progress:"Adding user to highlighted users",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be added to highlighted users when an item is selected."},script:(e,t,n)=>(e.store.highlight.users.set(t.user.name,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.highlight.users).valueOf()]),e.store.statistics.items_highlighted.total++,e.store.statistics.items_highlighted.users++,e.gui.renderQueue(),{valid:!0})},"unhighlight-user":{title:"Remove user from highlighted users",icon:"fas fa-user-minus",progress:"Removing user from highlighted users",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be removed from highlighted users when an item is selected."},script:(e,t,n)=>(e.store.highlight.users.delete(t.user.name),e.gui.renderQueue(),{valid:!0})},"highlight-page":{title:"Add page to highlighted pages",icon:"fas fa-star",progress:"Adding page to highlighted pages",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be added to highlighted pages when an item is selected."},script:(e,t,n)=>(e.store.highlight.pages.set(t.page.title,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.highlight.pages).valueOf()]),e.store.statistics.items_highlighted.total++,e.store.statistics.items_highlighted.pages++,e.gui.renderQueue(),{valid:!0})},"unhighlight-page":{title:"Remove page from highlighted pages",icon:"fas fa-minus",progress:"Removing page from highlighted pages",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be removed from highlighted pages when an item is selected."},script:(e,t,n)=>(e.store.highlight.pages.delete(t.page.title),e.gui.renderQueue(),{valid:!0})},"refresh-user-contributions":{title:"Refresh user contributions",icon:"fas fa-rotate",progress:"Refreshing user contributions",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User contributions can only be refreshed when an item is selected."},script:async(e,t,n)=>{try{var s;document.querySelector("#refresh-page-history").classList.add("refreshing");const n=(await e.api.parseUsers([t.user.name]))[0].user;return e.queue.talks.set(t.user.name,n.talk),e.queue.contributions.set(t.user.name,n.contributions),e.queue.blocked.set(t.user.name,n.blocked),e.queue.blocks.set(t.user.name,n.blocks),t.user.edits=Math.max(n.edits,(null===(s=n.contributions)||void 0===s?void 0:s.length)||0),t.user.warning=e.queue.getWarningLevel(n.talk||""),t.user.warnings=e.queue.getWarningHistory(n.talk||""),delete t.user.cached_contributions,e.gui.renderQueue(),e.queue.current.item===t&&e.gui.newCurrentItem(t),{valid:!0}}catch(e){return console.error(e),{valid:!1,reason:"An error occurred while fetching user contributions."}}}},"refresh-page-history":{title:"Refresh page history",icon:"fas fa-rotate",progress:"Refreshing page history",valid:(e,t,n)=>t?"users"===t.type?{valid:!1,reason:"Page history cannot be refreshed for user creations."}:{valid:!0}:{valid:!1,reason:"Page history can only be refreshed when an item is selected."},script:async(e,t,n)=>{try{document.querySelector("#refresh-page-history").classList.add("refreshing");const[n,s]=await Promise.all([e.api.getHistory(t.page.title),e.api.getPagesDetails(t.page.title)]),i=s[t.page.title];return e.queue.histories.set(t.page.title,n),t.page.metadata=i.metadata,t.page.categories=i.categories,t.page.protection=i.protection,delete t.page.cached_history,e.gui.renderQueue(),e.queue.current.item===t&&e.gui.newCurrentItem(t),{valid:!0}}catch(e){return console.error(e),{valid:!1,reason:"An error occurred while fetching page history."}}}},"open-user-page":{title:"Open user page",icon:"fas fa-circle-user",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`User:${t.user.name}`)),{valid:!0})},"open-user-talk":{title:"Open user talk page",icon:"fas fa-comment",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User talk page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`User talk:${t.user.name}`)),{valid:!0})},"open-user-contributions":{title:"Open user contributions",icon:"fas fa-list",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User contributions can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`Special:Contributions/${t.user.name}`)),{valid:!0})},"open-user-filter-log":{title:"Open user filter log",icon:"fas fa-filter",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User filter log can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`?title=Special:AbuseLog&wpSearchUser=${encodeURIComponent(t.user.name)}`,!0)),{valid:!0})},"open-page":{title:"Open page",icon:"fas fa-file",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(t.page.title)),{valid:!0})},"open-page-talk":{title:"Open page talk",icon:"fas fa-comments",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page talk can only be opened when an item is selected."},script:(e,t,n)=>{const s=t.page.title.split(":");let i="Talk";s.length>1&&(i=s[0].toLowerCase().includes("talk")?s[0]:`${s[0]} talk`);const a=e.page(`${i}:${1===s.length?s[0]:s.slice(1).join(":")}`);return e.open(a),{valid:!0}}},"open-page-history":{title:"Open page history",icon:"fas fa-clock-rotate-left",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page history can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`Special:PageHistory/${t.page.title}`)),{valid:!0})},"open-revision":{title:"Open revision",icon:"fas fa-file-lines",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Revision can only be opened for edits."}:{valid:!0}},script:(e,t,n)=>(e.open(e.page(`Special:Permalink/${t.id}`)),{valid:!0})},"open-diff":{title:"Open diff",icon:"fas fa-code-compare",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Diff can only be opened for edits."}:{valid:!0}},script:(e,t,n)=>(e.open(e.page(`Special:Diff/${t.id}`)),{valid:!0})},"copy-link":{title:"Copy link",icon:"fas fa-link",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Link can only be copied when an item is selected."},script:(e,t,n)=>{if("edit"===t.group)navigator.clipboard.writeText(e.page(`?diff=${t.id}`,!0));else if("logevent"===t.group)navigator.clipboard.writeText(e.page(`?title=Special:Log&logid=${t.id}`,!0));else{if("abuselog"!==t.group)return e.gui.dialog.toast("Cannot copy link","Please report this issue to a developer, including the error code below:<br><br><code>UNKNOWN_ITEM_GROUP_FOR_LINK_COPY</code>","error",3e3),{valid:!1};t.revid?navigator.clipboard.writeText(e.page(`?diff=${t.revid}`,!0)):navigator.clipboard.writeText(e.page(`?title=Special:AbuseLog/${t.id}`,!0))}return e.gui.dialog.toast("Link copied","The link has been copied to your clipboard.","success",3e3),{valid:!0}}},"open-revert-menu":{title:"Open revert menu",icon:"fas fa-undo",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Revert menu is only available for edits."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector('[data-menu="revert"]'),i=document.querySelector("#revert-menu");if(i.innerHTML="",e.gui.createWarnMenu("reverts",i,t),s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-warn-menu":{title:"Open warn menu",icon:"fas fa-exclamation-triangle",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Warning menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="warn"]'),i=document.querySelector("#warn-menu");if(i.innerHTML="",e.gui.createWarnMenu("warnings",i,t),s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-user-menu":{title:"Open user menu",icon:"fas fa-flag",valid:(e,t,n)=>e.queue.current.item?{valid:!0}:{valid:!1,reason:"User menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="user"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-page-menu":{title:"Open page menu",icon:"fas fa-flag",valid:(e,t,n)=>e.queue.current.item?{valid:!0}:{valid:!1,reason:"Page menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="page"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-edit-menu":{title:"Open edit menu",icon:"fas fa-flag",valid:(e,t,n)=>{let i=e.queue.current.item.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit menu is only available for edits."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector('[data-menu="edit"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"switch-to-recent-queue":{title:"Switch to recent changes queue",icon:"fas fa-stopwatch",valid:(e,t,n)=>e.store.settings.queue.recent.enabled?{valid:!0}:{valid:!1,reason:"Recent changes queue is not enabled."},script:(e,t,n)=>(e.queue.switch("recent"),{valid:!0})},"switch-to-pending-queue":{title:"Switch to pending changes queue",icon:"fas fa-flag",valid:(e,t,n)=>e.store.settings.queue.pending.enabled?e.rights.review?e.api.hasPendingChanges?{valid:!0}:{valid:!1,reason:"The pending changes extension is not enabled on this wiki."}:{valid:!1,reason:"You do not have permission to review pending changes."}:{valid:!1,reason:"Pending changes queue is not enabled."},script:(e,t,n)=>(e.queue.switch("pending"),{valid:!0})},"switch-to-watchlist-queue":{title:"Switch to watchlist queue",icon:"fas fa-book-bookmark",valid:(e,t,n)=>e.store.settings.queue.watchlist.enabled?{valid:!0}:{valid:!1,reason:"Watchlist queue is not enabled."},script:(e,t,n)=>(e.queue.switch("watchlist"),{valid:!0})},"switch-to-users-queue":{title:"Switch to user creation logs queue",icon:"fas fa-user-plus",valid:(e,t,n)=>e.store.settings.queue.users.enabled?{valid:!0}:{valid:!1,reason:"User creation logs queue is not enabled."},script:(e,t,n)=>(e.queue.switch("users"),{valid:!0})},"switch-to-abuselog-queue":{title:"Switch to abuse log queue",icon:"fas fa-filter-circle-xmark",valid:(e,t,n)=>e.store.settings.queue.abuselog.enabled?{valid:!0}:{valid:!1,reason:"Abuse log queue is not enabled."},script:(e,t,n)=>(e.queue.switch("abuselog"),{valid:!0})},"toggle-zen-mode":{title:"Toggle zen mode",icon:"fas fa-spa",script:(e,t,n)=>{var s;return e.store.settings.zen.enabled=!e.store.settings.zen.enabled,null===(s=document.querySelector("#zen-mode-enable"))||void 0===s||s.classList.toggle("active",e.store.settings.zen.enabled),e.gui.updateZenMode(),{valid:!0}}},"toggle-consecutive-edits":{title:"Toggle consecutive edits",icon:"fas fa-users",valid:(e,t,n)=>{const s=e.queue.current.type;return"recent"!==s&&"watchlist"!==s?{valid:!1,reason:"Consecutive edits can only be viewed in the recent changes or watchlist queues."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector("#consecutive-edits-tab");return s.classList.contains("hidden")||(s.classList.contains("selected")?document.querySelector("latest-edits-tab").click():s.click()),{valid:!0}}}}},8921(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.EventManager=void 0;var s=n(985),i=n(870),a=n(5564);t.EventManager=class{constructor(e){this.ws=e,this.events=s.events,this.conditions=i.conditions}button(e,t){const n=this.ws;e.addEventListener("click",e=>(e=>{n.gui.selectedMenu=null;const s=n.queue.current.item,i={};for(const o of(null===(a=(r=n.gui.events.events[t]).parameters)||void 0===a?void 0:a.call(r,n,s))||[]){var a,r;"external"===o.id&&(i[o.id]=(null==e?void 0:e.altKey)||!1)}n.execute({actions:[{name:t,params:i}]})})(e))}submenu(e,t){var n,s;const i=this.events[t];e.dataset.eventName=t;const r=this.ws.queue.current,o=`${r.type}:${null===(n=r.item)||void 0===n?void 0:n.id}`,l={};if(e.dataset.eventId===o)for(const t of(null===(d=i.parameters)||void 0===d?void 0:d.call(i,this.ws,this.ws.queue.current.item))||[]){var d;const n=e.querySelector(`[data-paramid="${t.id}"]`);l[t.id]="checkbox"===n.type?n.checked:n.value}else e.dataset.eventId=o;e.innerHTML="";const c=document.createElement("div");c.classList.add("bottom-subcontent-title"),c.textContent=i.title,e.appendChild(c);const u=new Map,p={},g=(0,a.sortDependencies)((null===(s=i.parameters)||void 0===s?void 0:s.call(i,this.ws,this.ws.queue.current.item))||[]);for(const t of g){const n=document.createElement("div");n.classList.add("bottom-subcontent-input-title"),n.textContent=t.title,e.appendChild(n);const s={};for(const e of null!==(h=t.dependencies)&&void 0!==h?h:[]){var h;s[e]=p[e]}const i="function"==typeof t.default?t.default(s):t.default;let a=null;switch(t.type){case"choice":{const n=document.createElement("select");n.dataset.paramid=t.id,e.appendChild(n);const r="function"==typeof t.options?t.options(s):t.options;for(const e of null!=r?r:[]){const t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),a=()=>{const e={};for(const n of null!==(s=t.dependencies)&&void 0!==s?s:[]){var s;e[n]=p[n]}const i=n.value,a="function"==typeof t.options?t.options(e):t.options;n.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}if(a.includes(i))n.value=i;else{const s="function"==typeof t.default?t.default(e):t.default;n.value=s,p[t.id]=s}},n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}break;case"text":{const n=document.createElement("input");n.type="text",n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}break;case"boolean":{const n=document.createElement("input");n.type="checkbox",n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.checked=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.checked=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.checked;for(const e of u.get(t.id)||[])e()})}break;case"duration":{const n=document.createElement("duration-input");n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}}if("function"==typeof a)for(const e of null!==(m=t.dependencies)&&void 0!==m?m:[]){var m;u.has(e)||u.set(e,[]),u.get(e).push(a)}}const v=document.createElement("button");v.classList.add("bottom-subcontent-button"),v.textContent="Submit",e.appendChild(v),v.addEventListener("click",()=>{const n={};for(const t of g){const s=e.querySelector(`[data-paramid="${t.id}"]`);n[t.id]=s.value}this.ws.execute({actions:[{name:t,params:n}]}),this.ws.gui.closeMenus()})}}},372(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Queue=void 0;var s=n(2852),i=n(2595),a=n(6400);function r(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){return e.get(d(e,t))}function d(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var c=new WeakMap,u=new WeakSet;class p{static areSameGroup(e,t){return this.groups[e]===this.groups[t]}constructor(e){var t,n;r(t=this,n=u),n.add(t),function(e,t,n){r(e,t),t.set(e,n)}(this,c,Promise.resolve()),this.ws=e,this.queues=Object.fromEntries(["void",...p.types].map(t=>[t,{type:t,item:null,previous:null,queue:[],hold:[],repeats:{},history:new i.Stack(100),memory:new s.Memory({size:1e3}),last:{timestamp:e.util.utcString(new Date),id:0}}])),this.cache={simple:new s.Memory({size:1e3}),full:new s.Memory({size:250})},this.current=this.queues[p.types[0]],this.pending=new Map,this.watchlist=new s.Memory({size:1e3}),this.talks=new s.Memory({size:500}),this.warnings=new s.Memory({size:1e3,timeout:864e5}),this.noWelcome=new s.Memory({timeout:36e5}),this.histories=new s.Memory({size:1e3}),this.contributions=new s.Memory({size:1e3}),this.blocks=new s.Memory({size:1e3}),this.blocked=new s.Memory({size:1e4}),this.playedSound={mention:new s.Memory({timeout:6e4})},this.bypass=new s.Memory({timeout:36e5,size:1e4}),this.backoff=2e3}switch(e){var t;this.current.type!==e&&("pending"===this.current.type&&(this.queues.pending.queue=this.queues.pending.queue.filter(e=>this.pending.has(e.id))),document.querySelector("#clear-queue").classList.toggle("hidden","pending"===e),this.current=this.queues[e],this.current.queue.some(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)})||(this.current.item=this.current.queue[0]||null),this.ws.gui.renderQueue(),this.ws.gui.newCurrentItem(this.current.item),document.querySelectorAll("#queue-tabs > .queue-tab.selected").forEach(e=>e.classList.remove("selected")),null===(t=document.querySelector(`#queue-tab-${e}`))||void 0===t||t.classList.add("selected"))}async fetch(){try{const i=this.ws.store.settings.queue;if(i.pending.enabled&&this.ws.rights.review){const e=(await this.ws.api.feeds(null,{ns:"*",full:!0})).pending;this.pending.clear(),Object.values(e).forEach(e=>this.pending.set(e.revid,e)),await this.outdated("pending")}const a=await this.ws.api.feeds(i.recent.enabled?{ns:this.ws.store.settings.namespaces.join("|"),since:this.queues.recent.last.timestamp}:null,i.pending.enabled&&this.ws.rights.review?{ns:"*",full:!1}:null,i.users.enabled?{ns:"*",since:this.queues.users.last.timestamp}:null,i.watchlist.enabled?{ns:"*",since:this.queues.watchlist.last.timestamp}:null,i.abuselog.enabled?{ns:this.ws.store.settings.namespaces.join("|"),since:this.queues.abuselog.last.timestamp}:null),r=this.ws.store.whitelist;for(const i of p.types){var e;const o=this.queues[i].last.id;let l=null!==(e=a[i])&&void 0!==e?e:[];const d=l.reduce((e,t)=>Math.max(e,t.timestamp),0);switch(d&&(this.queues[i].last.timestamp=this.ws.util.utcString(new Date(d))),p.groups[i]){case"edit":{const e=e=>e.revid>o;l="recent"===i?l.filter(t=>e(t)&&!r.pages.has(t.title)):l.filter(e)}break;case"abuselog":l=l.filter(e=>e.id>o);break;case"logevent":l=l.filter(e=>e.logid>o)}l=l.concat(this.queues[i].hold),l.length>25?this.queues[i].hold=l.splice(25).reverse():this.queues[i].hold=[];let c=!1;switch(i){case"recent":{const e=new Set;for(const n of l)for(const s of this.queues[i].queue){var t;e.has(s)||s.id!==(null===(t=this.current.item)||void 0===t?void 0:t.id)&&n.title===s.page.title&&s.id<n.revid&&e.add(s)}for(const t of e){const e=this.queues[i].queue.indexOf(t);e>-1&&(this.queues[i].queue.splice(e,1),this.ws.gui.removeQueueItem(i,t.id))}c=e.size>0}break;case"pending":for(const e of this.queues[i].queue){var n;if((null===(n=this.current.item)||void 0===n?void 0:n.id)!==e.id&&!this.pending.has(e.id)){const t=this.queues[i].queue.indexOf(e);t>-1&&(this.queues[i].queue.splice(t,1),this.ws.gui.removeQueueItem(i,e.id),c=!0)}}break;case"users":l=l.filter(e=>!e.temp);break;case"watchlist":{const e=new Set;for(const t of l)for(const n of this.queues[i].queue){var s;e.has(n)||n.id!==(null===(s=this.current.item)||void 0===s?void 0:s.id)&&(t.title===n.page.title&&n.id<t.revid?e.add(n):n.page.watched||e.add(n))}if(0===l.length)for(const t of this.queues[i].queue)t.page.watched||e.add(t);for(const t of e){const e=this.queues[i].queue.indexOf(t);e>-1&&(this.queues[i].queue.splice(e,1),this.ws.gui.removeQueueItem(i,t.id))}c=e.size>0}}if(0!==l.length)switch(p.groups[i]){case"edit":{this.queues[i].last.id=l.reduce((e,t)=>Math.max(e,t.revid),0);const e=this.ws.store.highlight,t=t=>{var n;return e.users.has(t.user)||e.pages.has(t.title)||(null===(n=t.tags)||void 0===n?void 0:n.some(t=>e.tags.has(t)))};l=l.filter(e=>{var n;return!r.users.has(e.user)&&!(null!==(n=e.tags)&&void 0!==n&&n.some(e=>r.tags.has(e)))&&(!this.bypass.has(e.user)||t(e))});const n={};let[s,a]=await Promise.allSettled(["recent"===i?this.ws.api.getEditCounts(l.map(e=>e.user).filter(e=>!this.bypass.has(e))):Promise.resolve([]),this.ws.api.getORES(l.filter(e=>{var t;if(null===(t=e.oresscores)||void 0===t||!t.length)return!0;n[e.revid]=e.oresscores},this.ws.store.settings.queue.ores_bias).map(e=>e.revid))]);"rejected"===s.status&&console.error("Edit counts failed:",s.reason),s="fulfilled"===s.status?s.value:{},"rejected"===a.status&&console.error("ORES failed:",a.reason),a="fulfilled"===a.status?a.value:{};for(const[e,t]of Object.entries(await this.ws.api.extractORES(n,this.ws.store.settings.queue.ores_bias)))a[e]=t;const o=this.queues[i].repeats,d=[];if("recent"===i){const e=this.ws.store.settings.queue.min_ores,n=this.ws.store.settings.queue.max_edits;l.forEach(r=>{var l,c;if(isNaN(a[r.revid])&&(o[r.revid]||0)<3)return o[r.revid]=(o[r.revid]||0)+1,this.queues[i].hold.push(r);delete o[r.revid];const u=null!==(l=null!==(c=s[r.user])&&void 0!==c?c:this.bypass.get(r.user))&&void 0!==l?l:0;u>n?(this.bypass.set(r.user,u),t(r)&&d.push(r)):((a[r.revid]||0)>=e||t(r))&&d.push(r)})}else l.forEach(e=>{if(isNaN(a[e.revid])&&(o[e.revid]||0)<3)return o[e.revid]=(o[e.revid]||0)+1,this.queues[i].hold.push(e);delete o[e.revid],d.push(e)});await this.add(i,d)}break;case"logevent":{let e=0;const t=new Set,n=[];l.forEach(s=>{t.has(s.logid)||(t.add(s.logid),s.logid>e&&(e=s.logid),n.push(s))}),this.queues[i].last.id=e,await this.add(i,n)}break;case"abuselog":{const e=l.filter(e=>null===e.editcount);let t={};e.length>0&&(t=await this.ws.api.getEditCounts(e.map(e=>e.user)));const n=this.ws.store.settings.queue.max_edits;let s=0;const a=[];l.forEach(e=>{var i;((null!==(i=e.editcount)&&void 0!==i?i:t[e.user])||0)>n||(e.id>s&&(s=e.id),a.push(e))}),this.queues[i].last.id=s,await this.add(i,a)}}else c&&this.ws.gui.renderQueue(this.queues[i].queue,this.current.edit,i)}await this.outdated(),this.backoff=p.refresh}catch(e){console.error(e),this.backoff=Math.min(2*this.backoff,12e4)}setTimeout(()=>this.fetch(),this.backoff)}async outdated(){{const e=[];for(const t of this.queues.pending.queue)t!==this.current.item&&(this.pending.has(t.id)||e.push(t));if(e.length>0)for(const t of e){const e=this.queues.pending.queue.indexOf(t);e>-1&&(this.queues.pending.queue.splice(e,1),this.ws.gui.removeQueueItem("pending",t.id))}}const e=new Set,t=["recent","watchlist","abuselog"];for(const n of t)this.queues[n].queue.forEach(t=>{("abuselog"!==n||t.revid)&&e.add(t.page.title)});const n=await this.ws.api.getLatestIds([...e]);for(const e of t){const t=[];for(const s of this.queues[e].queue){let i=s.id;if("abuselog"===e){if(!s.revid)continue;i=s.revid}const a=n[s.page.title];a&&a>i&&t.push([s.id,i])}if(t.length>0)for(const[n,i]of t){var s;const t="abuselog"===e?"revid":"id";if(i===(null===(s=this.queues[e].item)||void 0===s?void 0:s[t]))continue;const a=this.queues[e].queue.findIndex(e=>e[t]===i);a>-1&&(this.queues[e].queue.splice(a,1),this.ws.gui.removeQueueItem(e,n))}}this.ws.gui.renderQueue()}async add(e,t){const n={edit:"revid",logevent:"logid",abuselog:"id"}[p.groups[e]];(t=t.filter(t=>!this.queues[e].memory.has(t[n]))).forEach(t=>this.queues[e].memory.add(t[n]));const s=t.length;if(0===s)return;const i={ores:!1,mention:!1},a=await this.generate(e,t,!1);switch(p.groups[e]){case"edit":{const n=this.ws.store.settings.audio.ores_alert.threshold;for(let r=0;r<s;r++){t[r];const s=a[r];this.queues[e].queue.push(s),"recent"===e&&s.ores>=n&&(i.ores=!0),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}}break;case"logevent":for(let n=0;n<s;n++){t[n];const s=a[n];this.queues[e].queue.push(s),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}break;case"abuselog":for(let n=0;n<s;n++){t[n];const s=a[n];this.queues[e].queue.push(s),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}}this.sort(e),i.ores&&this.ws.store.settings.audio.ores_alert.enabled&&this.ws.audio.playSound(["queue","ores"]),i.mention&&this.ws.store.settings.username_highlighting.enabled&&this.ws.audio.playSound(["queue","mention"]),this.ws.gui.renderQueue(this.queues[e].queue,this.queues[e].item,e)}sort(e){var t;let n=-1;this.queues[e].item&&(n=this.queues[e].queue.findIndex(t=>t===this.queues[e].item));let s=this.queues[e].queue;n>=0&&(s=s.slice(0,n).concat(s.slice(n+1)));const i=this.ws.store.highlight,a=this.ws.store.settings.username_highlighting.enabled;switch(p.groups[e]){case"edit":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return-1;if(t.history)return 1;let n=e.ores;a&&e.mentions.has&&(n+=200),i.users.has(e.user.name)&&(n+=100),i.pages.has(e.page.title)&&(n+=75),n+=50*e.tags.filter(e=>i.tags.has(e)).length;let s=t.ores;return a&&t.mentions.has&&(s+=200),i.users.has(t.user.name)&&(s+=100),i.pages.has(t.page.title)&&(s+=75),s+=50*t.tags.filter(e=>i.tags.has(e)).length,n===s?t.id-e.id:s-n});break;case"logevent":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return 1;if(t.history)return-1;let n=100*(e.user.profanity.clamped||0);a&&e.mentions.has&&(n+=200);let s=100*(t.user.profanity.clamped||0);return a&&t.mentions.has&&(s+=200),n===s?t.id-e.id:s-n});break;case"abuselog":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return 1;if(t.history)return-1;let n=0;i.users.has(e.user.name)&&(n+=100),i.pages.has(e.page.title)&&(n+=75),a&&e.mentions.has&&(n+=200);let s=0;return i.users.has(t.user.name)&&(s+=100),i.pages.has(t.page.title)&&(s+=75),a&&t.mentions.has&&(s+=200),n===s?t.id-e.id:s-n})}const r=new Set(null!==(t=this.queues[e].item)&&void 0!==t&&t.id?[this.queues[e].item.id]:[]);s=s.filter(e=>!r.has(e.id)&&(r.add(e.id),!0)),n>=0&&s.splice(n,0,this.queues[e].item),this.queues[e].queue=[...s.slice(0,this.ws.store.settings.queue.max_size)],this.queues[e].item||(this.queues[e].item=this.queues[e].queue[0])}async generate(e,t,n,s={}){var i;if(0===t.length)return[];const r=null!==(i=null==s?void 0:s.bypass)&&void 0!==i&&i,o=this.ws,l=o.api.username,d=[];switch(p.groups[e]){case"edit":{t=(t=t.filter(e=>{const t=(e=>{if(n){if(this.cache.simple.has(e))return this.cache.simple.get(e);if(this.cache.full.has(e))return this.cache.full.get(e)}else if(this.cache.full.has(e))return this.cache.full.get(e);return null})(e.revid);var s;return!t||(e.pending&&!t.pending&&(t.pending=e.pending),null!==(s=void d.push(t))&&void 0!==s&&s)})).map(e=>{var t;let n=null;return e.pending&&(n=null===(t=this.pending.get(e.revid))||void 0===t?void 0:t.prior),null!=n||(n=e.old_revid||e.parentid),{item:e,prior:n}});const s=await o.api.parseEdits(t,n,this.ws.store.settings.queue.ores_bias,r);for(const t of s){var c;const{item:s,prior:i,data:a}=t,r={comment:!1,diff:!1};if(l&&a.edit.diff){const e=document.createElement("div");e.innerHTML=a.edit.diff,e.textContent&&(r.diff=o.util.match(l,e.textContent))}this.watchlist.set(s.title,a.page.watched),this.histories.set(s.title,a.page.history),this.contributions.set(s.user,a.user.contributions),this.blocks.set(s.user,a.user.blocks),this.blocked.set(s.user,a.user.blocked);const u=["0","1","2","3","4","4im"],g=this.getWarningLevel(a.user.talk||"");u.indexOf(g)>u.indexOf(this.warnings.get(s.user)||"0")&&this.warnings.set(s.user,g);const h={page:{namespace:s.ns,title:s.title,get history(){var e;return null!==(e=o.queue.histories.get(s.title))&&void 0!==e?e:a.page.history},get watched(){var e;return null!==(e=o.queue.watchlist.get(s.title))&&void 0!==e?e:a.page.watched},metadata:a.page.metadata,categories:a.page.categories,protection:a.page.protection},user:{name:s.user,ip:o.util.isIPAddress(s.user),temp:o.util.isTempAccount(s.user),anon:o.util.isIPAddress(s.user)||o.util.isTempAccount(s.user),edits:Math.max(a.user.edits,(null===(c=a.user.contributions)||void 0===c?void 0:c.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(s.user))&&void 0!==e?e:a.user.contributions},warning:this.getWarningLevel(a.user.talk||""),warnings:this.getWarningHistory(a.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(s.user))&&void 0!==e?e:a.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(s.user))&&void 0!==e?e:a.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(s.user))&&void 0!==e?e:a.user.talk}},mentions:r,AI:{edit:null,username:null},id:s.revid,prior:i,timestamp:s.timestamp,comment:s.parsedcomment,minor:s.minor||!1,diff:a.edit.diff,sizediff:("sizediff"in s?s.sizediff:s.newlen-s.oldlen)||0,ores:a.edit.ores,tags:s.tags||[],reverts:a.page.reverts,consecutive:a.page.consecutive,propagating:!1,reviewed:!1,history:!1,pending:s.pending||!1,group:p.groups[e],type:e,simple:n,origin:s};!n&&o.AI&&(o.store.settings.AI.edit_analysis.enabled&&o.AI.analyze.edit(h).then(e=>h.AI.edit=e).catch(e=>h.AI.edit={error:e.message}).finally(()=>{var e;h.id===(null===(e=this.current.item)||void 0===e?void 0:e.id)&&o.gui.updateAIAnalysisDisplay(h.AI.edit)}),h.user.anon||o.store.whitelist.users.has(h.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(h).then(e=>{h.AI.username=e,e.flag&&this.promptUAA(h,e)}).catch(e=>h.AI.username={error:e.message})),d.push(h),n?this.cache.simple.set(s.revid,h):(this.cache.full.set(s.revid,h),this.cache.simple.has(s.revid)&&this.cache.simple.delete(s.revid))}}break;case"logevent":{const s=await o.api.parseUsers(t.map(e=>e.title.replace(/^(User|User talk):/,"")),n,r),i=await o.api.parseUsers(t.map(e=>e.user),n,r);for(let r=0;r<t.length;r++){var u,g;const c=t[r],h=s[r],m=i[r],v=c.title.replace(/^(User|User talk):/,""),f={username:!1,comment:!1};l&&v&&(f.username=o.util.match(l,v)),this.contributions.set(v,h.user.contributions),this.contributions.set(c.user,m.user.contributions),this.blocks.set(v,h.user.blocks),this.blocks.set(c.user,m.user.blocks),this.blocked.set(v,h.user.blocked),this.blocked.set(c.user,m.user.blocked);const b=["0","1","2","3","4","4im"],w=this.getWarningLevel(h.user.talk||"");b.indexOf(w)>b.indexOf(this.warnings.get(v)||"0")&&this.warnings.set(v,w);const y=this.getWarningLevel(m.user.talk||"");b.indexOf(y)>b.indexOf(this.warnings.get(c.user)||"0")&&this.warnings.set(c.user,y);const x=a.profanity.evaluate(v),k={page:{namespace:c.ns,title:c.title,history:[],get watched(){return!1},metadata:[],categories:[],protection:{}},user:{name:v,ip:o.util.isIPAddress(v),temp:o.util.isTempAccount(v),anon:o.util.isIPAddress(v)||o.util.isTempAccount(v),edits:Math.max(h.user.edits,(null===(u=h.user.contributions)||void 0===u?void 0:u.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(v))&&void 0!==e?e:h.user.contributions},warning:this.getWarningLevel(h.user.talk||""),warnings:this.getWarningHistory(h.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(v))&&void 0!==e?e:h.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(v))&&void 0!==e?e:h.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(v))&&void 0!==e?e:h.user.talk},profanity:x},performer:{name:c.user,ip:o.util.isIPAddress(c.user),temp:o.util.isTempAccount(c.user),anon:o.util.isIPAddress(c.user)||o.util.isTempAccount(c.user),edits:Math.max(m.user.edits,(null===(g=m.user.contributions)||void 0===g?void 0:g.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(c.user))&&void 0!==e?e:m.user.contributions},warning:this.getWarningLevel(m.user.talk||""),warnings:this.getWarningHistory(m.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(c.user))&&void 0!==e?e:m.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(c.user))&&void 0!==e?e:m.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(c.user))&&void 0!==e?e:m.user.talk}},mentions:f,AI:{username:null},id:c.logid,timestamp:c.timestamp,comment:c.parsedcomment,ores:x.clamped||0,filters:x.matches.map(e=>({filter:e.name,id:e.match})),propagating:!1,reviewed:!1,history:!1,group:p.groups[e],type:e,simple:n,origin:c};!n&&o.AI&&(k.user.anon||o.store.whitelist.users.has(k.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(k).then(e=>{k.AI.username=e,e.flag&&this.promptUAA(k,e)}).catch(e=>k.AI.username={error:e.message})),d.push(k)}}break;case"abuselog":{const s=await o.api.parseAbuselogs(t,n,r);for(const t of s){var h,m;const{item:s,data:i}=t,a={comment:!1,diff:!1};if(l&&i.edit.diff){const e=document.createElement("div");e.innerHTML=i.edit.diff,e.textContent&&(a.diff=o.util.match(l,e.textContent))}this.watchlist.set(s.title,i.page.watched),this.histories.set(s.title,i.page.history),this.contributions.set(s.user,i.user.contributions),this.blocks.set(s.user,i.user.blocks),this.blocked.set(s.user,i.user.blocked);const r=["0","1","2","3","4","4im"],c=this.getWarningLevel(i.user.talk||"");r.indexOf(c)>r.indexOf(this.warnings.get(s.user)||"0")&&this.warnings.set(s.user,c);const u=["disallow","warn","showcaptcha","tag","none"],g=u.length;let v=g-1;for(let e=0;e<g;e++)if(s.result.has(u[e])){v=e;break}const f={page:{namespace:s.ns,title:s.title,get history(){var e;return null!==(e=o.queue.histories.get(s.title))&&void 0!==e?e:i.page.history},get watched(){var e;return null!==(e=o.queue.watchlist.get(s.title))&&void 0!==e?e:i.page.watched},metadata:i.page.metadata,categories:i.page.categories,protection:i.page.protection},user:{name:s.user,ip:o.util.isIPAddress(s.user),temp:o.util.isTempAccount(s.user),anon:o.util.isIPAddress(s.user)||o.util.isTempAccount(s.user),edits:Math.max(i.user.edits,(null===(h=i.user.contributions)||void 0===h?void 0:h.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(s.user))&&void 0!==e?e:i.user.contributions},warning:this.getWarningLevel(i.user.talk||""),warnings:this.getWarningHistory(i.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(s.user))&&void 0!==e?e:i.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(s.user))&&void 0!==e?e:i.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(s.user))&&void 0!==e?e:i.user.talk}},mentions:a,AI:{edit:null,username:null},id:s.id,revid:s.revid,timestamp:s.timestamp,comment:i.parsedcomment,minor:!1,diff:i.edit.diff,sizediff:null===(m=s.diff)||void 0===m?void 0:m.size,ores:+(1-v/(g-1)).toFixed(2),filters:s.entries.map(e=>({id:(null==e?void 0:e.filter_id)||"-1",filter:null==e?void 0:e.filter}))||[],reverts:i.page.reverts,propagating:!1,reviewed:!1,history:!1,group:p.groups[e],type:e,simple:n,origin:s};!n&&o.AI&&(o.store.settings.AI.edit_analysis.enabled&&i.edit.diff&&o.AI.analyze.edit(f).then(e=>f.AI.edit=e).catch(e=>f.AI.edit={error:e.message}).finally(()=>{var e;f.id===(null===(e=this.current.item)||void 0===e?void 0:e.id)&&o.gui.updateAIAnalysisDisplay(f.AI.edit)}),f.user.anon||o.store.whitelist.users.has(f.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(f).then(e=>{f.AI.username=e,e.flag&&this.promptUAA(f,e)}).catch(e=>f.AI.username={error:e.message})),d.push(f)}}}return d.forEach(e=>{if(e.comment){const t=(new DOMParser).parseFromString(e.comment,"text/html").body;t.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,n]=e.trim().split(/\s+/,2),s=new URL(t,`https://${this.ws.server}`).href;return n?`${s} ${n}`:s}).join(", ");e.setAttribute("srcset",t)}),e.comment=t.innerHTML;const n=(t.textContent||"").trim();e.has_comment=Boolean(n),!1===e.mentions.comment&&(e.mentions.comment=o.util.match(l,n)),e.mentions&&(e.mentions.has=Object.values(e.mentions).some(e=>e))}else e.has_comment=!1}),d}previous(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});if("pending"===this.current.type)return this.current.item=this.current.queue[Math.max(e-1,0)],this.ws.gui.renderQueue();if(e<=0){if(0===this.current.history.length)return;return this.current.queue.unshift(this.current.history.pop()),this.current.item=this.current.queue[0],this.ws.gui.renderQueue()}this.current.item=this.current.queue[e-1],this.ws.gui.renderQueue()}next(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});if(-1===e)return this.current.item=this.current.queue[0],this.ws.gui.renderQueue();if("pending"===this.current.type)return this.current.item=this.current.queue[Math.min(e+1,this.current.queue.length-1)],this.ws.gui.renderQueue();const t=this.current.item,n=p.groups[t.type];if(!t.reviewed&&("edit"===n||"abuselog"===n&&t.revid)){"watchlist"===t.type&&this.ws.api.markWatchlistSeen(t.page.title,t.id);const e="abuselog"===t.type?t.revid:t.id;if(["recent","watchlist","abuselog"].filter(e=>e!==t.type).forEach(t=>{this.queues[t].queue="abuselog"===t?this.queues[t].queue.filter(n=>n.revid!==e||(this.queues[t].history.push({...n,history:performance.now()}),!1)):this.queues[t].queue.filter(n=>n.id!==e||(this.queues[t].history.push({...n,history:performance.now()}),"watchlist"===t&&this.ws.api.markWatchlistSeen(n.page.title,n.id),!1))}),"abuselog"!==n){let e=this.queues.abuselog.queue.filter(e=>t.user.name===e.user.name&&t.page.title===e.page.title&&Math.abs(new Date(t.timestamp).getTime()-new Date(e.timestamp).getTime())<1e4);e.length>0&&Promise.allSettled(e.map(async e=>{let t=e.revid;return t||(t=await this.ws.api.getAbuseLogRevid(e.id)),t?(e.revid=t,{id:e.id,revid:t}):null})).then(e=>{const t=e.map(e=>"fulfilled"===e.status?e.value:null).filter(e=>e);this.queues.abuselog.queue=this.queues.abuselog.queue.filter(e=>!t.some(t=>t.revid===e.revid)),"abuselog"===this.current.type&&(t.forEach(e=>this.ws.gui.removeQueueItem("abuselog",e.id)),this.ws.gui.renderQueue(this.queues.abuselog.queue,this.queues.abuselog.item,"abuselog"))}).catch(()=>{})}}t.reviewed=!0,t&&this.ws.AI&&this.ws.AI.cancel.edit(t.id),this.current.queue.splice(e,1),this.ws.gui.removeQueueItem(this.current.type,t.id),0===this.current.queue.length?this.current.item=null:e<this.current.queue.length?this.current.item=this.current.queue[e]:this.current.item=this.current.queue[this.current.queue.length-1],t&&"edit"===p.groups[this.current.type]&&this.promptWelcome(t),this.current.history.push({...t,history:performance.now()}),this.ws.gui.renderQueue()}canGoPrevious(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});return-1===e?this.current.history.length>0:"pending"===this.current.type?e>0:0!==e||this.current.history.length>0}canGoNext(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});return-1===e?Boolean(this.current.queue[0]):"pending"!==this.current.type||e<this.current.queue.length-1}clear(e){"pending"!==e&&(this.queues[e].item=null,this.queues[e].queue=[],this.current.type===e&&(this.ws.gui.newCurrentItem(null),this.ws.gui.clearQueueItems()))}async promptWelcome(e){if(!this.ws.store.settings.auto_welcome.enabled&&e.user.anon&&0!==(e.user.edits||0)&&void 0!==e.user.talk&&!this.noWelcome.has(e.user.name))try{var t;const n=`User talk:${e.user.name}`,s=await this.ws.api.pagesExist([n]);if(void 0!==s[n])return null!==(t=void this.talks.set(e.user.name,s[n]))&&void 0!==t?t:s[n];await this.ws.gui.settings.waitForClose();const i=await this.ws.gui.dialog.confirm("Auto-Welcome User",`Would you like to welcome <span class="confirmation-modal-username">${this.ws.util.escape(e.user.name)}</span>?<br><br>\n\t\t\t\t\t<span style="font-size: 0.9em; color: #888;">Editing: <strong>${this.ws.util.escape(e.page.title)}</strong></span>`,{username:e.user.name,hideUAA:!1});this.noWelcome.add(e.user.name),i&&this.ws.execute({actions:[{name:"welcome-user",params:{template:"Auto"}}]},void 0,void 0,e)}catch(e){console.error("Error during auto-welcome check:",e)}}promptUAA(e,t){var n,s,i;return n=c,s=this,i=l(c,this).then(()=>d(u,this,g).call(this,e,t)).catch(()=>{}),n.set(d(n,s),i),l(c,this)}async propagate(e,t){if(e.propagating)return await e.propagating;if(e.simple){let n;e.propagating=new Promise(e=>n=e);const[s]=await this.generate(e.type,[e.origin],!1,{bypass:t});s.history=e.history,Object.assign(e,s),n(),e.propagating=!1}else this.generate(e.type,[e.origin],!1,{bypass:t}).then(([t])=>{const n=e.revid;t.history=e.history,Object.assign(e,t),e.revid=n})}loadFromItem(e){const t=this.current.type;if(p.areSameGroup(t,"edit")&&("pending"!==t||"edit"!==e.type)){this.queues[t].queue=this.queues[t].queue.filter(t=>t.id!==e.id);const n=this.queues[t].queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});n>-1&&(this.queues[t].queue[n]=e)}this.queues[t].item=this.queues[t].queue.find(t=>t.id===e.id)||e,this.ws.gui.renderQueue()}async loadFromRevision(e,t){try{let n;if(this.ws.gui.updateDiffDisplay("loading"),this.cache.full.has(t))n=this.cache.full.get(t);else{let s;if(this.cache.simple.has(t)){const e=this.cache.simple.get(t);s={revid:e.id,parentid:e.prior,ns:e.page.namespace,title:e.page.title,user:e.user.name,timestamp:e.timestamp,parsedcomment:e.comment,tags:e.origin.tags,sizediff:e.sizediff,minor:e.minor}}else{const n=await this.ws.api.getRevision(e,t,!0);if(!n)throw new Error("Revision not found");s={revid:n.revid,parentid:n.parentid,ns:n.ns,title:e,user:n.user,timestamp:n.timestamp,parsedcomment:n.parsedcomment,tags:n.tags,size:n.size,oldlen:n.oldlen||0,newlen:n.size,minor:n.minor}}[n]=await this.generate("edit",[s],!1,{bypass:!0})}const s=this.current.type;if(p.areSameGroup(s,"edit")&&"pending"!==s&&"abuselog"!==s){this.queues[s].queue=this.queues[s].queue.filter(e=>e.id!==n.id);const e=this.queues[s].queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});e>-1&&(this.queues[s].queue[e]=n)}this.queues[s].item=n,this.ws.gui.renderQueue()}catch(e){console.error("Error loading from revision:",e),document.querySelector("#diff-container").innerHTML=`<div class="error">Failed to load revision: ${this.ws.util.escape(e.message)}</div>`}}getWarningLevel(e){const t=["0","1","2","3","4","4im"];let n="0";const s=this.ws.util.monthSectionName(),i=this.ws.util.getPageSections(e);for(const e of i)if(e.title===s){const s=e.content.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/g);if(null===s)break;const i=[...s.map(e=>{const t=e.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/);return t?t[1].toString():"0"}),n].map(e=>[e,t.indexOf(e)]);n=i.sort((e,t)=>t[1]-e[1])[0][0]}return n}getWarningHistory(e){const t=[],n=this.ws.util.monthSectionName(),s=this.ws.util.getPageSections(e);for(const e of s)if(e.title===n){const n=e.content.matchAll(/<!-- Template:([\w-]+?)(\d(?:i?m)?) -->([^]+?)(?=<!-- Template:|$)/g);for(let s of n){const n=s[1],i=s[2],a=s[3],r=a.match(/(\d{2}:\d{2}.*?\d{4} \(UTC\))/);let o=r?r[1]:null;if(o&&(o=o.replace(/<[^>]*>/g,"")),o){const[,e,t,n,s]=o.match(/(\d{2}:\d{2}), (\d{1,2}) ([A-Za-z]+) (\d{4})/),i=["January","February","March","April","May","June","July","August","September","October","November","December"].indexOf(n);o=new Date(Date.UTC(s,i,t,...e.split(":"))).toUTCString()}else o=null;let l=null;const d=a.match(/\[\[User(?:[ _]talk)?:([^\]|]+)/i);d&&(l=d[1].trim());const c=a.match(/\[\[([^\]]+?)\]\]/),u=c?c[1]:null;t.push({template:n,level:i,timestamp:o,username:l,article:u,section:e.title})}}return t}}async function g(e,t){if(e.user.anon)return;if(this.ws.store.whitelist.users.has(e.user.name))return;if(!t.issues||0===t.issues.length)return;if(!t.explanation)return;const n=t.issues.map(e=>`${e.severity} ${e.policy} violation`).join(", "),s=Math.round(100*t.confidence),i=e.user.name;await this.ws.gui.settings.waitForClose();if(await this.ws.gui.dialog.confirm("Report Username to UAA",`\n\t\t\t\tThe username <span class="confirmation-modal-username">${this.ws.util.escape(i)}</span> for ${n}.<br><br>\n\t\t\t\t<strong>AI Confidence:</strong> ${s}%<br>\n\t\t\t\t<strong>Reasoning:</strong> ${t.explanation}<br>\n\t\t\t`,i)){await this.ws.gui.settings.waitForClose();const t=await this.ws.gui.dialog.UAA(e.user.name);t&&this.ws.execute({actions:[{name:"report-user-to-uaa",params:{reason:t}}]},void 0,void 0,e)}}t.Queue=p,o(p,"refresh",1e3),o(p,"types",["recent","pending","watchlist","abuselog","users"]),o(p,"groups",{void:"void",recent:"edit",pending:"edit",watchlist:"edit",edit:"edit",abuselog:"abuselog",users:"logevent"})},7054(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.WikiShield=void 0;var s=n(3241),i=n(8169),a=n(2535),r=n(4674),o=n(6151),l=n(372),d=n(8469),c=n(8678),u=n(9501),p=n(9808);function g(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function h(e,t){return e.get(m(e,t))}function m(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var v,f,b,w=new WeakMap,y=new WeakSet;class x{constructor(e,t,n,o){var c,p;g(c=this,p=y),p.add(c),function(e,t,n){g(e,t),t.set(e,n)}(this,w,{ready:[]}),this.__DEV__=o,this.started=!1,this.server=e,this.storage=new u.StorageManager,this.defaultStorage=new u.StorageManager,this.defaultStorage.load(),this.util=new s.Utility(this),this.api=new a.API(this,e,t,n),this.notifications=new r.Notifications(this),this.rights={},this.groups={},this.api.account().then(async e=>{this.rights=e.rights.reduce((e,t)=>({...e,[t]:!0}),{}),this.groups=e.groups.reduce((e,t)=>({...e,[t]:!0}),{});{const e=this.rights.review&&this.api.hasPendingChanges;document.querySelector("#queue-tab-pending").classList.toggle("hidden",!e),e||"pending"!==this.queue.current.type||this.queue.switch("recent")}await m(y,this,_).call(this),this.cleanup(),setInterval(()=>this.cleanup(),1e4),m(y,this,k).call(this,"ready")}),this.gui=new d.GUI(this),this.queue=new l.Queue(this),this.audio=new i.AudioManager(this),this.time={load:null,save:null}}get store(){return this.storage.data}disable(e,t){electron.disable(e,t)}on(e,t,n={}){return h(w,this)[e]&&h(w,this)[e].push({callback:t,options:n}),this}async init(e=null){return this.gui.build(),await this.audio.init(),await m(y,this,_).call(this,e)}async noinit(e=null){var t;const n=await m(y,this,_).call(this,e);if(null===(t=this.AI)||void 0===t||t.cancel.all(),this.store.settings.AI.enabled)if("Ollama"===this.store.settings.AI.provider)this.AI=new c.AI.providers.Ollama(this,this.store.settings.AI.Ollama);else this.AI=null;else this.AI=null;{const e=this.store.UI.queue.width;document.body.querySelector("#queue").style.width=e,document.body.querySelector("#right-container").style.width=`calc(100% - ${e})`}{const e=this.store.UI.details.width;document.body.querySelector("#right-details").style.width=e,document.body.querySelector("#right-top").style.width=e,document.body.querySelector("#main-container").style.width=`calc(100% - ${e})`}return this.gui.settings.update(),n}async start(){this.gui.start(),this.update(),this.queue.fetch(),this.started=!0}async update(){const e=performance.now();try{await this.api.account().then(e=>{this.rights=e.rights.reduce((e,t)=>({...e,[t]:!0}),{}),this.groups=e.groups.reduce((e,t)=>({...e,[t]:!0}),{})}),await this.api.getGlobalUserInfo(this.api.username).then(e=>{var t;(t=this.rights).rollback||(t.rollback=e.rights.includes("rollback"))}),this.rights.rollback||"LuniZunie"===this.api.username||this.disable("Rollback required","Your account no longer has rollback rights, which are required to use WikiShield.");{const e=this.rights.review&&this.api.hasPendingChanges;document.querySelector("#queue-tab-pending").classList.toggle("hidden",!e),e||"pending"!==this.queue.current.type||this.queue.switch("recent")}this.backup()}catch(e){console.error("Update error:",e)}setTimeout(()=>this.update(),Math.max(0,2500-(performance.now()-e)))}cleanup(){const e=Date.now();let t=!1;for(const[,n]of Object.entries(this.store.highlight))for(const[s,i]of n.entries())e>=i[1]&&(n.delete(s),t=!0);for(const[,n]of Object.entries(this.store.whitelist))for(const[s,i]of n.entries())e>=i[1]&&(n.delete(s),t=!0);t&&this.queue.current.item&&this.gui&&this.gui.renderQueue(this.queue.current.queue,this.queue.current.item)}controller(e){var t,n,s;if(this.started){if(this.gui.dialog.dialogs.active)return this.gui.dialog.controller(e);if(this.gui.settings.active)return this.gui.settings.controller(e);if(!("INPUT"===(null===(t=e.target)||void 0===t?void 0:t.tagName)||"TEXTAREA"===(null===(n=e.target)||void 0===n?void 0:n.tagName)||null!==(s=e.target)&&void 0!==s&&s.isContentEditable)&&"keydown"===e.type){if(e.repeat&&!this.store.settings.repeat_control_scripts)return;const t=(0,p.buildShortcut)(e);for(const n of this.store.control_scripts)n.keys.every(e=>e===t)&&(e.preventDefault(),this.execute(n))}}}async execute(e,t=!0,n=null,s=null){const i=(e,t)=>!e.name||("if"===e.name?this.gui.events.conditions[e.condition.name].check(this,t,e.condition.params):"if not"===e.name&&!this.gui.events.conditions[e.condition.name].check(this,t,e.condition.params));if(null===n){null!=s||(s=this.queue.current.item||1);const t=[e];let a=0;for(;t.length>0;){const e=t[0];if(i(e,s)){if(!e.actions){t.splice(0,1);continue}t.push(...e.actions)}e.name&&"if"!==e.name&&"if not"!==e.name&&this.gui.events.events[e.name].progress&&a++,t.splice(0,1)}if(a>0){let e=0;const t=new o.ProgressBar;n=(n,s)=>{const i="Done"===n?1:e/a;t.set(n,i,s),e++}}else n=e=>{}}if(i(e,s))for(const i of e.actions){if(!("name"in i))continue;const e={...i.params};for(const t of(null===(a=this.gui.events.events[i.name])||void 0===a||null===(r=a.parameters)||void 0===r?void 0:r.call(a,this,s))||[]){var a,r;t.id&&!(t.id in e)&&"default"in t&&(e[t.id]=t.default)}if("if"===i.name||"if not"===i.name)t=await this.execute(i,t,n,s);else{const a=this.gui.events.events[i.name],r=()=>{t=!1,this.audio.playSound(["action","failed"]),a.progress&&n(a.progress,!0)};try{if(t||!a.continuity){var l,d;const t=null!==(l=null===(d=a.valid)||void 0===d?void 0:d.call(a,this,s,e))&&void 0!==l?l:{valid:!0};if(t.valid){a.progress&&(n(a.progress,!1),this.audio.playSound(["action","default"])),this.store.statistics.actions_executed.total++;const t=await a.script(this,s,e);var c;if(!1===t.valid)r(),"reason"in t&&this.gui.dialog.toast("Action failed",t.reason,"error");else this.store.statistics.actions_executed.successful++,null===(c=a.successful)||void 0===c||c.call(a,this,s,e)}else r(),"reason"in t&&this.gui.dialog.toast("Action skipped",t.reason,"error")}}catch(e){r(),this.gui.dialog.toast("Please report to developer",`An error occurred while executing action "${i.name}". Check the console for details.`,"error"),console.error(`Error executing action "${i.name}":`,e.message||String(e))}}}return e.name||n("Done",!t),t}async getDEFCON(){const e="User:EnterpriseyBot/defcon",t=(await this.api.getPagesContent([e]))[e],n=t.match(/level\s*=\s*(\d+)/),s=t.match(/info\s*=\s*([\d.]+)/);return{level:n?Number(n[1]).toLocaleString():null,info:s?Number(s[1]).toLocaleString():null}}export(){this.time.save=performance.now(),this.store.statistics.session_time+=this.time.save-this.time.load;const{string:e,logs:t}=this.storage.encode();return u.StorageManager.output(t),e}backup(){this.time.save=performance.now(),this.store.statistics.session_time+=this.time.save-this.time.load,this.time.load=this.time.save;const{string:e}=this.storage.encode();return electron.localStorage.set(`WikiShield:BackupStorage-${this.api.username}`,`${Date.now()};${e}`),!0}async save(){this.backup();const e=`${Date.now()};${this.export()}`,t=this.api.username;if(window.isFinite)electron.saveAccount(t,e);else try{const n=await this.api.postWithToken({action:"options",optionname:"userjs-wikishield-storage",optionvalue:e});"success"===(null==n?void 0:n.options)||console.error(`[WikiShield] Failed to save account data for ${t}:`,n)}catch(e){console.error(`[WikiShield] Failed to save account data for ${t}:`,e)}}async load(){try{var e,t;return null!==(e=null===(t=[electron.localStorage.get(`WikiShield:BackupStorage-${this.api.username}`),(await this.api.post({action:"query",meta:"userinfo",uiprop:"options",format:"json"})).query.userinfo.options["userjs-wikishield-storage"]].reduce((e,t)=>{var n;null!=t||(t="0;e30=");let s=0,i=t;return t.includes(";")&&([s,i]=t.split(";",2),s=parseInt(s,10)),s>0&&s>(null!==(n=null==e?void 0:e.timestamp)&&void 0!==n?n:0)?{timestamp:s,data:i}:e},null))||void 0===t?void 0:t.data)&&void 0!==e?e:"e30="}catch(e){var n;return null!==(n=void console.error("Failed to load storage from wiki:",e))&&void 0!==n?n:"e30="}}page(e,t,n=!0){return`https://${this.server}/${t?`w/index.php${e}`:`wiki/${n?encodeURIComponent(e):e}`}`}open(e,t){"force"===t?t=!1:t||(t=!this.store.settings.wikipedia_popups.enabled),t?electron.openExternal(e):electron.openInBrowser(e).then(e=>{e&&requestAnimationFrame(()=>{if(this.gui.dialog.popups.push(e),!document.getElementById("popup-blocker")){const e=document.createElement("div");e.id="popup-blocker",e.innerText="Please close the popup or click anywhere on this page to continue using WikiShield.",document.body.appendChild(e),this.gui.dialog.check()}})})}}function k(e){if(h(w,this)[e])for(const n of h(w,this)[e])try{n.callback()}catch(e){}finally{var t;!0===(null===(t=n.options)||void 0===t?void 0:t.once)&&(h(w,this)[e]=h(w,this)[e].filter(e=>e!==n))}return this}async function _(e=null){const t=this.storage.decode(null!=e?e:await this.load()).logs;var n,s,i;(this.time.load=performance.now(),this.store.settings.AI.enabled)?"Ollama"===this.store.settings.AI.provider?"function"==typeof(null===(n=c.AI.providers)||void 0===n?void 0:n.Ollama)?this.AI=new c.AI.providers.Ollama(this,this.store.settings.AI.Ollama):(console.error("AI.providers.Ollama is not available. Falling back to null."),this.AI=null):(null===(s=this.AI)||void 0===s||s.cancel.all(),this.AI=null):(null===(i=this.AI)||void 0===i||i.cancel.all(),this.AI=null);return t}t.WikiShield=x,v=x,f="config",b={version:"2.0.0",changelog:{version:"6",HTML:fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/CHANGELOG.html").then(e=>e.text()).catch(()=>"<em>Could not fetch changelog.</em>")},pages:{AIV:"Wikipedia:Administrator intervention against vandalism",UAA:"Wikipedia:Usernames for administrator attention",RFPP:"Wikipedia:Requests for page protection/Increase",SRG:"Steward requests/Global"},config:{refresh:{recent:2e3,pending:2e3,watchlist:2e3,users:2e3},historyCount:10}},(f=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(f))in v?Object.defineProperty(v,f,{value:b,enumerable:!0,configurable:!0,writable:!0}):v[f]=b},4018(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.namespaces=void 0;t.namespaces=[{name:"Main",id:0,analysis_description:{edit:"",username:""}},{name:"Talk",id:1,analysis_description:{edit:"",username:""}},{name:"User",id:2,analysis_description:{edit:"Flag content unrelated to Wikipedia, such as self-promotion. If the page looks like a Wikipedia article, check that it isn't an obvious hoax, and that it is a subpage. Do not follow strict standards for these pages.",username:"Check whether the username matches the base page title. Most often, a user page should only be edited by that user. Consider alternative accounts, like User:Example creating User:Example (alt)."}},{name:"User talk",id:3,analysis_description:{edit:"",username:""}},{name:"Project",id:4,analysis_description:{edit:"",username:""}},{name:"Project talk",id:5,analysis_description:{edit:"",username:""}},{name:"File",id:6,analysis_description:{edit:"",username:""}},{name:"File talk",id:7,analysis_description:{edit:"",username:""}},{name:"MediaWiki",id:8,analysis_description:{edit:"",username:""}},{name:"MediaWiki talk",id:9,analysis_description:{edit:"",username:""}},{name:"Template",id:10,analysis_description:{edit:"",username:""}},{name:"Template talk",id:11,analysis_description:{edit:"",username:""}},{name:"Help",id:12,analysis_description:{edit:"",username:""}},{name:"Help talk",id:13,analysis_description:{edit:"",username:""}},{name:"Category",id:14,analysis_description:{edit:"",username:""}},{name:"Category talk",id:15,analysis_description:{edit:"",username:""}},{name:"Portal",id:100,analysis_description:{edit:"",username:""}},{name:"Portal talk",id:101,analysis_description:{edit:"",username:""}},{name:"Draft",id:118,analysis_description:{edit:"",username:""}},{name:"Draft talk",id:119,analysis_description:{edit:"",username:""}},{name:"MOS",id:126,analysis_description:{edit:"",username:""}},{name:"MOS talk",id:127,analysis_description:{edit:"",username:""}},{name:"TimedText",id:710,analysis_description:{edit:"",username:""}},{name:"TimedText talk",id:711,analysis_description:{edit:"",username:""}},{name:"Module",id:828,analysis_description:{edit:"Check whether the edit is meaningful Lua code. In this namespace, anything that isn't written in Lua can be safely assumed to be vandalism. Be careful about multi-line strings, as they might contain non-Lua code: check the context of the edit to make sure. Additionally, check if the edit introduces any obvious Lua syntax errors.",username:""}},{name:"Module talk",id:829,analysis_description:{edit:"",username:""}},{name:"Event",id:1728,analysis_description:{edit:"",username:""}},{name:"Event talk",id:1729,analysis_description:{edit:"",username:""}}]},6400(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.profanity=void 0;const n="\\*#\\-",s=`[${n}a4]`,i=`[${n}b6]`,a=`[${n}ck]`,r=`[${n}h]`,o=`[${n}i1y]`,l=`[${n}o0]`,d=`[${n}t7]`,c={a:s,b:i,c:a,d:`[${n}d6]`,e:`[${n}e3]`,f:`[${n}f]`,g:`[${n}g9]`,h:r,i:o,j:`[${n}j]`,k:`[${n}k]`,l:`[${n}l1]`,m:`[${n}m]`,n:`[${n}n]`,o:l,p:`[${n}p9]`,q:`[${n}q9]`,r:`[${n}r]`,s:`[${n}sz526]`,t:d,u:`[${n}uv]`,v:`[${n}vu]`,w:`[${n}w]`,x:`[${n}x]`,y:`[${n}y]`,z:`[${n}zs25]`,0:`[${n}0]`,1:`[${n}1]`,2:`[${n}2]`,3:`[${n}3]`,4:`[${n}4]`,5:`[${n}5]`,6:`[${n}6]`,7:`[${n}7]`,8:`[${n}8]`,9:`[${n}9]`};class u{constructor(e={}){this.conversion={};for(const[t,n]of Object.entries(e))for(const e of n)this.conversion[e]&&console.warn(`Profanity lookalike collision: ${e} is already mapped to ${this.conversion[e]}, remapping to ${t}`),this.conversion[e]=t}removeAccents(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}obscureReplacements(e){return e.replace(/(\/[|\\]\/|\\[|\\]\\)/g,"n").replace(/&/g,"and").replace(/zero/g,"0").replace(/one/g,"1").replace(/two/g,"2").replace(/three/g,"3").replace(/four/g,"4").replace(/five/g,"5").replace(/six/g,"6").replace(/seven/g,"7").replace(/eight/g,"8").replace(/nine/g,"9")}parseString(e,t=!1){e=t?e.replace(/[._,;:|]/g," ").replace(/\s+/g," ").toLowerCase():e.replace(/[\s._,;:|]/g,"").toLowerCase(),e=this.removeAccents(e);let n="";for(const t of e)this.conversion[t]?n+=this.conversion[t]:n+=t;return e=this.obscureReplacements(n)}analyzeObfuscation(e,t,n,s,i=!1){const a=e.substring(t,n);let r=0;if(/\s/.test(a)&&!i)return-.95;const o=this.countCaseChanges(a);if(o>0){o/Math.max(1,a.length-1)>.3&&(r+=.3)}if(/[._,;:|]/.test(a)){const e=(a.match(/[._,;:|]/g)||[]).length,t=(a.match(/[a-zA-Z0-9]/g)||[]).length;if(t>0){const n=e/t;n>.3&&(r+=Math.min(.5,.7*n))}}const l=this.checkWordBoundaries(e,t,n,s,i);r+=l;const d=this.checkSubstitution(a,s);if(d>0&&(r+=d),l<0){if(!this.isStandaloneWord(e,t,n)){this.isCamelCaseBoundary(e,t,n)?r+=.2:r-=.2}}return Math.max(-1,Math.min(1,r))}countCaseChanges(e){let t=0;for(let n=1;n<e.length;n++){const s=e[n-1],i=e[n];if(/[a-zA-Z]/.test(s)&&/[a-zA-Z]/.test(i)){s===s.toUpperCase()!==(i===i.toUpperCase())&&t++}}return t}checkWordBoundaries(e,t,n,s,i=!1){const a=t>0?e[t-1]:"",r=n<e.length?e[n]:"",o=e.substring(Math.max(0,t-8),Math.min(e.length,n+8)).toLowerCase(),l=[/WMF/,/pass(word|phrase|port|enger|ion|ive|ed|ing|es|key|code|over|by|able)/i,/class(room|mate|ified|es|ic|y|ification)/i,/grass(land|hopper|y|es)/i,/bass(ist|oon|line|es)/i,/mass(ive|acre|age|es|achusetts)/i,/assign(ment|ed|ing|s|ee|or)/i,/assess(ment|ed|ing|or|s)/i,/assemble|assembly|assertion|asset|assist|assume|assure|associate|association/i,/brass|crass|harass|morass|surpass|trespass|compass|embassy|embarrass/i,/cock(pit|tail|roach|ade|atoo|le|ney)/i,/scunthorpe|penistone|shitterton|lightwater|middlesex|sussex|essex|wessex/i,/dick(ens|inson|son|ey|ie)/i,/analyst|analytics|analyze|canal|banal/i,/therapist|therapeutic|therapy/i,/cumul(ative|us|at)|circum(stance|ference|cise|vent|navigate|scribe)/i,/butter(cup|fly|milk|scotch|fingers|nut)|buttress|button|rebuttal/i,/count(ry|er|ess|down|ing|ed|able|enance|erfeit|erpart)/i,/grape|drape|scrape|landscape|escapade/i,/shell(fish|fire|ter|ed)|eggshell|nutshell|bombshell|seashell/i,/whole(sale|some|hearted)/i,/exchange|exchequer/i,/title|titled|subtitle|entitle/i,/sextant|sextet|bisect|insect|intersect|section|sector/i,/cocktail|peacock|hancock|hitchcock|babcock|woodcock/i,/niger(ia|ian)|montenegro/i,/penisten|penetrat|penal(ty|ize|ise)|penchant|pencil|pendant|penguin|peninsula/i,/manslaughter|slaughterhouse/i,/shitake|shiitake/i,/arsenic|arsenal/i,/cummings|scumble/i,/smother|another|mother(board|land|hood)/i,/wanton|wanting|wanted|warrant/i,/trigger|bigger|digger|jigger|rigger|vigor|figure/i,/ballad|ball(room|park|istic|oon|et|ot|ard|ast)/i,/grape(fruit|vine|shot)/i,/raptor|rapport|rapid|rapier|rapture/i,/killed|killer|skill(ed|ful|s)|killjoy|kiln|kilo(gram|meter|byte|watt)/i,/bomb(ard|astic|shell|er|ing|ay)/i,/hellenic|hello|shell|othello/i,/crack(down|le|ed|ing|erjack)|firecracker/i,/jewel{1,2}/i,/skill/i];for(const e of l)if(e.test(o))return-.8;const d=/[a-zA-Z]/.test(a),c=/[a-zA-Z]/.test(r);if(d&&c){const i=e.substring(Math.max(0,t-8),t).toLowerCase(),a=e.substring(n,Math.min(e.length,n+8)).toLowerCase(),r=e.substring(Math.max(0,t-8),Math.min(e.length,n+8)).toLowerCase();return this.analyzePaddingLikelihood(i,a,s)>=.4||r.length>15&&r===r.toLowerCase()&&!/\s/.test(r)?0:-.5}if(d||c){const i=e.substring(Math.max(0,t-8),t).toLowerCase(),a=e.substring(n,Math.min(e.length,n+8)).toLowerCase();this.analyzePaddingLikelihood(i,a,s);return 0}const u=e.substring(t,n);return/\s/.test(u)&&!i?-.9:0}analyzePaddingLikelihood(e,t,n){let s=0;const i=/[bcdfghjklmnpqrstvwxyz]{3,}/i;(i.test(e)||i.test(t))&&(s+=.4);const a=t.match(/([a-z])\1{1,}/i);if(a&&a[0].length>=2){if(t.indexOf(a[0])>=t.length-3){(!/\b(ll|ss|tt|nn|mm|pp|dd|bb|gg|ff)$/i.test(a[0])||t.length<=3)&&(s+=.35)}}if(e.length<=2&&e.length>0&&(s+=.25),t.length<=3&&t.length>0){/^(er|ed|ing|ion|ly|al|ful|less|ness|ment|s)$/i.test(t)||(s+=.2)}/([qx][^u]|[jqxz]{2}|[bcdfghjklmnpqrstvwxz]{4,})/i.test(e+t)&&(s+=.3);const r=e+t;if(r.length>0){(r.match(/[aeiou]/gi)||[]).length/r.length<.2&&(s+=.3)}return Math.min(1,s)}checkSubstitution(e,t){const n=/[0-9@$!]/;if(!n.test(e))return 0;let s=0;for(const t of e)n.test(t)&&s++;const i=s/e.length;return Math.min(.3,.6*i)}isStandaloneWord(e,t,n){const s=t>0?e[t-1]:" ",i=n<e.length?e[n]:" ",a=/[\s.,;:!?()[\]{}"'`~\-_]/;return a.test(s)&&a.test(i)}isCamelCaseBoundary(e,t,n){if(0===t||n===e.length)return!1;const s=e[t-1],i=e[t],a=e[n-1],r=e[n],o=/[A-Z]/.test(i),l=/[a-z]/.test(s),d=(/[a-z]/.test(r),/[a-z]/.test(a));return!!(l&&o||d&&/[A-Z]/.test(r))}findMatchPosition(e,t,n,s){const i=e.toLowerCase();let a=-1,r=-1,o=-1;for(let n=0;n<=i.length-t.length;n++){const i=this.parseString(e.substring(n,n+t.length+10));if(i.includes(s)){const e=this.calculateSimilarity(s,i.substring(0,s.length));e>o&&(o=e,a=n,r=n+t.length)}}return{start:a,end:r}}calculateSimilarity(e,t){const n=Math.min(e.length,t.length);let s=0;for(let i=0;i<n;i++)e[i]===t[i]&&s++;return s/Math.max(e.length,t.length)}match(e){const t=this.parseString(e),n=[];for(const s of u.hits)if(s.term){const i=s.term,a=s.severity||.5,r=s.note||null,o=s.multiWord||!1;if(1===i.length&&/[^\x00-\x7F]/.test(i))continue;const l=o?this.parseString(e,!0):t,d=i.split("").reduce((e,t)=>{var n;if(o&&" "===t)return e+" *";return e+(null!==(n=c[t])&&void 0!==n?n:t)},""),u=new RegExp(d,"gi");let p;const g=this.buildPositionMap(e,o);for(;null!==(p=u.exec(l));){const t=p[0],l=p.index,d=l+t.length,c=g[l]||l,u=void 0!==g[d-1]?g[d-1]+1:d,h=this.analyzeObfuscation(e,c,u,i,o);let m=this.calculateMatchConfidence(t,i);h<-.5?m*=Math.max(.01,1+4*h):h<-.2?m*=Math.max(.05,1+2.5*h):h>.5&&(m=Math.min(1,m+.08*h));if(m>=Math.max(.05,.2-.015*i.length)){const o=e.substring(c,u);if(s.ignore&&Array.isArray(s.ignore)&&s.ignore.includes(o))continue;n.push({name:i,match:t,confidence:m,obfuscation:h,severity:a,note:r,originalSegment:o})}}}else if(s.regex){const t=e.match(new RegExp(s.regex.source,"g"));if(t)for(const e of t)n.push({name:s.name,match:e,confidence:1,obfuscation:.5,severity:s.severity||.5,note:s.note||"Pattern-based detection with high confidence. Obfuscation is moderate for formatted data.",originalSegment:e})}else s.test&&s.test(e)&&n.push({name:s.name,match:e,confidence:1,obfuscation:.5,severity:s.severity||.5,note:s.note||"Test-based detection with high confidence.",originalSegment:e});return n}buildPositionMap(e,t=!1){const n={};let s=0;for(let i=0;i<e.length;i++){const a=e[i];t?/[\s._,;:|]/.test(a)&&0!==i&&/[\s._,;:|]/.test(e[i-1])||(n[s]=i,s++):/[\s._,;:|]/.test(a)||(n[s]=i,s++)}return n}findOriginalPosition(e,t){let n=0;for(let s=0;s<e.length;s++){const i=e[s];if(!/\s/.test(i)){if(n===t)return s;n++}}return t}calculateMatchConfidence(e,t){const n=/[\*#_\-]/;let s=0,i=0,a=0,r=0;for(const t of e)n.test(t)?(i++,a++,r=Math.max(r,a)):(s++,a=0);const o=s+i;if(0===o)return 0;const l=s/o;if(l<.3)return 0;if(l<.5)return.1*l;const d=r>1?Math.max(.2,1-.2*r):1,c={};for(const t of e)n.test(t)||(c[t]=(c[t]||0)+1);let u=1;for(const e of Object.values(c))e>2&&(u*=Math.max(.4,1-.15*(e-2)));const p=o/t.length,g=p>1.5?Math.max(.2,1-.4*(p-1)):1;return Math.max(0,Math.min(1,l*d*u*g))}score(e){const t=this.match(e);let n=0;for(const e of t)n+=e.confidence;return n}evaluate(e){const t=this.match(e),n=this.parseString(e);if(0===t.length)return{finalScore:0,risk:"No",matches:[],details:{baseScore:0,weightedScore:0,severityScore:0,matchCount:0,averageConfidence:0,averageObfuscation:0,averageSeverity:0,textLength:e.length,densityPenalty:0,repetitionPenalty:0,diversityBonus:0,lengthModifier:1,highConfidenceMatches:0,mediumConfidenceMatches:0,lowConfidenceMatches:0}};let s=0,i=0,a=0,r=0,o=0,l=0;const d=new Set;for(const e of t){const t=e.severity||.5,n=e.confidence;r+=n,l+=Math.pow(n,1.5)*t,o+=e.obfuscation||0,d.add(e.name),n>=.7?s++:n>=.4?i++:a++}const c=r/t.length,u=o/t.length,p=r>0?l/r:0,g=1*s+.35*i+.08*a,h=n.length,m=t.length/Math.max(h/5,1),v=.6*Math.tanh(.3*m),f={};for(const e of n)/[a-z0-9]/.test(e)&&(f[e]=(f[e]||0)+1);let b=0;const w=Object.values(f).reduce((e,t)=>e+t,0);for(const e of Object.values(f))e>3&&(b+=Math.pow((e-3)/w,1.5));const y=Math.min(.8,2*b),x=d.size/t.length,k=x>.6?1*(x-.6):0,_=Math.max(.5,Math.min(1.5,1+Math.log10(Math.max(10,h))/10)),S=u>.4?.5*(u-.4):u<-.2?.4*Math.abs(u):0,q=t.filter(e=>e.severity>=1&&e.confidence>=.5||e.confidence>=.9).length,E=g*p*_;let L=E+.5*l+k+.8*q-(v+y+S);c<.5&&(L*=Math.max(.1,1.5*c)),L>3?L=3+1.5*Math.log10(L-2):L>1.5&&(L=1.5+.8*Math.sqrt(L-1.5)),L=Math.max(0,L);let A="No";return L>=4||q>=2?A="Critical":L>=2.5?A="High":L>=1.5?A="Medium":L>=.5&&(A="Low"),{clamped:Math.max(0,Math.min(1,L/5)),finalScore:Math.round(100*L)/100,risk:A,matches:t,details:{baseScore:Math.round(100*g)/100,weightedScore:Math.round(100*E)/100,severityScore:Math.round(100*l)/100,matchCount:t.length,uniqueMatches:d.size,averageConfidence:Math.round(100*c)/100,averageObfuscation:Math.round(100*u)/100,averageSeverity:Math.round(100*p)/100,textLength:e.length,densityPenalty:Math.round(100*v)/100,repetitionPenalty:Math.round(100*y)/100,diversityBonus:Math.round(100*k)/100,lengthModifier:Math.round(100*_)/100,obfuscationPenalty:Math.round(100*S)/100,criticalPatterns:q,highConfidenceMatches:s,mediumConfidenceMatches:i,lowConfidenceMatches:a}}}}!function(e,t,n){(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(u,"hits",[{name:"URL",regex:/(?:https?:\/\/(?:www\.)?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*(?:\/[^\s]*)?|(?:www\.)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:\/[^\s]*)?|[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.(?:com|org|net|edu|gov|mil|int|co|io|ai|app|dev|info|biz|name|pro|museum|aero|coop|jobs|mobi|travel|xxx|ac|ad|ae|af|ag|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(?:\/[^\s]*)?)/i,severity:.1,note:"URLs in usernames may indicate spam or advertising."},{name:"Phone number",regex:/(\+?\d{1,3}[-.\s]?|\(\+?\d{1,3}\)\s?)?(\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\d{4}[-.\s]?\d{3}[-.\s]?\d{3})/,severity:.3,note:"The pattern of numbers in this username resemble a phone number. Usernames containing personal information may be considered disruptive."},{name:"Email address",regex:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/,severity:.3,note:"Email addresses in usernames can indicate spam or contact sharing."},{term:"base64",severity:.2,note:"Base64 encoding may be used to obfuscate content to bypass filters."},{term:"fromhex",severity:.2,note:"Hex encoding may be used to obfuscate content to bypass filters."},{term:"1488",severity:.5,note:"Well-known Neo-Nazi symbol, however the number itself can appear in innocent contexts."},{term:"nazi",severity:1},{term:"swastika",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"卍",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"卐",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿕",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿖",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿗",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿘",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"aryan",severity:.7,note:"Associated with white supremacist ideology, though it can also be in reference to the self-designation of Indo-Iranian peoples."},{term:"fascism",severity:.5},{term:"fascist",severity:.5},{term:"facist",severity:.5},{term:"☭",severity:.5,note:"Hammer and sickle symbol, politically charged but context-dependent."},{term:"✡",severity:.4,note:"Star of David, can be used respectfully or in antisemitic contexts."},{term:"44",severity:.1,note:"Obfuscated symbol of the Nazi SS division. If appears as 'ᛋᛋ' or similar, indicates intent to reference the SS."},{term:"imbo wales",severity:.2,multiWord:!0,note:"Play on 'Jimbo Wales' name, may indicate mockery or impersonation."},{term:"sock",severity:.3,note:"May reference sockpuppet accounts but has innocent meanings."},{term:"puppet",severity:.3,note:"May reference sockpuppet accounts but has innocent meanings."},{term:"sock puppet",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"return",severity:.2,note:"Often used in usernames by sockpuppeteers."},{term:"is back",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"are back",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"timelash",severity:1,note:'Well-known sockpuppeteer ("Timelash") on Wikipedia.'},{term:"my little",severity:.8,multiWord:!0,note:"If related to 'my little pony', indicates sockpuppeteer."},{term:"my little pony",severity:1,multiWord:!0,note:"Well-known sockpuppeteer on Wikipedia."},{term:"friendship is magic",severity:1,multiWord:!0,note:"Well-known sockpuppeteer on Wikipedia."},{term:"anal",severity:.7},{term:"anus",severity:.5},{term:"sex",severity:.3},{term:"secs",severity:.05,note:"Obfuscated form of 'sex'."},{term:"seggs",severity:.2,note:"Obfuscated form of 'sex'."},{term:"willy",severity:.2,note:"Slang for penis."},{term:"wank",severity:.6,note:"British sexual slang for masturbation."},{term:"barf",severity:.3},{term:"bastard",severity:.5},{term:"batty boy",severity:.7,multiWord:!0,note:"Homophobic slur in British/Caribbean English."},{name:"bitch",regex:new RegExp(`${i+o}(${l}|${s})?${d}?${a+r}`),severity:.7},{term:"blow job",severity:.8,multiWord:!0},{term:"blowing",severity:.2,note:"Sexual innuendo but common verb."},{term:"boner",severity:.4},{term:"boob",severity:.4},{term:"booty",severity:.3},{term:"breast",severity:.4,note:"Anatomical term, but can be used inappropriately."},{term:"butt",severity:.2},{term:"bite me",severity:.5,multiWord:!0,note:"Often has defiant or provocative connotation."},{term:"butt plug",severity:.7,multiWord:!0},{term:"bollock",severity:.5,note:"British slang for testicles."},{term:"bollox",severity:.5,note:"Variant spelling of 'bollocks'."},{term:"bollix",severity:.5,note:"Variant spelling of 'bollocks'."},{term:"clit",severity:.7},{term:"cock",severity:.7},{term:"cum",severity:.7},{term:"brain dead",severity:.5,multiWord:!0,note:"Derogatory medical reference."},{term:"bukake",severity:.7},{term:"bully",severity:.5,note:"Indicates harassment behavior."},{term:"bullies",severity:.5,note:"Indicates harassment behavior."},{term:"bullied",severity:.3,note:"May indicate victimhood or boasting."},{term:"versus",severity:.4,note:"Combat/conflict framing, but legitimate word."},{term:"bumming",severity:.5,note:"British slang for anal sex or begging."},{term:"bunghole",severity:.5},{term:"cesspool",severity:.3,note:"Derogatory term for filthy place."},{term:"cesspit",severity:.3,note:"Variant of cesspool."},{term:"dick",severity:.7},{term:"prick",severity:.7},{term:"dildo",severity:.7},{term:"censor",severity:.1,note:"May indicate anti-censorship stance."},{term:"ching",severity:.8,note:"Part of racial slur against Asians."},{term:"ching chong",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"ching chang",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"wing wong",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"bot",severity:.4,note:"May indicate automated account claim."},{term:"ox long",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'cock's long'."},{term:"douche",severity:.5},{term:"cunt",severity:.7},{term:"cuck",severity:.4,note:"Derogatory term from manosphere."},{term:"curry munch",severity:.9,multiWord:!0,note:"Racist slur against South Asians."},{term:"crime",severity:.3,note:"Negative connotation but legitimate word."},{term:"pussy",severity:.7},{term:"deeznuts",severity:.3,note:"Crude joke phrase."},{term:"destroy",severity:.3,note:"Aggressive language."},{term:"destruction",severity:.3,note:"Aggressive language."},{term:"diaper",severity:.3,note:"Infantilization or fetish reference."},{term:"diarrhea",severity:.3},{term:"throbbing",severity:.5,note:"Sexual innuendo term."},{term:"dimwit",severity:.3},{term:"doo doo",severity:.3,multiWord:!0},{term:"dookie",severity:.3},{term:"fart",severity:.3},{term:"ejaculat",severity:.7},{term:"erect",severity:.5,note:"Sexual context or legitimate word."},{term:"erotic",severity:.5},{term:"fuck",severity:.8},{term:"phuck",severity:.8,note:'Alternative spelling of "fuck" to bypass detection.'},{term:"orgasm",severity:.7},{term:"rape",severity:1},{term:"lawsuit",severity:.3,note:"Legal threat implication."},{term:"fraud",severity:.5,note:"Accusation of criminal behavior."},{term:"tard",severity:.5,note:"Ableist slur suffix."},{term:"terror",severity:.7,note:"Violence/terrorism reference."},{term:"mike hunt",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'my cunt'."},{term:"mike ox",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'my cock's'."},{term:"masturbat",severity:.7},{term:"nutsack",severity:.5},{term:"ophile",severity:1,note:"Suffix for sexual predator terms like pedophile."},{term:"pedo",severity:.6},{term:"peeing",severity:.3},{term:"peanus",severity:.5,note:"Intentional misspelling of 'penis'."},{term:"penis",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"porn",severity:.7},{term:"piss",severity:.5},{term:"poop",severity:.3},{term:"prison",severity:.3,note:"Criminal context, but legitimate word."},{term:"prostitute",severity:.5,note:"Sexual work reference or insult."},{term:"queer",severity:.5,note:"Can be slur or reclaimed identity."},{term:"rectum",severity:.3,note:"Anatomical term."},{term:"report me",severity:.3,multiWord:!0,note:"Defiant/trolling phrase."},{term:"rimming",severity:.7},{term:"scrotum",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"semen",severity:.7},{term:"slut",severity:.7},{term:"sucks",severity:.3,note:"Mild profanity or legitimate verb."},{term:"sux",severity:.3,note:"Intentional misspelling of 'sucks'."},{term:"vagina",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"vadge",severity:.5,note:"Slang for vagina."},{term:"vomit",severity:.3},{term:"vulva",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"whore",severity:.7},{term:"chink",severity:1},{term:"jew",severity:.3,note:"Legitimate religious/ethnic term but tracked for antisemitic usage patterns."},{term:"nigger",severity:1},{term:"nigga",severity:1},{term:"nigguh",severity:1,note:"Phonetic spelling of racial slur."},{term:"niglet",severity:1},{term:"pajeet",severity:.7,note:"Derogatory term for South Asians."},{term:"slave",severity:.6,note:"Dehumanizing term with historical trauma, but legitimate historical uses."},{term:"master race",severity:1,multiWord:!0,note:"Nazi supremacist ideology phrase."},{term:"inferior race",severity:1,multiWord:!0},{term:"superior race",severity:1,multiWord:!0,note:"White supremacist ideology."},{term:"racist",severity:.8},{term:"racism",severity:.7},{term:"racial",severity:.3,note:"Neutral term but tracked for context in discriminatory language."},{term:"bigot",severity:.7},{term:"fag",severity:.7},{term:"taliban",severity:.7,note:"Terrorist organization reference."},{term:"antisemit",severity:1},{term:"bleed",severity:.3,note:"Can indicate violence or be medical."},{term:"bloody",severity:.3,note:"British profanity or literal blood reference."},{term:"hell",severity:.5,note:"Religious reference used as mild profanity, but legitimate uses."},{term:"damn",severity:.3},{term:"crap",severity:.3},{term:"darn",severity:.1,note:"Mild euphemism for 'damn'."},{term:"shutup",severity:.3,note:"Rude command indicating hostility."},{term:"spastic",severity:.5,note:"Ableist slur in British English, medical term in US."},{term:"disabled",severity:.1,note:"Legitimate disability term but tracked for ableist patterns."},{term:"loser",severity:.3},{term:"abuse",severity:.5,note:"Indicates harmful behavior or accusations."},{term:"spam",severity:.3,note:"Indicates unwanted content or disruption."},{term:"abusi",severity:.5,note:"Variant of 'abuse/abusive'."},{term:"hitler",severity:1},{term:"adolf",severity:.4,note:"Common name but often used in Hitler references."},{term:"gestapo",severity:1},{term:"heil",severity:.8,note:"Nazi salute reference."},{term:"final solution",severity:1,multiWord:!0,note:"Nazi euphemism for genocide."},{term:"death camp",severity:1,multiWord:!0},{term:"concentration camp",severity:1,multiWord:!0,note:"Holocaust reference, legitimate historical use but concerning in usernames."},{term:"gas chamber",severity:1,multiWord:!0},{term:"holocaust",severity:.5,note:"Historical tragedy reference, legitimate historical use."},{term:"zionis",severity:.5,note:"Political term stem, can be antisemitic depending on context."},{term:"fuhrer",severity:1},{term:"reich",severity:.7,note:"Nazi Germany reference, though legitimate German word."},{term:"massacre",severity:.7},{term:"slaughter",severity:.7},{term:"torture",severity:.7},{term:"lynch",severity:1,note:"Racist mob killing reference, though also a surname."},{term:"killer",severity:.5},{term:"mobster",severity:.5,note:"Organized crime reference."},{term:"gangster",severity:.3,note:"Criminal reference or slang."},{term:"druglord",severity:.5,note:"Drug trafficking reference."},{term:"drugs",severity:.3,note:"General term that can be legitimate or problematic."},{term:"meth",severity:.5,note:"Reference to illegal drug, though also shorthand for 'method'."},{term:"cocaine",severity:.5},{term:"heroin",severity:.5},{term:"weed",severity:.3,note:"Marijuana reference with varying legal status, also refers to plants."},{term:"marijuana",severity:.3,note:"Cannabis reference with complex legal status."},{term:"crack",severity:.5,note:"Drug reference or legitimate verb."},{term:"amphetamine",severity:.5},{term:"benzo",severity:.3,note:"Drug abbreviation or name prefix."},{term:"benzodiazepine",severity:.5},{term:"opioid",severity:.3,note:"Drug class, medical term."},{term:"opiate",severity:.3,note:"Drug class, medical term."},{term:"ketamine",severity:.5,note:"Drug reference or medical use."},{term:"rohypnol",severity:.7,note:"Date rape drug reference."},{term:"i like",severity:.2,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"i love",severity:.3,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"i hate",severity:.5,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"young",severity:.2,note:"Age reference with legitimate uses but flagged in combination."},{term:"underage",severity:.8,note:"Age reference with concerning implications in certain contexts."},{term:"teen",severity:.3,note:"Age reference, concerning in some contexts."},{term:"adolescent",severity:.2,note:"Age term, concerning in some contexts."},{term:"preteen",severity:.4,note:"Age reference with concerning implications in certain contexts."},{term:"rapist",severity:1},{term:"raping",severity:1},{term:"incest",severity:1},{term:"cult",severity:.3,note:"Religious/social group term with negative connotation."},{term:"sekt",severity:.3,note:"German for 'sect', cult reference."},{term:"disembowel",severity:1},{term:"behead",severity:1},{term:"traitor",severity:.5,note:"Accusatory term."},{term:"genocide",severity:1},{term:"ethnic clean",severity:1,multiWord:!0,note:"Euphemism for genocide."},{term:"klan",severity:1},{term:"klux",severity:1},{term:"kkk",severity:1},{term:"kill",severity:.5,note:"Violent language, but common word."},{term:"bomb",severity:.7,note:"Terrorism/violence reference."},{term:"organi",severity:.1,note:"Word stem for organization."},{term:"blog",severity:.1,note:"External site reference."},{term:"group",severity:.1,note:"Organizational term."},{term:"compan",severity:.1,note:"Company stem, spam indicator."},{term:"associat",severity:.1,note:"Association stem."},{term:"industr",severity:.1,note:"Industry stem, spam indicator."},{term:"corporate",severity:.1,note:"Business term, spam indicator."},{term:"famil",severity:.1,note:"Family stem, group indicator."},{term:"task",severity:.1,note:"Organizational term."},{term:"alliance",severity:.1,note:"Group term."},{term:"entertain",severity:.1,note:"Entertainment stem, promotional."},{term:"public",severity:.1,note:"Common term, promotional context."},{term:"private",severity:.1,note:"Common term, organizational."},{term:"troll",severity:.3,note:"Disruptive behavior indicator."},{term:"trolol",severity:.3,note:"Trolling variant/meme."},{term:"grief",severity:.3,note:"Gaming term for harassment."},{term:"password",severity:.3,note:"Security term, suspicious in username."},{term:"admin",severity:.7,note:"Role impersonation."},{term:"sysop",severity:.4,note:"Wikipedia role impersonation."},{term:"bureaucrat",severity:.5,note:"Wikipedia role impersonation."},{term:"moderator",severity:.5,note:"Role impersonation."},{term:"staff",severity:.5,note:"Role impersonation."},{term:"developer",severity:.5,note:"Role impersonation."},{term:"owner",severity:.4,note:"Role impersonation."},{term:"founder",severity:.3,note:"Role impersonation."},{term:"wmf",severity:.2,note:"Wikimedia Foundation impersonation."},{term:"foundation",severity:.3,note:"Organizational impersonation."},{term:"unblock",severity:.1,note:"Suggests blocked user."},{term:"4chan",severity:.5,note:"Imageboard site, trolling association."},{term:"8chan",severity:.3,note:"Controversial imageboard."},{term:"reddit",severity:.3,note:"External site reference."},{term:"plague",severity:.3,note:"Disease/attack term."},{term:"skibidi",severity:.1,note:"Internet meme reference."},{term:"milf",severity:.5},{term:"dilf",severity:.5},{term:"sext",severity:.5,note:"Sending sexual messages."},{term:"thot",severity:.3,note:"Derogatory sexual slang."},{term:"rizz",severity:.1,note:"Gen Z slang for charisma."},{term:"gyatt",severity:.1,note:"Sexualized Gen Z slang."},{term:"noob",severity:.1},{term:"lyric",severity:.1,note:"Possible lyrics website spammer."},{term:"propaganda",severity:.5,note:"Misinformation term."},{term:"asshole",severity:.7},{term:"fucktard",severity:.7},{term:"retard",severity:.7},{term:"imbecile",severity:.5},{term:"moron",severity:.5},{term:"chigga",severity:1},{term:"chigger",severity:1},{term:"wigga",severity:1},{term:"wigger",severity:1},{term:"igga",severity:.7,note:"Potential variant of racial slur.",ignore:["1994","ig94"]},{term:"igger",severity:.7,note:"Potential variant of racial slur."},{term:"mother fuck",severity:.7,multiWord:!0},{term:"bull shit",severity:.6,multiWord:!0},{term:"dumb ass",severity:.5,multiWord:!0},{term:"dumb fuck",severity:.7,multiWord:!0},{term:"goon",severity:.2,multiWord:!1}]);t.profanity=new u({a:["ɑ","𝑎","𝗮","𝕒","𝖆","𝓪","𝚊","𝞪","А","а","𝔞","𝒂","𝘢","𝛼","𝒶","𝙖","𝜶","𝐚","𝖺","🄰","🅰️","🅰","Ⓐ","ⓐ","@"],b:["b","𝑏","𝗯","𝕓","𝖇","𝓫","𝚋","𝞫","Ь","в","𝔟","𝒃","𝘣","𝛃","𝒷","𝙗","𝜷","𝐛","𝖻","🄱","🅱️","🅱","Ⓑ","ⓑ"],c:["c","𝑐","𝗰","𝕔","𝖈","𝓬","𝚌","ϲ","с","𝔠","𝒄","𝘤","𝒸","𝙘","𝐜","𝖼","🄲","Ⓒ","ⓒ"],d:["d","𝑑","𝗱","𝕕","𝖉","𝓭","𝚍","𝞭","ԁ","ԃ","𝔡","𝒅","𝘥","𝛿","𝒹","𝙙","𝜹","𝐝","𝖽","𝝏","🄳","Ⓓ","ⓓ"],e:["e","𝑒","𝗲","𝕖","𝖊","𝓮","𝚎","𝞮","е","𝔢","𝒆","𝘦","𝛆","𝒺","𝙚","𝜺","𝐞","𝖾","з","𝝐","🄴","Ⓔ","ⓔ","€"],f:["f","𝑓","𝗳","𝕗","𝖋","𝓯","𝚏","𝞯","ғ","ƒ","𝔣","𝒇","𝘧","𝒻","𝙛","𝜻","𝐟","𝖿","🄵","Ⓕ","ⓕ"],g:["g","𝑔","𝗴","𝕘","𝖌","𝓰","𝚐","ɡ","Ԍ","ԍ","𝔤","𝒈","𝘨","𝙜","𝐠","𝗀","🄶","Ⓖ","ⓖ"],h:["h","𝗵","𝕙","𝖍","𝓱","𝚑","һ","н","𝔥","𝒉","𝘩","ℎ","𝒽","𝙝","𝐡","𝗁","🄷","Ⓗ","ⓗ"],i:["i","𝑖","𝗶","𝕚","𝖎","𝓲","𝚒","𝞲","і","𝔦","𝒊","𝘪","𝒾","𝙞","𝜾","𝐢","𝗂","🄸","ℹ️","ℹ","Ⓘ","ⓘ","!"],j:["j","𝑗","𝗷","𝕛","𝖏","𝓳","𝚳","ј","𝔧","𝒋","𝘫","𝒿","𝙟","𝐣","𝗃","🄹","Ⓙ","ⓙ"],k:["k","𝑘","𝗸","𝕜","𝖐","𝓴","κ","к","𝔨","𝒌","𝘬","𝓀","𝙠","𝝀","𝐤","𝗄","𝞳","𝜿","қ","🄺","Ⓚ","ⓚ"],l:["l","𝑙","𝗹","𝕝","𝖑","𝓵","ⅼ","ӏ","𝔩","𝒍","𝘭","𝓁","𝙡","𝐥","𝗅","🄻","Ⓛ","ⓛ","|"],m:["m","𝑚","𝗺","𝕞","𝖒","𝓶","𝚖","м","𝔪","𝒎","𝘮","𝓂","𝙢","𝐦","𝗆","🄼","Ⓜ️","Ⓜ","ⓜ"],n:["n","𝑛","𝗻","𝕟","𝖓","𝓷","𝚗","ո","п","𝔫","𝒏","𝘯","𝓃","𝙣","𝐧","𝗇","𝞰","𝜼","🄽","Ⓝ","ⓝ"],o:["o","𝑜","𝗼","𝕠","𝖔","𝓸","𝚘","ο","о","𝔬","𝒐","𝘰","𝙤","𝝈","𝐨","𝗈","𝜽","𝝄","𝝓","𝝑","𝝋","🄾","🅾️","🅾","Ⓞ","ⓞ"],p:["p","𝑝","𝗽","𝕡","𝖕","𝓹","𝚙","ρ","р","𝔭","𝒑","𝘱","𝓅","𝙥","𝐩","𝗉","𝝆","🄿","🅿️","🅿","Ⓟ","ⓟ"],q:["q","𝑞","𝗾","𝕢","𝖖","𝓺","𝚚","ԛ","𝔮","𝒒","𝘲","𝓆","𝙦","𝐪","𝗊","🅀","Ⓠ","ⓠ"],r:["r","𝑟","𝗿","𝕣","𝖗","𝓻","𝚛","г","𝔯","𝒓","𝘳","𝓇","𝙧","𝐫","𝗋","𝞽","🅁","Ⓡ","ⓡ"],s:["s","𝑠","𝗌","𝕤","𝖘","𝓼","𝚜","ѕ","𝔰","𝒔","𝘴","𝓈","𝙨","𝐬","🅂","Ⓢ","ⓢ","$"],t:["t","𝑡","𝗍","𝕥","𝖙","𝓽","𝚝","τ","т","𝔱","𝒕","𝘵","𝓉","𝙩","𝐭","𝝉","🅃","Ⓣ","ⓣ","+"],u:["u","𝑢","𝗎","𝕦","𝖚","𝓾","𝚞","υ","𝔲","𝒖","𝘶","𝓊","𝙪","𝐮","𝛍","🅄","Ⓤ","ⓤ"],v:["v","𝑣","𝗏","𝕧","𝖛","𝓿","𝚟","ν","𝔳","𝒗","𝘷","𝓋","𝙫","𝐯","𝞶","𝝂","𝝊","🅅","Ⓥ","ⓥ"],w:["w","𝑤","𝗐","𝕨","𝖜","𝔀","𝚠","ω","ш","𝔴","𝒘","𝘸","𝓌","𝙬","𝐰","𝝎","𝝍","🅆","Ⓦ","ⓦ"],x:["x","𝑥","𝗑","𝕩","𝖝","𝔁","𝚡","χ","х","𝔵","𝒙","𝘹","𝓍","𝙭","𝐱","𝝒","𝝌","🅇","Ⓧ","ⓧ"],y:["y","𝑦","𝗒","𝕪","𝖞","𝔂","𝚢","у","𝔶","𝒚","𝘺","𝓎","𝙮","𝐲","𝞬","𝜸","𝞴","🅈","Ⓨ","ⓨ"],z:["z","𝑧","𝗓","𝕫","𝖟","𝔃","𝚣","ζ","𝔷","𝒛","𝘻","𝓏","𝙯","𝐳","🅉","Ⓩ","ⓩ"],0:["0","𝟎","𝟬","𝟢"],1:["1","𝟏","𝟭","𝟣","①","➀","❶","➊","⓵"],2:["2","𝟐","𝟮","𝟤","②","➁","❷","➋","⓶"],3:["3","𝟑","𝟯","𝟥","③","➂","❸","➌","⓷"],4:["4","𝟒","𝟰","𝟦","④","➃","❹","➍","⓸","ᛋ"],5:["5","𝟓","𝟱","𝟧","⑤","➄","❺","➎","⓹"],6:["6","𝟔","𝟲","𝟨","⑥","➅","❻","➏","⓺"],7:["7","𝟕","𝟳","𝟩","⑦","➆","❼","➐","⓻"],8:["8","𝟖","𝟴","𝟪","⑧","➇","❽","➑","⓼"],9:["9","𝟗","𝟵","𝟫","⑨","➈","❾","➒","⓽"]})},4712(e,t){function n(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function s(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;var i=new WeakSet;function a(e,t,n=!1){const s=(new Date).toISOString();this.logs.push({type:e,timestamp:s,message:t,expected:n})}t.Logger=class{constructor(){n(this,i),this.logs=[]}getLogs(){return[...this.logs]}log(e,t){s(i,this,a).call(this,"log",e,t)}warn(e,t){s(i,this,a).call(this,"warn",e,t)}error(e,t){s(i,this,a).call(this,"error",e,t)}dev(e,t){s(i,this,a).call(this,"dev",e,t)}}},9501(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.StorageManager=void 0;var s,i,a,r=n(4712),o=n(4029);n(9458),n(7345),n(7704),n(8415);class l{static get versions(){return new Map([[0,o.Version.v0],[1,o.Version.v1],[2,o.Version.v2],[3,o.Version.v3]])}constructor(){this.reset(new r.Logger)}reset(e){return null==e||e.log("Resetting storage to default."),this.data=l.version.default,l.version.init(e,this.data),l.version.validate(),l.version.construct(),this.data}load(e={}){var t,n;const s=new r.Logger;let i=null!==(n=(t=e).version)&&void 0!==n?n:t.version=0;if(l.versions.has(i)){const t=l.version.number;for(;i!==t;){const t=l.versions.get(i+1);if(!("function"==typeof(null==t?void 0:t.constructor)&&new t instanceof o.Version)){s.dev("[MISSING_UPGRADE_METHOD] Uh oh! Something has gone wrong; this message should never appear. Please report this to the WikiShield developers."),e=this.reset(s);break}s.log(`Upgrading storage from version ${i} to ${i+1}`,!0);try{if(!t.init(s,e)){e=this.reset(s);break}(e=t.upgrade()).version=++i}catch(t){s.error(`Error upgrading storage from version ${i} to ${i+1}: ${t}`),e=this.reset(s);break}}i=e.version,s.log(`Initializing storage at version ${i}.`,!0),l.version.init(s,e),s.log(`Validating storage at version ${i}.`,!0),l.version.validate(),s.log(`Constructing storage at version ${i}.`,!0),e=l.version.construct(),s.log(`Storage loaded successfully at version ${i}.`,!0),this.data=e}else s.error(`Storage version ${i} is corrupted or unsupported.`),this.reset(s);return{data:this.data,logs:s.getLogs()}}save(){const e=new r.Logger,t=l.version.number;e.log(`Initializing storage at version ${t}.`,!0),l.version.init(e,this.data),e.log(`Deconstructing storage at version ${t}.`,!0);const n=l.version.deconstruct();return e.log(`Storage saved successfully at version ${t}.`,!0),{data:n,logs:e.getLogs()}}decode(e){try{return this.load(JSON.parse(atob(e.trim()||"e30=")))}catch(e){return this.load({})}}encode(){const{data:e,logs:t}=this.save();return{string:btoa(JSON.stringify(e)),logs:t}}static output(e,t="<unknown>",n=console){var s;const i=!e.some(e=>!e.expected);null==n||null===(s=n.log)||void 0===s||s.call(n,`[${i?" ":"X"}] WikiShield Storage Logs: ${t}`);for(const t of e){var a;let e=`[${t.expected?" ":"X"}][${t.timestamp}][Storage]`,s=t.type;"dev"===s&&(s="error",e=`#DEV# ${e}`),null==n||null===(a=n[s])||void 0===a||a.call(n,`${e} ${t.message}`)}}static okay(e,t=console){var n,s,i,a;null!=e||(e=(new l).load(l.versions.get(0).default));const r=!(null===(n=null===(s=e.logs)||void 0===s||null===(i=s.some)||void 0===i?void 0:i.call(s,e=>!e.expected))||void 0===n||n);return r||(null!==(a=void l.output(e.logs,"Storage Check",t))&&void 0!==a?a:r)}}t.StorageManager=l,s=l,i="version",a=o.Version.v3,(i=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(i))in s?Object.defineProperty(s,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):s[i]=a},330(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.isURL=t.isObject=void 0;t.isObject=e=>null!==e&&"object"==typeof e&&!Array.isArray(e);t.isURL=e=>{try{return new URL(e),!0}catch(e){return!1}}},4029(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Version=void 0;var s=n(4712),i=n(330);function a(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class r{static sanitize(e,t,n=null){var s;const i=e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.loadedData);if(void 0===i)return null!==(s=void this.loadedLogger.warn(`Missing expected key path [ ${e.join(" -> ")} ] in stored data, defaulting to fallback value.`))&&void 0!==s?s:t;if("function"==typeof n){var a;const s=n(i);return void 0===s?null!==(a=void this.loadedLogger.warn(`Invalid value at key path [ ${e.join(" -> ")} ] in stored data, defaulting to fallback value.`))&&void 0!==a?a:t:s}return i}static exists(...e){return void 0!==e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.loadedData)}static deprecated(...e){var t;return!!this.exists(...e)&&(null===(t=void this.loadedLogger.warn(`Skipped deprecated key path [ ${e.join(" -> ")} ] in stored data.`,!0))||void 0===t||t)}static reset(...e){this.loadedLogger.warn(`Resetting key path [ ${e.join(" -> ")} ] in stored data to default value.`);const t=e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.default);if(void 0===t)return void this.loadedLogger.dev(`Could not find default value for key path [ ${e.join(" -> ")} ] in stored data.`);const n=e.pop();e.reduce((e,t)=>(void 0===e[t]&&(e[t]={}),e[t]),this.loadedData)[n]=t}static restrictObject(e,...t){var n;if(!(0,i.isObject)(e))return null!==(n=void this.reset(...t))&&void 0!==n&&n;const s=Object.keys(t.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.default));return Object.keys(e).forEach(n=>{s.includes(n)||(this.loadedLogger.warn(`Removing unexpected key [ ${[...t,n].join(" -> ")} ] from stored data.`),delete e[n])}),!0}static get default(){return{}}static init(e,t){return this.loadedLogger=e,this.loadedData=t,!0}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");return{}}static validate(){var e;const t=this.loadedData;return this.restrictObject(t),t.version===this.number||null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e}}t.Version=r,a(r,"loadedLogger",new s.Logger),a(r,"loadedData",{}),a(r,"number",0)},9458(e,t,n){var s,i,a,r,o=n(4029);o.Version.v0=(s=class extends o.Version{static get default(){return{version:0,changelog:"0",options:{maxQueueSize:50,maxEditCount:50,minimumORESScore:0,enableSoundAlerts:!0,soundAlertORESScore:.95,enableUsernameHighlighting:!0,enableWelcomeLatin:!1,enableAutoWelcome:!1,enableEditAnalysis:!1,enableUsernameAnalysis:!1,enableAutoReporting:!0,selectedAutoReportReasons:{Vandalism:!0,"Subtle vandalism":!0,"Image vandalism":!0,Sandbox:!0,Unsourced:!0,"Unsourced (BLP)":!0,"Unsourced genre":!0,POV:!1,Commentary:!0,"AI-generated":!0,"AI-generated (talk)":!0,"MOS violation":!1,Censoring:!1,Disruption:!0,Deleting:!0,Errors:!0,"Editing tests":!0,Chatting:!1,Jokes:!0,Owning:!1,Advertising:!0,"Spam links":!0,"Personal attacks":!0,TPO:!0,"AfD removal":!0},zen:{enabled:!1,sounds:!0,watchlist:!1,notifications:!0,editCount:!1,toasts:!1},enableCloudStorage:!0,masterVolume:.5,volumes:{click:.5,notification:.5,watchlist:.5,alert:.5,whoosh:.5,warn:.5,rollback:.5,report:.5,thank:.5,protection:.5,block:.5,sparkle:.5,success:.5,error:.5},soundMappings:{click:"click",notification:"notify",watchlist:"ping",alert:"alert",whoosh:"whoosh",warn:"warn",rollback:"rollback",report:"report",thank:"thank",protection:"protection",block:"block",sparkle:"sparkle",success:"success",error:"error"},watchlistExpiry:"1 week",whitelistExpiry:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlightedExpiry:{users:"1 week",pages:"1 week",tags:"1 week"},wiki:"en",namespacesShown:[0],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:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlightUser",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:"Mentor"}}]}],selectedPalette:0,theme:"theme-light"},statistics:{reviewed:0,reverts:0,reverts:0,reports:0,warnings:0,welcomes:0,whitelisted:0,highlighted:0,blocks:0,sessionStart:Date.now()},whitelist:{users:[],pages:[],tags:[]},highlighted:{users:[],pages:[],tags:[]},queueWidth:"15vw",detailsWidth:"15vw"}}},i=s,r=0,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},7345(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(4029);g.Version.v1=(s=class extends g.Version{static get default(){return{version:1,changelog:"3",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,recent:{enabled:!0,order:0},flagged:{enabled:!0,order:1},users:{enabled:!0,order:2},watchlist:{enabled:!0,order:3}},cloud_storage:{enabled:!0},username_highlighting:{enabled:!0,fuzzy:!0},auto_welcome:{enabled:!0},expiry:{watchlist:"1 week",whitelist:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlight:{users:"1 week",pages:"1 week",tags:"1 week"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Unsourced","Unsourced (BLP)","Unsourced genre","Commentary","AI-generated","AI-generated (talk)","Censoring",,"Disruption","Deleting","Errors","Editing tests","Jokes","Advertising","Spam links","Personal attacks","TPO","AfD removal"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.notice":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},notices:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}}},UI:{theme:{palette:0},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlightUser",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:"Auto"}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");this.deprecated("options","enableWelcomeLatin"),this.deprecated("options","volumes","whoosh"),this.deprecated("options","volumes","warn"),this.deprecated("options","volumes","rollback"),this.deprecated("options","volumes","thank"),this.deprecated("options","volumes","sparkle"),this.deprecated("options","volumes","watchlist"),this.deprecated("options","volumes","success"),this.deprecated("options","volumes","error"),this.deprecated("options","soundMappings"),this.deprecated("options","wiki"),this.deprecated("options","showTemps"),this.deprecated("options","showUsers"),this.deprecated("options","sortQueueItems"),this.deprecated("options","theme"),this.deprecated("options","zen","editCount"),this.deprecated("options","zen","watchlist");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:e.settings.performance.startup},namespaces:this.sanitize(["options","namespacesShown"],e.settings.namespaces),queue:{max_size:this.sanitize(["options","maxQueueSize"],e.settings.queue.max_size),max_edits:this.sanitize(["options","maxEditCount"],e.settings.queue.max_edits),min_ores:this.sanitize(["options","minimumORESScore"],e.settings.queue.min_ores),recent:{enabled:e.settings.queue.recent.enabled,order:e.settings.queue.recent.order},flagged:{enabled:e.settings.queue.flagged.enabled,order:e.settings.queue.flagged.order},users:{enabled:e.settings.queue.users.enabled,order:e.settings.queue.users.order},watchlist:{enabled:e.settings.queue.watchlist.enabled,order:e.settings.queue.watchlist.order}},cloud_storage:{enabled:this.sanitize(["options","enableCloudStorage"],e.settings.cloud_storage.enabled)},username_highlighting:{enabled:this.sanitize(["options","enableUsernameHighlighting"],e.settings.username_highlighting.enabled),fuzzy:e.settings.username_highlighting.fuzzy},auto_welcome:{enabled:this.sanitize(["options","enableAutoWelcome"],e.settings.auto_welcome.enabled)},expiry:{watchlist:this.sanitize(["options","watchlistExpiry"],e.settings.expiry.watchlist),whitelist:{users:this.sanitize(["options","whitelistExpiry","users"],e.settings.expiry.whitelist.users),pages:this.sanitize(["options","whitelistExpiry","pages"],e.settings.expiry.whitelist.pages),tags:this.sanitize(["options","whitelistExpiry","tags"],e.settings.expiry.whitelist.tags)},highlight:{users:this.sanitize(["options","highlightedExpiry","users"],e.settings.expiry.highlight.users),pages:this.sanitize(["options","highlightedExpiry","pages"],e.settings.expiry.highlight.pages),tags:this.sanitize(["options","highlightedExpiry","tags"],e.settings.expiry.highlight.tags)}},auto_report:{enabled:this.sanitize(["options","enableAutoReporting"],e.settings.auto_report.enabled),for:this.sanitize(["options","selectedAutoReportReasons"],e.settings.auto_report.for,e=>{if((0,o.isObject)(e))return e["AI-generated"]=e["AI-Generated"],delete e["AI-Generated"],e["AI-generated (talk)"]=e["AI-Generated (talk)"],delete e["AI-Generated (talk)"],Object.keys(e).filter(t=>!0===(null==e?void 0:e[t]))})},AI:{enabled:this.sanitize(["options","enableOllamaAI"],e.settings.AI.enabled),provider:e.settings.AI.provider,edit_analysis:{enabled:this.sanitize(["options","enableEditAnalysis"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["options","enableUsernameAnalysis"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["options","ollamaServerUrl"],e.settings.AI.Ollama.server),model:this.sanitize(["options","ollamaModel"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["options","enableSoundAlerts"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["options","soundAlertORESScore"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["options","masterVolume"],e.settings.audio.volume.master),"master.startup":e.settings.audio.volume["master.startup"],"master.music":e.settings.audio.volume["master.music"],"master.music.zen_mode":e.settings.audio.volume["master.music.zen_mode"],"master.ui":e.settings.audio.volume["master.ui"],"master.ui.click":this.sanitize(["options","volumes","click"],e.settings.audio.volume["master.ui.click"]),"master.queue":e.settings.audio.volume["master.queue"],"master.queue.ores":this.sanitize(["options","volumes","alert"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":e.settings.audio.volume["master.queue.mention"],"master.notification":e.settings.audio.volume["master.notification"],"master.notification.alert":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.alert"]),"master.notification.notice":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.notice"]),"master.notification.toast":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.toast"]),"master.action":e.settings.audio.volume["master.action"],"master.action.default":e.settings.audio.volume["master.action.default"],"master.action.failed":e.settings.audio.volume["master.action.failed"],"master.action.report":this.sanitize(["options","volumes","report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["options","volumes","block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["options","volumes","protection"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["options","zen","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["options","zen","sounds"],e.settings.zen_mode.sound.enabled)},music:{enabled:e.settings.zen_mode.music.enabled},alerts:{enabled:this.sanitize(["options","zen","notifications"],e.settings.zen_mode.alerts.enabled)},notices:{enabled:this.sanitize(["options","zen","notifications"],e.settings.zen_mode.notices.enabled)},toasts:{enabled:this.sanitize(["options","zen","toasts"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:e.settings.zen_mode.badges.enabled}}},UI:{theme:{palette:this.sanitize(["options","selectedPalette"],e.UI.theme.palette)},queue:{width:this.sanitize(["queueWidth"],e.UI.queue.width)},details:{width:this.sanitize(["detailsWidth"],e.UI.details.width)}},control_scripts:this.sanitize(["options","controlScripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name){if(!(e.condition in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else switch(e.name){case"welcome":if(!(0,o.isObject)(e.params))return!0;switch(e.params.template){case"Links":e.params.template="Graphical";break;case"Latin":e.params.template="Non-Latin";break;case"Mentor":return this.loadedLogger.warn(`Skipped deprecated "Mentor" welcome template at key [${[...n,s,"params","template"].join(" -> ")}].`,!0),!1}break;case"warn":if(!(0,o.isObject)(e.params))return!0;switch(e.params.warningType){case"AI-Generated":e.params.warningType="AI-generated";break;case"AI-Generated (talk)":e.params.warningType="AI-generated (talk)"}}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:e.statistics.edits_reviewed.total,thanked:e.statistics.edits_reviewed.thanked},recent_changes_reviewed:{total:e.statistics.recent_changes_reviewed.total},pending_changes_reviewed:{total:e.statistics.pending_changes_reviewed.total,accepted:e.statistics.pending_changes_reviewed.accepted,rejected:e.statistics.pending_changes_reviewed.rejected},watchlist_changes_reviewed:{total:e.statistics.watchlist_changes_reviewed.total},users_reviewed:{total:e.statistics.users_reviewed.total},reverts_made:{total:e.statistics.reverts_made.total,good_faith:e.statistics.reverts_made.good_faith,from_recent_changes:e.statistics.reverts_made.from_recent_changes,from_pending_changes:e.statistics.reverts_made.from_pending_changes,from_watchlist:e.statistics.reverts_made.from_watchlist,from_loaded_edits:e.statistics.reverts_made.from_loaded_edits},users_welcomed:{total:e.statistics.users_welcomed.total},warnings_issued:{total:e.statistics.warnings_issued.total,level_1:e.statistics.warnings_issued.level_1,level_2:e.statistics.warnings_issued.level_2,level_3:e.statistics.warnings_issued.level_3,level_4:e.statistics.warnings_issued.level_4,level_4im:e.statistics.warnings_issued.level_4im},reports_filed:{total:e.statistics.reports_filed.total,AIV:e.statistics.reports_filed.AIV,UAA:e.statistics.reports_filed.UAA,RFPP:e.statistics.reports_filed.RFPP},watchlist:{watched:e.statistics.watchlist.watched,unwatched:e.statistics.watchlist.unwatched},items_whitelisted:{total:e.statistics.items_whitelisted.total,users:e.statistics.items_whitelisted.users,pages:e.statistics.items_whitelisted.pages,tags:e.statistics.items_whitelisted.tags},items_highlighted:{total:e.statistics.items_highlighted.total,users:e.statistics.items_highlighted.users,pages:e.statistics.items_highlighted.pages,tags:e.statistics.items_highlighted.tags},blocks_issued:{total:e.statistics.blocks_issued.total},pages_protected:{total:e.statistics.pages_protected.total},actions_executed:{total:e.statistics.actions_executed.total,successful:e.statistics.actions_executed.successful},session_time:e.statistics.session_time},highlight:{users:this.sanitize(["highlighted","users"],e.highlight.users),pages:this.sanitize(["highlighted","pages"],e.highlight.pages),tags:this.sanitize(["highlighted","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),t.version!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const g=t.settings.namespaces;Array.isArray(g)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const h=t.settings.queue;this.restrictObject(h,"settings","queue");{const m=t.settings.queue.max_size;"number"==typeof m&&Number.isInteger(m)&&m>0||this.reset("settings","queue","max_size")}{const v=t.settings.queue.max_edits;"number"==typeof v&&Number.isInteger(v)&&v>0||this.reset("settings","queue","max_edits")}{const f=t.settings.queue.min_ores;"number"==typeof f&&f>=0&&f<=1||this.reset("settings","queue","min_ores")}["recent","flagged","users","watchlist"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const b=t.settings.cloud_storage;this.restrictObject(b,"settings","cloud_storage");"boolean"!=typeof t.settings.cloud_storage.enabled&&this.reset("settings","cloud_storage","enabled")}{const w=t.settings.username_highlighting;this.restrictObject(w,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const y=t.settings.auto_welcome;this.restrictObject(y,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const x=new Set(["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"]),k=t.settings.expiry;this.restrictObject(k,"settings","expiry");{const _=t.settings.expiry.watchlist;x.has(_)||this.reset("settings","expiry","watchlist")}{const S=t.settings.expiry.whitelist;this.restrictObject(S,"settings","expiry","whitelist");{const q=t.settings.expiry.whitelist.users;x.has(q)||this.reset("settings","expiry","whitelist","users")}{const E=t.settings.expiry.whitelist.pages;x.has(E)||this.reset("settings","expiry","whitelist","pages")}{const L=t.settings.expiry.whitelist.tags;x.has(L)||this.reset("settings","expiry","whitelist","tags")}}{const A=t.settings.expiry.highlight;this.restrictObject(A,"settings","expiry","highlight");{const T=t.settings.expiry.highlight.users;x.has(T)||this.reset("settings","expiry","highlight","users")}{const C=t.settings.expiry.highlight.pages;x.has(C)||this.reset("settings","expiry","highlight","pages")}{const z=t.settings.expiry.highlight.tags;x.has(z)||this.reset("settings","expiry","highlight","tags")}}}{const M=t.settings.auto_report;this.restrictObject(M,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const $=t.settings.auto_report.for;Array.isArray($)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const O=t.settings.AI;this.restrictObject(O,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const I=t.settings.AI.edit_analysis;this.restrictObject(I,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const P=t.settings.AI.username_analysis;this.restrictObject(P,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const j=t.settings.AI.Ollama;this.restrictObject(j,"settings","AI","Ollama");{const W=t.settings.AI.Ollama.server;(0,o.isURL)(W)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const D=t.settings.audio;this.restrictObject(D,"settings","audio");{const R=t.settings.audio.ores_alert;this.restrictObject(R,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const U=t.settings.audio.ores_alert.threshold;"number"==typeof U&&U>=0&&U<=1||this.reset("settings","audio","ores_alert","threshold")}}{const N=t.settings.audio.volume;this.restrictObject(N,"settings","audio","volume");const H=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.notice","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const F of H){const V=t.settings.audio.volume[F];"number"==typeof V&&V>=0&&V<=1||this.reset("settings","audio","volume",F)}}}{const B=t.settings.zen_mode;this.restrictObject(B,"settings","zen_mode");"boolean"!=typeof B.enabled&&this.reset("settings","zen_mode","enabled");{const G=t.settings.zen_mode.sound;this.restrictObject(G,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const Q=t.settings.zen_mode.music;this.restrictObject(Q,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const Y=t.settings.zen_mode.alerts;this.restrictObject(Y,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const Z=t.settings.zen_mode.notices;this.restrictObject(Z,"settings","zen_mode","notices");"boolean"!=typeof t.settings.zen_mode.notices.enabled&&this.reset("settings","zen_mode","notices","enabled")}{const K=t.settings.zen_mode.toasts;this.restrictObject(K,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const X=t.settings.zen_mode.badges;this.restrictObject(X,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}}{const J=t.UI;this.restrictObject(J,"UI");{const ee=t.UI.theme;this.restrictObject(ee,"UI","theme");{const te=t.UI.theme.palette;"number"==typeof te&&Number.isInteger(te)&&te>=0&&te<=3||this.reset("UI","theme","palette")}}{const ne=t.UI.queue;this.restrictObject(ne,"UI","queue");{const se=t.UI.queue.width;"string"==typeof se&&se.endsWith("vw")||this.reset("UI","queue","width");const ie=parseFloat(se.slice(0,-2));"number"==typeof ie&&!isNaN(ie)&&ie>=10&&ie<=30||this.reset("UI","queue","width")}}{const ae=t.UI.details;this.restrictObject(ae,"UI","details");{const re=t.UI.details.width;"string"==typeof re&&re.endsWith("vw")||this.reset("UI","details","width");const oe=parseFloat(re.slice(0,-2));"number"==typeof oe&&!isNaN(oe)&&oe>=10&&oe<=30||this.reset("UI","details","width")}}}{const le=t.control_scripts;function de(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name){var i;if(!(e.condition in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${e.condition} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]),e.actions=de.call(this,e.actions,...t,n,"actions")}else{var a;if(!(e.name in c.events))return this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`),!1;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=null!==(a=c.events[e.name].parameters)&&void 0!==a?a:[],i=new Set;for(const a of s)i.add(a.id),"choice"===a.type&&(a.id in e.params||(this.loadedLogger.warn(`Resetting missing choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]),a.options.includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]));for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(le)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>p.controls.has(e)),t.control_scripts[n].actions=de.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const ce=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,ue=t.statistics;this.restrictObject(ue,"statistics");{const pe=t.statistics.edits_reviewed;this.restrictObject(pe,"statistics","edits_reviewed");ce(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");ce(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const ge=t.statistics.recent_changes_reviewed;this.restrictObject(ge,"statistics","recent_changes_reviewed");ce(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const he=t.statistics.pending_changes_reviewed;this.restrictObject(he,"statistics","pending_changes_reviewed");ce(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");ce(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");ce(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const me=t.statistics.watchlist_changes_reviewed;this.restrictObject(me,"statistics","watchlist_changes_reviewed");ce(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const ve=t.statistics.users_reviewed;this.restrictObject(ve,"statistics","users_reviewed");ce(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const fe=t.statistics.reverts_made;this.restrictObject(fe,"statistics","reverts_made");ce(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");ce(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");ce(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");ce(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");ce(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");ce(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const be=t.statistics.users_welcomed;this.restrictObject(be,"statistics","users_welcomed");ce(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const we=t.statistics.warnings_issued;this.restrictObject(we,"statistics","warnings_issued");ce(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");ce(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");ce(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");ce(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");ce(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");ce(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const ye=t.statistics.reports_filed;this.restrictObject(ye,"statistics","reports_filed");ce(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");ce(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");ce(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");ce(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP")}{const xe=t.statistics.watchlist;this.restrictObject(xe,"statistics","watchlist");ce(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");ce(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const ke=t.statistics.items_whitelisted;this.restrictObject(ke,"statistics","items_whitelisted");ce(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");ce(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");ce(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");ce(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const _e=t.statistics.items_highlighted;this.restrictObject(_e,"statistics","items_highlighted");ce(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");ce(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");ce(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");ce(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const Se=t.statistics.blocks_issued;this.restrictObject(Se,"statistics","blocks_issued");ce(t.statistics.blocks_issued.total)||this.reset("statistics","blocks_issued","total")}{const qe=t.statistics.pages_protected;this.restrictObject(qe,"statistics","pages_protected");ce(t.statistics.pages_protected.total)||this.reset("statistics","pages_protected","total")}{const Ee=t.statistics.actions_executed;this.restrictObject(Ee,"statistics","actions_executed");ce(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");ce(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const Le=t.statistics.session_time;"number"==typeof Le&&Le>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Ae=t.highlight;this.restrictObject(Ae,"highlight");{const Te=t.highlight.users;Array.isArray(Te)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const Ce=t.highlight.pages;Array.isArray(Ce)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const ze=t.highlight.tags;Array.isArray(ze)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const Me=t.whitelist;this.restrictObject(Me,"whitelist");{const $e=t.whitelist.users;Array.isArray($e)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const Oe=t.whitelist.pages;Array.isArray(Oe)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const Ie=t.whitelist.tags;Array.isArray(Ie)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=1,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},7704(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(4029);g.Version.v2=(s=class extends g.Version{static get default(){return{version:2,changelog:"6",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,recent:{enabled:!0,order:0},flagged:{enabled:!0,order:1},users:{enabled:!0,order:2},watchlist:{enabled:!0,order:3}},cloud_storage:{enabled:!0},username_highlighting:{enabled:!0,fuzzy:!0},wikipedia_popups:{enabled:!0},auto_welcome:{enabled:!1},expiry:{watchlist:"1 week",whitelist:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlight:{users:"1 week",pages:"1 week",tags:"1 week"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Deliberate errors","Disruptive editing","Editing tests","Commentary","Inappropriate jokes","Deleting","Unsourced","Unsourced (BLP)","Unsourced genre","Original research","Censoring","AI-generated","AI-generated (talk)","Personal attacks","Harassment","TPO",,"AfD removal","Advertising","Spam links","Inappropriate edit summary","Misleading edit summary"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.notice":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},notices:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}},repeat_control_scripts:!0},UI:{theme:{palette:0},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warning:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]},{name:"highlightUser",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:"Auto"}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]},favorite:{warnings:[],reverts:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:this.sanitize(["settings","performance","startup"],e.settings.performance.startup)},namespaces:this.sanitize(["settings","namespaces"],e.settings.namespaces),queue:{max_size:this.sanitize(["settings","queue","max_size"],e.settings.queue.max_size),max_edits:this.sanitize(["settings","queue","max_edits"],e.settings.queue.max_edits),min_ores:this.sanitize(["settings","queue","min_ores"],e.settings.queue.min_ores),recent:{enabled:this.sanitize(["settings","queue","recent","enabled"],e.settings.queue.recent.enabled),order:this.sanitize(["settings","queue","recent","order"],e.settings.queue.recent.order)},flagged:{enabled:this.sanitize(["settings","queue","flagged","enabled"],e.settings.queue.flagged.enabled),order:this.sanitize(["settings","queue","flagged","order"],e.settings.queue.flagged.order)},users:{enabled:this.sanitize(["settings","queue","users","enabled"],e.settings.queue.users.enabled),order:this.sanitize(["settings","queue","users","order"],e.settings.queue.users.order)},watchlist:{enabled:this.sanitize(["settings","queue","watchlist","enabled"],e.settings.queue.watchlist.enabled),order:this.sanitize(["settings","queue","watchlist","order"],e.settings.queue.watchlist.order)}},cloud_storage:{enabled:this.sanitize(["settings","cloud_storage","enabled"],e.settings.cloud_storage.enabled)},username_highlighting:{enabled:this.sanitize(["settings","username_highlighting","enabled"],e.settings.username_highlighting.enabled),fuzzy:this.sanitize(["settings","username_highlighting","fuzzy"],e.settings.username_highlighting.fuzzy)},wikipedia_popups:{enabled:e.settings.wikipedia_popups.enabled},auto_welcome:{enabled:this.sanitize(["settings","auto_welcome","enabled"],e.settings.auto_welcome.enabled)},expiry:{watchlist:this.sanitize(["settings","expiry","watchlist"],e.settings.expiry.watchlist),whitelist:{users:this.sanitize(["settings","expiry","whitelist","users"],e.settings.expiry.whitelist.users),pages:this.sanitize(["settings","expiry","whitelist","pages"],e.settings.expiry.whitelist.pages),tags:this.sanitize(["settings","expiry","whitelist","tags"],e.settings.expiry.whitelist.tags)},highlight:{users:this.sanitize(["settings","expiry","highlight","users"],e.settings.expiry.highlight.users),pages:this.sanitize(["settings","expiry","highlight","pages"],e.settings.expiry.highlight.pages),tags:this.sanitize(["settings","expiry","highlight","tags"],e.settings.expiry.highlight.tags)}},auto_report:{enabled:this.sanitize(["settings","auto_report","enabled"],e.settings.auto_report.enabled),for:this.sanitize(["settings","auto_report","for"],e.settings.auto_report.for,e=>{if(!Array.isArray(e))return;const t=new Set(["Harassment","Inappropriate edit summary","Original research"]);return e.forEach(e=>{switch(e){case"Errors":return void t.add("Deliberate errors");case"Disruption":return void t.add("Disruptive editing");case"Jokes":return void t.add("Inappropriate jokes")}t.add(e)}),[...t]})},AI:{enabled:this.sanitize(["settings","AI","enabled"],e.settings.AI.enabled),provider:this.sanitize(["settings","AI","provider"],e.settings.AI.provider),edit_analysis:{enabled:this.sanitize(["settings","AI","edit_analysis","enabled"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["settings","AI","username_analysis","enabled"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["settings","AI","Ollama","server"],e.settings.AI.Ollama.server),model:this.sanitize(["settings","AI","Ollama","model"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["settings","audio","ores_alert","enabled"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["settings","audio","ores_alert","threshold"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["settings","audio","volume","master"],e.settings.audio.volume.master),"master.startup":this.sanitize(["settings","audio","volume","master.startup"],e.settings.audio.volume["master.startup"]),"master.music":this.sanitize(["settings","audio","volume","master.music"],e.settings.audio.volume["master.music"]),"master.music.zen_mode":this.sanitize(["settings","audio","volume","master.music.zen_mode"],e.settings.audio.volume["master.music.zen_mode"]),"master.ui":this.sanitize(["settings","audio","volume","master.ui"],e.settings.audio.volume["master.ui"]),"master.ui.click":this.sanitize(["settings","audio","volume","master.ui.click"],e.settings.audio.volume["master.ui.click"]),"master.queue":this.sanitize(["settings","audio","volume","master.queue"],e.settings.audio.volume["master.queue"]),"master.queue.ores":this.sanitize(["settings","audio","volume","master.queue.ores"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":this.sanitize(["settings","audio","volume","master.queue.mention"],e.settings.audio.volume["master.queue.mention"]),"master.notification":this.sanitize(["settings","audio","volume","master.notification"],e.settings.audio.volume["master.notification"]),"master.notification.alert":this.sanitize(["settings","audio","volume","master.notification.alert"],e.settings.audio.volume["master.notification.alert"]),"master.notification.notice":this.sanitize(["settings","audio","volume","master.notification.notice"],e.settings.audio.volume["master.notification.notice"]),"master.notification.toast":this.sanitize(["settings","audio","volume","master.notification.toast"],e.settings.audio.volume["master.notification.toast"]),"master.action":this.sanitize(["settings","audio","volume","master.action"],e.settings.audio.volume["master.action"]),"master.action.default":this.sanitize(["settings","audio","volume","master.action.default"],e.settings.audio.volume["master.action.default"]),"master.action.failed":this.sanitize(["settings","audio","volume","master.action.failed"],e.settings.audio.volume["master.action.failed"]),"master.action.report":this.sanitize(["settings","audio","volume","master.action.report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["settings","audio","volume","master.action.block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["settings","audio","volume","master.action.protect"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["settings","zen_mode","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["settings","zen_mode","sound","enabled"],e.settings.zen_mode.sound.enabled)},music:{enabled:this.sanitize(["settings","zen_mode","music","enabled"],e.settings.zen_mode.music.enabled)},alerts:{enabled:this.sanitize(["settings","zen_mode","alerts","enabled"],e.settings.zen_mode.alerts.enabled)},notices:{enabled:this.sanitize(["settings","zen_mode","notices","enabled"],e.settings.zen_mode.notices.enabled)},toasts:{enabled:this.sanitize(["settings","zen_mode","toasts","enabled"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:this.sanitize(["settings","zen_mode","badges","enabled"],e.settings.zen_mode.badges.enabled)}},repeat_control_scripts:e.settings.repeat_control_scripts},UI:{theme:{palette:this.sanitize(["UI","theme","palette"],e.UI.theme.palette)},queue:{width:this.sanitize(["UI","queue","width"],e.UI.queue.width)},details:{width:this.sanitize(["UI","details","width"],e.UI.details.width)}},control_scripts:this.sanitize(["control_scripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name){if(!(e.condition in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else if("warn"===e.name){if(!(0,o.isObject)(e.params))return!0;e.params.warning=e.params.warningType,delete e.params.warningType}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:this.sanitize(["statistics","edits_reviewed","total"],e.statistics.edits_reviewed.total),thanked:this.sanitize(["statistics","edits_reviewed","thanked"],e.statistics.edits_reviewed.thanked)},recent_changes_reviewed:{total:this.sanitize(["statistics","recent_changes_reviewed","total"],e.statistics.recent_changes_reviewed.total)},pending_changes_reviewed:{total:this.sanitize(["statistics","pending_changes_reviewed","total"],e.statistics.pending_changes_reviewed.total),accepted:this.sanitize(["statistics","pending_changes_reviewed","accepted"],e.statistics.pending_changes_reviewed.accepted),rejected:this.sanitize(["statistics","pending_changes_reviewed","rejected"],e.statistics.pending_changes_reviewed.rejected)},watchlist_changes_reviewed:{total:this.sanitize(["statistics","watchlist_changes_reviewed","total"],e.statistics.watchlist_changes_reviewed.total)},users_reviewed:{total:this.sanitize(["statistics","users_reviewed","total"],e.statistics.users_reviewed.total)},reverts_made:{total:this.sanitize(["statistics","reverts_made","total"],e.statistics.reverts_made.total),good_faith:this.sanitize(["statistics","reverts_made","good_faith"],e.statistics.reverts_made.good_faith),from_recent_changes:this.sanitize(["statistics","reverts_made","from_recent_changes"],e.statistics.reverts_made.from_recent_changes),from_pending_changes:this.sanitize(["statistics","reverts_made","from_pending_changes"],e.statistics.reverts_made.from_pending_changes),from_watchlist:this.sanitize(["statistics","reverts_made","from_watchlist"],e.statistics.reverts_made.from_watchlist),from_loaded_edits:this.sanitize(["statistics","reverts_made","from_loaded_edits"],e.statistics.reverts_made.from_loaded_edits)},users_welcomed:{total:this.sanitize(["statistics","users_welcomed","total"],e.statistics.users_welcomed.total)},warnings_issued:{total:this.sanitize(["statistics","warnings_issued","total"],e.statistics.warnings_issued.total),level_1:this.sanitize(["statistics","warnings_issued","level_1"],e.statistics.warnings_issued.level_1),level_2:this.sanitize(["statistics","warnings_issued","level_2"],e.statistics.warnings_issued.level_2),level_3:this.sanitize(["statistics","warnings_issued","level_3"],e.statistics.warnings_issued.level_3),level_4:this.sanitize(["statistics","warnings_issued","level_4"],e.statistics.warnings_issued.level_4),level_4im:this.sanitize(["statistics","warnings_issued","level_4im"],e.statistics.warnings_issued.level_4im)},reports_filed:{total:this.sanitize(["statistics","reports_filed","total"],e.statistics.reports_filed.total),AIV:this.sanitize(["statistics","reports_filed","AIV"],e.statistics.reports_filed.AIV),UAA:this.sanitize(["statistics","reports_filed","UAA"],e.statistics.reports_filed.UAA),RFPP:this.sanitize(["statistics","reports_filed","RFPP"],e.statistics.reports_filed.RFPP)},watchlist:{watched:this.sanitize(["statistics","watchlist","watched"],e.statistics.watchlist.watched),unwatched:this.sanitize(["statistics","watchlist","unwatched"],e.statistics.watchlist.unwatched)},items_whitelisted:{total:this.sanitize(["statistics","items_whitelisted","total"],e.statistics.items_whitelisted.total),users:this.sanitize(["statistics","items_whitelisted","users"],e.statistics.items_whitelisted.users),pages:this.sanitize(["statistics","items_whitelisted","pages"],e.statistics.items_whitelisted.pages),tags:this.sanitize(["statistics","items_whitelisted","tags"],e.statistics.items_whitelisted.tags)},items_highlighted:{total:this.sanitize(["statistics","items_highlighted","total"],e.statistics.items_highlighted.total),users:this.sanitize(["statistics","items_highlighted","users"],e.statistics.items_highlighted.users),pages:this.sanitize(["statistics","items_highlighted","pages"],e.statistics.items_highlighted.pages),tags:this.sanitize(["statistics","items_highlighted","tags"],e.statistics.items_highlighted.tags)},blocks_issued:{total:this.sanitize(["statistics","blocks_issued","total"],e.statistics.blocks_issued.total)},pages_protected:{total:this.sanitize(["statistics","pages_protected","total"],e.statistics.pages_protected.total)},actions_executed:{total:this.sanitize(["statistics","actions_executed","total"],e.statistics.actions_executed.total),successful:this.sanitize(["statistics","actions_executed","successful"],e.statistics.actions_executed.successful)},session_time:this.sanitize(["statistics","session_time"],e.statistics.session_time)},highlight:{users:this.sanitize(["highlight","users"],e.highlight.users),pages:this.sanitize(["highlight","pages"],e.highlight.pages),tags:this.sanitize(["highlight","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)},favorite:{warnings:e.favorite.warnings,reverts:e.favorite.reverts}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),t.version!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const g=t.settings.namespaces;Array.isArray(g)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const h=t.settings.queue;this.restrictObject(h,"settings","queue");{const m=t.settings.queue.max_size;"number"==typeof m&&Number.isInteger(m)&&m>0||this.reset("settings","queue","max_size")}{const v=t.settings.queue.max_edits;"number"==typeof v&&Number.isInteger(v)&&v>0||this.reset("settings","queue","max_edits")}{const f=t.settings.queue.min_ores;"number"==typeof f&&f>=0&&f<=1||this.reset("settings","queue","min_ores")}["recent","flagged","users","watchlist"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const b=t.settings.cloud_storage;this.restrictObject(b,"settings","cloud_storage");"boolean"!=typeof t.settings.cloud_storage.enabled&&this.reset("settings","cloud_storage","enabled")}{const w=t.settings.username_highlighting;this.restrictObject(w,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const y=t.settings.wikipedia_popups;this.restrictObject(y,"settings","wikipedia_popups");"boolean"!=typeof t.settings.wikipedia_popups.enabled&&this.reset("settings","wikipedia_popups","enabled")}{const x=t.settings.auto_welcome;this.restrictObject(x,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const k=new Set(["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"]),_=t.settings.expiry;this.restrictObject(_,"settings","expiry");{const S=t.settings.expiry.watchlist;k.has(S)||this.reset("settings","expiry","watchlist")}{const q=t.settings.expiry.whitelist;this.restrictObject(q,"settings","expiry","whitelist");{const E=t.settings.expiry.whitelist.users;k.has(E)||this.reset("settings","expiry","whitelist","users")}{const L=t.settings.expiry.whitelist.pages;k.has(L)||this.reset("settings","expiry","whitelist","pages")}{const A=t.settings.expiry.whitelist.tags;k.has(A)||this.reset("settings","expiry","whitelist","tags")}}{const T=t.settings.expiry.highlight;this.restrictObject(T,"settings","expiry","highlight");{const C=t.settings.expiry.highlight.users;k.has(C)||this.reset("settings","expiry","highlight","users")}{const z=t.settings.expiry.highlight.pages;k.has(z)||this.reset("settings","expiry","highlight","pages")}{const M=t.settings.expiry.highlight.tags;k.has(M)||this.reset("settings","expiry","highlight","tags")}}}{const $=t.settings.auto_report;this.restrictObject($,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const O=t.settings.auto_report.for;Array.isArray(O)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const I=t.settings.AI;this.restrictObject(I,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const P=t.settings.AI.edit_analysis;this.restrictObject(P,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const j=t.settings.AI.username_analysis;this.restrictObject(j,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const W=t.settings.AI.Ollama;this.restrictObject(W,"settings","AI","Ollama");{const D=t.settings.AI.Ollama.server;(0,o.isURL)(D)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const R=t.settings.audio;this.restrictObject(R,"settings","audio");{const U=t.settings.audio.ores_alert;this.restrictObject(U,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const N=t.settings.audio.ores_alert.threshold;"number"==typeof N&&N>=0&&N<=1||this.reset("settings","audio","ores_alert","threshold")}}{const H=t.settings.audio.volume;this.restrictObject(H,"settings","audio","volume");const F=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.notice","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const V of F){const B=t.settings.audio.volume[V];"number"==typeof B&&B>=0&&B<=1||this.reset("settings","audio","volume",V)}}}{const G=t.settings.zen_mode;this.restrictObject(G,"settings","zen_mode");"boolean"!=typeof G.enabled&&this.reset("settings","zen_mode","enabled");{const Q=t.settings.zen_mode.sound;this.restrictObject(Q,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const Y=t.settings.zen_mode.music;this.restrictObject(Y,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const Z=t.settings.zen_mode.alerts;this.restrictObject(Z,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const K=t.settings.zen_mode.notices;this.restrictObject(K,"settings","zen_mode","notices");"boolean"!=typeof t.settings.zen_mode.notices.enabled&&this.reset("settings","zen_mode","notices","enabled")}{const X=t.settings.zen_mode.toasts;this.restrictObject(X,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const J=t.settings.zen_mode.badges;this.restrictObject(J,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}"boolean"!=typeof t.settings.repeat_control_scripts&&this.reset("settings","repeat_control_scripts")}{const ee=t.UI;this.restrictObject(ee,"UI");{const te=t.UI.theme;this.restrictObject(te,"UI","theme");{const ne=t.UI.theme.palette;"number"==typeof ne&&Number.isInteger(ne)&&ne>=0&&ne<=3||this.reset("UI","theme","palette")}}{const se=t.UI.queue;this.restrictObject(se,"UI","queue");{const ie=t.UI.queue.width;"string"==typeof ie&&ie.endsWith("vw")||this.reset("UI","queue","width");const ae=parseFloat(ie.slice(0,-2));"number"==typeof ae&&!isNaN(ae)&&ae>=10&&ae<=30||this.reset("UI","queue","width")}}{const re=t.UI.details;this.restrictObject(re,"UI","details");{const oe=t.UI.details.width;"string"==typeof oe&&oe.endsWith("vw")||this.reset("UI","details","width");const le=parseFloat(oe.slice(0,-2));"number"==typeof le&&!isNaN(le)&&le>=10&&le<=30||this.reset("UI","details","width")}}}{const de=t.control_scripts;function ce(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name){var i;if(!(e.condition in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${e.condition} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]),e.actions=ce.call(this,e.actions,...t,n,"actions")}else{var a,r;if(!(e.name in c.events))return null!==(a=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`))&&void 0!==a&&a;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=null!==(r=c.events[e.name].parameters)&&void 0!==r?r:[],i=new Set;for(const a of s)i.add(a.id),"choice"===a.type&&(a.id in e.params||(this.loadedLogger.warn(`Resetting missing choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]),a.options.includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]));for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(de)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>p.controls.has(e)),t.control_scripts[n].actions=ce.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const ue=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,pe=t.statistics;this.restrictObject(pe,"statistics");{const ge=t.statistics.edits_reviewed;this.restrictObject(ge,"statistics","edits_reviewed");ue(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");ue(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const he=t.statistics.recent_changes_reviewed;this.restrictObject(he,"statistics","recent_changes_reviewed");ue(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const me=t.statistics.pending_changes_reviewed;this.restrictObject(me,"statistics","pending_changes_reviewed");ue(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");ue(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");ue(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const ve=t.statistics.watchlist_changes_reviewed;this.restrictObject(ve,"statistics","watchlist_changes_reviewed");ue(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const fe=t.statistics.users_reviewed;this.restrictObject(fe,"statistics","users_reviewed");ue(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const be=t.statistics.reverts_made;this.restrictObject(be,"statistics","reverts_made");ue(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");ue(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");ue(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");ue(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");ue(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");ue(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const we=t.statistics.users_welcomed;this.restrictObject(we,"statistics","users_welcomed");ue(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const ye=t.statistics.warnings_issued;this.restrictObject(ye,"statistics","warnings_issued");ue(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");ue(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");ue(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");ue(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");ue(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");ue(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const xe=t.statistics.reports_filed;this.restrictObject(xe,"statistics","reports_filed");ue(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");ue(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");ue(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");ue(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP")}{const ke=t.statistics.watchlist;this.restrictObject(ke,"statistics","watchlist");ue(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");ue(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const _e=t.statistics.items_whitelisted;this.restrictObject(_e,"statistics","items_whitelisted");ue(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");ue(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");ue(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");ue(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const Se=t.statistics.items_highlighted;this.restrictObject(Se,"statistics","items_highlighted");ue(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");ue(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");ue(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");ue(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const qe=t.statistics.blocks_issued;this.restrictObject(qe,"statistics","blocks_issued");ue(t.statistics.blocks_issued.total)||this.reset("statistics","blocks_issued","total")}{const Ee=t.statistics.pages_protected;this.restrictObject(Ee,"statistics","pages_protected");ue(t.statistics.pages_protected.total)||this.reset("statistics","pages_protected","total")}{const Le=t.statistics.actions_executed;this.restrictObject(Le,"statistics","actions_executed");ue(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");ue(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const Ae=t.statistics.session_time;"number"==typeof Ae&&Ae>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Te=t.highlight;this.restrictObject(Te,"highlight");{const Ce=t.highlight.users;Array.isArray(Ce)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const ze=t.highlight.pages;Array.isArray(ze)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const Me=t.highlight.tags;Array.isArray(Me)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const $e=t.whitelist;this.restrictObject($e,"whitelist");{const Oe=t.whitelist.users;Array.isArray(Oe)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const Ie=t.whitelist.pages;Array.isArray(Ie)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const Pe=t.whitelist.tags;Array.isArray(Pe)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}{const je=t.favorite;this.restrictObject(je,"favorite");{const We=t.favorite.warnings;Array.isArray(We)||this.reset("favorite","warnings"),t.favorite.warnings=t.favorite.warnings.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite warning [ ${e} ] from stored data.`),t})}{const De=t.favorite.reverts;Array.isArray(De)||this.reset("favorite","reverts"),t.favorite.reverts=t.favorite.reverts.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite revert [ ${e} ] from stored data.`),t})}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=2,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},8415(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(3241),h=n(5564),m=n(8469),v=n(4029);v.Version.v3=(s=class extends v.Version{static get default(){return{version:3,changelog:"6",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,ores_bias:.5,recent:{enabled:!0,order:0},pending:{enabled:!0,order:1},users:{enabled:!1,order:2},watchlist:{enabled:!0,order:3},abuselog:{enabled:!0,order:4}},username_highlighting:{enabled:!0,fuzzy:!1},wikipedia_popups:{enabled:!0},auto_welcome:{enabled:!1},talk_page_thanks_for_temporary_users:{enabled:!0},expiry:{watchlist:"1W",whitelist:{users:"infinity",pages:"infinity",tags:"infinity"},highlight:{users:"1W",pages:"1W",tags:"1W"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Deliberate errors","Disruptive editing","Editing tests","Commentary","Inappropriate jokes","Deleting","Unsourced","Unsourced (BLP)","Unsourced genre","Original research","Censoring","AI-generated","AI-generated (talk)","Personal attacks","Harassment","TPO","AfD removal","Advertising","Spam links","Attempt","Inappropriate edit summary","Misleading edit summary"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.message":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},messages:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}},accessibility:{colorblind:!1,dyslexia:!1,high_contrast:!1,reduce_motion:!1},repeat_control_scripts:!0},UI:{theme:{app:"auto",palette:"traffic"},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"," "],actions:[{name:"next-item",params:{}}]},{keys:["arrowleft"],actions:[{name:"previous-item",params:{}}]},{keys:["q"],actions:[{name:"next-item",params:{}},{name:"revert",params:{warning:"Vandalism"}},{name:"highlight-user",params:{}}]},{keys:["h"],actions:[{name:"open-page-history",params:{}}]},{keys:["c"],actions:[{name:"open-user-contributions",params:{}}]},{keys:["t"],actions:[{name:"thank-user",params:{}}]},{keys:["w"],actions:[{name:"welcome-user",params:{}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},abuselogs_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_abuselogs:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0,global_blocks:0,global_locks:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]},favorite:{warnings:[],reverts:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");this.deprecated("settings","cloud_storage");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:this.sanitize(["settings","performance","startup"],e.settings.performance.startup)},namespaces:this.sanitize(["settings","namespaces"],e.settings.namespaces),queue:{max_size:this.sanitize(["settings","queue","max_size"],e.settings.queue.max_size),max_edits:this.sanitize(["settings","queue","max_edits"],e.settings.queue.max_edits),min_ores:this.sanitize(["settings","queue","min_ores"],e.settings.queue.min_ores),ores_bias:e.settings.queue.ores_bias,recent:{enabled:this.sanitize(["settings","queue","recent","enabled"],e.settings.queue.recent.enabled),order:this.sanitize(["settings","queue","recent","order"],e.settings.queue.recent.order)},pending:{enabled:this.sanitize(["settings","queue","flagged","enabled"],e.settings.queue.pending.enabled),order:this.sanitize(["settings","queue","flagged","order"],e.settings.queue.pending.order)},users:{enabled:this.sanitize(["settings","queue","users","enabled"],e.settings.queue.users.enabled),order:this.sanitize(["settings","queue","users","order"],e.settings.queue.users.order)},watchlist:{enabled:this.sanitize(["settings","queue","watchlist","enabled"],e.settings.queue.watchlist.enabled),order:this.sanitize(["settings","queue","watchlist","order"],e.settings.queue.watchlist.order)},abuselog:{enabled:e.settings.queue.abuselog.enabled,order:e.settings.queue.abuselog.order}},username_highlighting:{enabled:this.sanitize(["settings","username_highlighting","enabled"],e.settings.username_highlighting.enabled),fuzzy:this.sanitize(["settings","username_highlighting","fuzzy"],e.settings.username_highlighting.fuzzy)},wikipedia_popups:{enabled:e.settings.wikipedia_popups.enabled},auto_welcome:{enabled:this.sanitize(["settings","auto_welcome","enabled"],e.settings.auto_welcome.enabled)},talk_page_thanks_for_temporary_users:{enabled:e.settings.talk_page_thanks_for_temporary_users.enabled},expiry:{watchlist:this.sanitize(["settings","expiry","watchlist"],e.settings.expiry.watchlist,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),whitelist:{users:this.sanitize(["settings","expiry","whitelist","users"],e.settings.expiry.whitelist.users,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),pages:this.sanitize(["settings","expiry","whitelist","pages"],e.settings.expiry.whitelist.pages,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),tags:this.sanitize(["settings","expiry","whitelist","tags"],e.settings.expiry.whitelist.tags,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e]))},highlight:{users:this.sanitize(["settings","expiry","highlight","users"],e.settings.expiry.highlight.users,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),pages:this.sanitize(["settings","expiry","highlight","pages"],e.settings.expiry.highlight.pages,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),tags:this.sanitize(["settings","expiry","highlight","tags"],e.settings.expiry.highlight.tags,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e]))}},auto_report:{enabled:this.sanitize(["settings","auto_report","enabled"],e.settings.auto_report.enabled),for:this.sanitize(["settings","auto_report","for"],e.settings.auto_report.for,e=>{if(!Array.isArray(e))return;const t=new Set(["Attempt"]);return e.forEach(e=>t.add(e)),[...t]})},AI:{enabled:this.sanitize(["settings","AI","enabled"],e.settings.AI.enabled),provider:this.sanitize(["settings","AI","provider"],e.settings.AI.provider),edit_analysis:{enabled:this.sanitize(["settings","AI","edit_analysis","enabled"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["settings","AI","username_analysis","enabled"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["settings","AI","Ollama","server"],e.settings.AI.Ollama.server),model:this.sanitize(["settings","AI","Ollama","model"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["settings","audio","ores_alert","enabled"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["settings","audio","ores_alert","threshold"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["settings","audio","volume","master"],e.settings.audio.volume.master),"master.startup":this.sanitize(["settings","audio","volume","master.startup"],e.settings.audio.volume["master.startup"]),"master.music":this.sanitize(["settings","audio","volume","master.music"],e.settings.audio.volume["master.music"]),"master.music.zen_mode":this.sanitize(["settings","audio","volume","master.music.zen_mode"],e.settings.audio.volume["master.music.zen_mode"]),"master.ui":this.sanitize(["settings","audio","volume","master.ui"],e.settings.audio.volume["master.ui"]),"master.ui.click":this.sanitize(["settings","audio","volume","master.ui.click"],e.settings.audio.volume["master.ui.click"]),"master.queue":this.sanitize(["settings","audio","volume","master.queue"],e.settings.audio.volume["master.queue"]),"master.queue.ores":this.sanitize(["settings","audio","volume","master.queue.ores"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":this.sanitize(["settings","audio","volume","master.queue.mention"],e.settings.audio.volume["master.queue.mention"]),"master.notification":this.sanitize(["settings","audio","volume","master.notification"],e.settings.audio.volume["master.notification"]),"master.notification.alert":this.sanitize(["settings","audio","volume","master.notification.alert"],e.settings.audio.volume["master.notification.alert"]),"master.notification.message":this.sanitize(["settings","audio","volume","master.notification.notice"],e.settings.audio.volume["master.notification.message"]),"master.notification.toast":this.sanitize(["settings","audio","volume","master.notification.toast"],e.settings.audio.volume["master.notification.toast"]),"master.action":this.sanitize(["settings","audio","volume","master.action"],e.settings.audio.volume["master.action"]),"master.action.default":this.sanitize(["settings","audio","volume","master.action.default"],e.settings.audio.volume["master.action.default"]),"master.action.failed":this.sanitize(["settings","audio","volume","master.action.failed"],e.settings.audio.volume["master.action.failed"]),"master.action.report":this.sanitize(["settings","audio","volume","master.action.report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["settings","audio","volume","master.action.block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["settings","audio","volume","master.action.protect"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["settings","zen_mode","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["settings","zen_mode","sound","enabled"],e.settings.zen_mode.sound.enabled)},music:{enabled:this.sanitize(["settings","zen_mode","music","enabled"],e.settings.zen_mode.music.enabled)},alerts:{enabled:this.sanitize(["settings","zen_mode","alerts","enabled"],e.settings.zen_mode.alerts.enabled)},messages:{enabled:this.sanitize(["settings","zen_mode","notices","enabled"],e.settings.zen_mode.messages.enabled)},toasts:{enabled:this.sanitize(["settings","zen_mode","toasts","enabled"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:this.sanitize(["settings","zen_mode","badges","enabled"],e.settings.zen_mode.badges.enabled)}},accessibility:{colorblind:e.settings.accessibility.colorblind,dyslexia:e.settings.accessibility.dyslexia,high_contrast:e.settings.accessibility.high_contrast,reduce_motion:e.settings.accessibility.reduce_motion},repeat_control_scripts:this.sanitize(["settings","repeat_control_scripts"],e.settings.repeat_control_scripts)},UI:{theme:{app:e.UI.theme.app,palette:this.sanitize(["UI","theme","palette"],e.UI.theme.palette,t=>["traffic","heat","natural","cool"][t]||e.UI.theme.palette)},queue:{width:this.sanitize(["UI","queue","width"],e.UI.queue.width)},details:{width:this.sanitize(["UI","details","width"],e.UI.details.width)}},control_scripts:this.sanitize(["control_scripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name||"if not"===e.name){var i,a;const r="if not"===e.name,o=()=>e.name=r?"if":"if not";switch("string"==typeof e.condition&&(e.condition={name:e.condition,params:{}}),null!==(a=(i=e.condition).params)&&void 0!==a||(i.params={}),e.condition.name){case"operatorNonAdmin":o();case"operatorAdmin":e.condition.name="account-admin";break;case"userIsHighlighted":e.condition.name="username-highlighted";break;case"userIsWhitelisted":e.condition.name="username-whitelisted";break;case"pageIsWhitelisted":e.condition.name="page-whitelisted";break;case"userIsAnon":o();case"userIsRegistered":e.codition.name="user-registered";break;case"userIsIP":e.condition.name="user-ip";break;case"userIsTemp":e.condition.name="user-temp";break;case"userHasEmptyTalkPage":e.condition.name="user-empty-talk";break;case"editIsMajor":o();case"editIsMinor":e.condition.name="edit-minor";break;case"editSizeNegative":e.condition.name="edit-size",e.condition.params={condition:"<",size:0};break;case"editSizePositive":e.condition.name="edit-size",e.condition.params={condition:">",size:0};break;case"editSizeLarge":e.condition.name="abs-edit-size",e.condition.params={condition:"≥",size:1e3};break;case"userEditCountLow":e.condition.name="user-edit-count",e.condition.params={condition:"<",count:10};break;case"userEditCountHigh":e.condition.name="user-edit-count",e.condition.params={condition:"≥",count:100};break;case"atFinalWarning":e.condition.name="user-final-warning";break;case"userNoWarnings":o();case"userHasWarnings":e.condition.name="user-has-warnings"}if(!(e.condition.name in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else{var r;switch(null!==(r=e.params)&&void 0!==r||(e.params={}),e.name){case"toggleZenMode":e.name="toggle-zen-mode";break;case"acceptFlaggedEdit":if(e.name="accept-pending-edit",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.reason,delete e.params.reason;break;case"rejectFlaggedEdit":if(e.name="reject-pending-edit",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.reason,delete e.params.reason;break;case"prevEdit":e.name="previous-item";break;case"nextEdit":e.name="next-item";break;case"deleteQueue":e.name="clear-queue";break;case"openRevertMenu":e.name="open-revert-menu";break;case"openWarnMenu":e.name="open-warn-menu";break;case"openUserPage":e.name="open-user-page";break;case"openUserTalk":e.name="open-user-talk";break;case"openUserContribs":e.name="open-user-contributions";break;case"openFilterLog":e.name="open-user-filter-log";break;case"openPage":e.name="open-page";break;case"openTalk":e.name="open-page-talk";break;case"openHistory":e.name="open-page-history";break;case"openRevision":e.name="open-revision";break;case"openDiff":e.name="open-diff";break;case"switchToRecentQueue":e.name="switch-to-recent-queue";break;case"switchToFlaggedQueue":e.name="switch-to-pending-queue";break;case"switchToUsersQueue":e.name="switch-to-users-queue";break;case"switchToWatchlistQueue":e.name="switch-to-watchlist-queue";break;case"watchPage":e.name="watch-page";break;case"unwatchPage":e.name="unwatch-page";break;case"whitelistUser":e.name="whitelist-user";break;case"whitelistPage":e.name="whitelist-page";break;case"unwhitelistUser":e.name="unwhitelist-user";break;case"unwhitelistPage":e.name="unwhitelist-page";break;case"highlightUser":e.name="highlight-user";break;case"highlightPage":e.name="highlight-page";break;case"unwhitelistUser":e.name="unhighlight-user";break;case"unwhitelistPage":e.name="unhighlight-page";break;case"thankUser":e.name="thank-user";break;case"warn":e.name="warn-user";break;case"rollback":if(e.name="rollback-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"rollbackGoodFaith":if(e.name="rollback-goodfaith-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"undo":if(e.name="undo-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"reportToAIV":if(e.name="report-user-to-aiv",!(0,o.isObject)(e.params))return!0;e.params.reason=e.params.reportMessage,delete e.params.reportMessage,e.params.summary=e.params.comment,delete e.params.comment;break;case"reportToUAA":if(e.name="report-user-to-uaa",!(0,o.isObject)(e.params))return!0;e.params.reason=e.params.reportMessage,delete e.params.reportMessage,e.params.summary=e.params.comment,delete e.params.comment;break;case"requestProtection":if(e.name="request-page-protection",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.comment,delete e.params.comment;break;case"welcome":e.name="welcome-user";break;case"toggleConsecutive":e.name="toggle-consecutive-edits";break;case"block":return this.loadedLogger.warn(`Skipping deprecated action 'block' in control script at ${[...n,s].join(" -> ")}.`),!1;case"protect":return this.loadedLogger.warn(`Skipping deprecated action 'protect' in control script at ${[...n,s].join(" -> ")}.`),!1;case"openSettings":return this.loadedLogger.warn(`Skipping deprecated action 'openSettings' in control script at ${[...n,s].join(" -> ")}.`),!1}}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:this.sanitize(["statistics","edits_reviewed","total"],e.statistics.edits_reviewed.total),thanked:this.sanitize(["statistics","edits_reviewed","thanked"],e.statistics.edits_reviewed.thanked)},recent_changes_reviewed:{total:this.sanitize(["statistics","recent_changes_reviewed","total"],e.statistics.recent_changes_reviewed.total)},pending_changes_reviewed:{total:this.sanitize(["statistics","pending_changes_reviewed","total"],e.statistics.pending_changes_reviewed.total),accepted:this.sanitize(["statistics","pending_changes_reviewed","accepted"],e.statistics.pending_changes_reviewed.accepted),rejected:this.sanitize(["statistics","pending_changes_reviewed","rejected"],e.statistics.pending_changes_reviewed.rejected)},watchlist_changes_reviewed:{total:this.sanitize(["statistics","watchlist_changes_reviewed","total"],e.statistics.watchlist_changes_reviewed.total)},users_reviewed:{total:this.sanitize(["statistics","users_reviewed","total"],e.statistics.users_reviewed.total)},abuselogs_reviewed:{total:e.statistics.abuselogs_reviewed.total},reverts_made:{total:this.sanitize(["statistics","reverts_made","total"],e.statistics.reverts_made.total),good_faith:this.sanitize(["statistics","reverts_made","good_faith"],e.statistics.reverts_made.good_faith),from_recent_changes:this.sanitize(["statistics","reverts_made","from_recent_changes"],e.statistics.reverts_made.from_recent_changes),from_pending_changes:this.sanitize(["statistics","reverts_made","from_pending_changes"],e.statistics.reverts_made.from_pending_changes),from_watchlist:this.sanitize(["statistics","reverts_made","from_watchlist"],e.statistics.reverts_made.from_watchlist),from_abuselogs:e.statistics.reverts_made.from_abuselogs,from_loaded_edits:this.sanitize(["statistics","reverts_made","from_loaded_edits"],e.statistics.reverts_made.from_loaded_edits)},users_welcomed:{total:this.sanitize(["statistics","users_welcomed","total"],e.statistics.users_welcomed.total)},warnings_issued:{total:this.sanitize(["statistics","warnings_issued","total"],e.statistics.warnings_issued.total),level_1:this.sanitize(["statistics","warnings_issued","level_1"],e.statistics.warnings_issued.level_1),level_2:this.sanitize(["statistics","warnings_issued","level_2"],e.statistics.warnings_issued.level_2),level_3:this.sanitize(["statistics","warnings_issued","level_3"],e.statistics.warnings_issued.level_3),level_4:this.sanitize(["statistics","warnings_issued","level_4"],e.statistics.warnings_issued.level_4),level_4im:this.sanitize(["statistics","warnings_issued","level_4im"],e.statistics.warnings_issued.level_4im)},reports_filed:{total:this.sanitize(["statistics","reports_filed","total"],e.statistics.reports_filed.total),AIV:this.sanitize(["statistics","reports_filed","AIV"],e.statistics.reports_filed.AIV),UAA:this.sanitize(["statistics","reports_filed","UAA"],e.statistics.reports_filed.UAA),RFPP:this.sanitize(["statistics","reports_filed","RFPP"],e.statistics.reports_filed.RFPP),global_blocks:e.statistics.reports_filed.global_blocks,global_locks:e.statistics.reports_filed.global_locks},watchlist:{watched:this.sanitize(["statistics","watchlist","watched"],e.statistics.watchlist.watched),unwatched:this.sanitize(["statistics","watchlist","unwatched"],e.statistics.watchlist.unwatched)},items_whitelisted:{total:this.sanitize(["statistics","items_whitelisted","total"],e.statistics.items_whitelisted.total),users:this.sanitize(["statistics","items_whitelisted","users"],e.statistics.items_whitelisted.users),pages:this.sanitize(["statistics","items_whitelisted","pages"],e.statistics.items_whitelisted.pages),tags:this.sanitize(["statistics","items_whitelisted","tags"],e.statistics.items_whitelisted.tags)},items_highlighted:{total:this.sanitize(["statistics","items_highlighted","total"],e.statistics.items_highlighted.total),users:this.sanitize(["statistics","items_highlighted","users"],e.statistics.items_highlighted.users),pages:this.sanitize(["statistics","items_highlighted","pages"],e.statistics.items_highlighted.pages),tags:this.sanitize(["statistics","items_highlighted","tags"],e.statistics.items_highlighted.tags)},blocks_issued:{total:this.sanitize(["statistics","blocks_issued","total"],e.statistics.blocks_issued.total)},pages_protected:{total:this.sanitize(["statistics","pages_protected","total"],e.statistics.pages_protected.total)},actions_executed:{total:this.sanitize(["statistics","actions_executed","total"],e.statistics.actions_executed.total),successful:this.sanitize(["statistics","actions_executed","successful"],e.statistics.actions_executed.successful)},session_time:this.sanitize(["statistics","session_time"],e.statistics.session_time)},highlight:{users:this.sanitize(["highlight","users"],e.highlight.users),pages:this.sanitize(["highlight","pages"],e.highlight.pages),tags:this.sanitize(["highlight","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)},favorite:{warnings:this.sanitize(["favorite","warnings"],e.favorite.warnings),reverts:this.sanitize(["favorite","reverts"],e.favorite.reverts)}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),(null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const v=t.settings.namespaces;Array.isArray(v)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const f=t.settings.queue;this.restrictObject(f,"settings","queue");{const b=t.settings.queue.max_size;"number"==typeof b&&Number.isInteger(b)&&b>0||this.reset("settings","queue","max_size")}{const w=t.settings.queue.max_edits;"number"==typeof w&&Number.isInteger(w)&&w>0||this.reset("settings","queue","max_edits")}{const y=t.settings.queue.min_ores;"number"==typeof y&&y>=0&&y<=1||this.reset("settings","queue","min_ores")}{const x=t.settings.queue.ores_bias;"number"==typeof x&&x>=0&&x<=1||this.reset("settings","queue","ores_bias")}["recent","pending","users","watchlist","abuselog"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const k=t.settings.username_highlighting;this.restrictObject(k,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const _=t.settings.wikipedia_popups;this.restrictObject(_,"settings","wikipedia_popups");"boolean"!=typeof t.settings.wikipedia_popups.enabled&&this.reset("settings","wikipedia_popups","enabled")}{const S=t.settings.auto_welcome;this.restrictObject(S,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const q=t.settings.talk_page_thanks_for_temporary_users;this.restrictObject(q,"settings","talk_page_thanks_for_temporary_users");"boolean"!=typeof t.settings.talk_page_thanks_for_temporary_users.enabled&&this.reset("settings","talk_page_thanks_for_temporary_users","enabled")}{const E=t.settings.expiry;this.restrictObject(E,"settings","expiry");{const L=t.settings.expiry.watchlist;g.expiryRegex.test(L)||this.reset("settings","expiry","watchlist")}{const A=t.settings.expiry.whitelist;this.restrictObject(A,"settings","expiry","whitelist");{const T=t.settings.expiry.whitelist.users;g.expiryRegex.test(T)||this.reset("settings","expiry","whitelist","users")}{const C=t.settings.expiry.whitelist.pages;g.expiryRegex.test(C)||this.reset("settings","expiry","whitelist","pages")}{const z=t.settings.expiry.whitelist.tags;g.expiryRegex.test(z)||this.reset("settings","expiry","whitelist","tags")}}{const M=t.settings.expiry.highlight;this.restrictObject(M,"settings","expiry","highlight");{const $=t.settings.expiry.highlight.users;g.expiryRegex.test($)||this.reset("settings","expiry","highlight","users")}{const O=t.settings.expiry.highlight.pages;g.expiryRegex.test(O)||this.reset("settings","expiry","highlight","pages")}{const I=t.settings.expiry.highlight.tags;g.expiryRegex.test(I)||this.reset("settings","expiry","highlight","tags")}}}{const P=t.settings.auto_report;this.restrictObject(P,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const j=t.settings.auto_report.for;Array.isArray(j)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const W=t.settings.AI;this.restrictObject(W,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const D=t.settings.AI.edit_analysis;this.restrictObject(D,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const R=t.settings.AI.username_analysis;this.restrictObject(R,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const U=t.settings.AI.Ollama;this.restrictObject(U,"settings","AI","Ollama");{const N=t.settings.AI.Ollama.server;(0,o.isURL)(N)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const H=t.settings.audio;this.restrictObject(H,"settings","audio");{const F=t.settings.audio.ores_alert;this.restrictObject(F,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const V=t.settings.audio.ores_alert.threshold;"number"==typeof V&&V>=0&&V<=1||this.reset("settings","audio","ores_alert","threshold")}}{const B=t.settings.audio.volume;this.restrictObject(B,"settings","audio","volume");const G=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.message","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const Q of G){const Y=t.settings.audio.volume[Q];"number"==typeof Y&&Y>=0&&Y<=1||this.reset("settings","audio","volume",Q)}}}{const Z=t.settings.zen_mode;this.restrictObject(Z,"settings","zen_mode");"boolean"!=typeof Z.enabled&&this.reset("settings","zen_mode","enabled");{const K=t.settings.zen_mode.sound;this.restrictObject(K,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const X=t.settings.zen_mode.music;this.restrictObject(X,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const J=t.settings.zen_mode.alerts;this.restrictObject(J,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const ee=t.settings.zen_mode.messages;this.restrictObject(ee,"settings","zen_mode","messages");"boolean"!=typeof t.settings.zen_mode.messages.enabled&&this.reset("settings","zen_mode","messages","enabled")}{const te=t.settings.zen_mode.toasts;this.restrictObject(te,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const ne=t.settings.zen_mode.badges;this.restrictObject(ne,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}{const se=t.settings.accessibility;this.restrictObject(se,"settings","accessibility");"boolean"!=typeof t.settings.accessibility.colorblind&&this.reset("settings","accessibility","colorblind");"boolean"!=typeof t.settings.accessibility.dyslexia&&this.reset("settings","accessibility","dyslexia");"boolean"!=typeof t.settings.accessibility.high_contrast&&this.reset("settings","accessibility","high_contrast");"boolean"!=typeof t.settings.accessibility.reduce_motion&&this.reset("settings","accessibility","reduce_motion")}"boolean"!=typeof t.settings.repeat_control_scripts&&this.reset("settings","repeat_control_scripts")}{const ie=t.UI;this.restrictObject(ie,"UI");{const ae=t.UI.theme;this.restrictObject(ae,"UI","theme");{const re=t.UI.theme.app;["light","dark","auto"].includes(re)||this.reset("UI","theme","app")}t.UI.theme.palette in m.GUI.palettes||this.reset("UI","theme","palette")}{const oe=t.UI.queue;this.restrictObject(oe,"UI","queue");{const le=t.UI.queue.width;"string"==typeof le&&le.endsWith("vw")||this.reset("UI","queue","width");const de=parseFloat(le.slice(0,-2));"number"==typeof de&&!isNaN(de)&&de>=10&&de<=30||this.reset("UI","queue","width")}}{const ce=t.UI.details;this.restrictObject(ce,"UI","details");{const ue=t.UI.details.width;"string"==typeof ue&&ue.endsWith("vw")||this.reset("UI","details","width");const pe=parseFloat(ue.slice(0,-2));"number"==typeof pe&&!isNaN(pe)&&pe>=10&&pe<=30||this.reset("UI","details","width")}}}{const ge=t.control_scripts;function he(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name||"if not"===e.name){var i,a,r,l;const s=e.condition;if(!(s.name in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${s.name} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]);const o=(0,h.sortDependencies)(null!==(a=null===(r=(l=u.conditions[s.name]).parameters)||void 0===r?void 0:r.call(l))&&void 0!==a?a:[]),c=new Set;for(const e of o){const i={};for(const t of null!==(d=e.dependencies)&&void 0!==d?d:[]){var d;i[t]=s.params[t]}const a="function"==typeof e.default?e.default(i):e.default;if(e.id in s.params||"default"in e&&(this.loadedLogger.warn(`Resetting missing parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a),c.add(e.id),"default"in e)switch(e.type){case"choice":("function"==typeof e.options?e.options(i):e.options).includes(s.params[e.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"text":"string"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid text parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"boolean":"boolean"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"number":"number"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid number parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a)}}for(const e of Object.keys(s.params))c.has(e)||(this.loadedLogger.warn(`Removing invalid parameter [ ${e} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete s.params[e]);e.actions=he.call(this,e.actions,...t,n,"actions")}else{var p,m,v,f;if(!(e.name in c.events))return null!==(p=void this.loadedLogger.warn(`Removing invalid action [ ${e.name} ] at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`))&&void 0!==p&&p;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=(0,h.sortDependencies)(null!==(m=null===(v=(f=c.events[e.name]).parameters)||void 0===v?void 0:v.call(f))&&void 0!==m?m:[]),i=new Set;for(const a of s){const s={};for(const t of null!==(b=a.dependencies)&&void 0!==b?b:[]){var b;s[t]=e.params[t]}const r="function"==typeof a.default?a.default(s):a.default;if(a.id in e.params||"default"in a&&(this.loadedLogger.warn(`Resetting missing parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r),i.add(a.id),"default"in a)switch(a.type){case"choice":("function"==typeof a.options?a.options(s):a.options).includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"text":"string"!=typeof e.params[a.id]&&(this.loadedLogger.warn(`Resetting invalid text parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"boolean":"boolean"!=typeof e.params[a.id]&&(this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"duration":"string"==typeof e.params[a.id]&&g.expiryRegex.test(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid duration parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r)}}for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(ge)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>(0,p.validateShortcut)(e)),t.control_scripts[n].actions=he.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const me=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,ve=t.statistics;this.restrictObject(ve,"statistics");{const fe=t.statistics.edits_reviewed;this.restrictObject(fe,"statistics","edits_reviewed");me(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");me(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const be=t.statistics.recent_changes_reviewed;this.restrictObject(be,"statistics","recent_changes_reviewed");me(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const we=t.statistics.pending_changes_reviewed;this.restrictObject(we,"statistics","pending_changes_reviewed");me(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");me(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");me(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const ye=t.statistics.watchlist_changes_reviewed;this.restrictObject(ye,"statistics","watchlist_changes_reviewed");me(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const xe=t.statistics.users_reviewed;this.restrictObject(xe,"statistics","users_reviewed");me(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const ke=t.statistics.abuselogs_reviewed;this.restrictObject(ke,"statistics","abuselogs_reviewed");me(t.statistics.abuselogs_reviewed.total)||this.reset("statistics","abuselogs_reviewed","total")}{const _e=t.statistics.reverts_made;this.restrictObject(_e,"statistics","reverts_made");me(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");me(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");me(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");me(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");me(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");me(t.statistics.reverts_made.from_abuselogs)||this.reset("statistics","reverts_made","from_abuselogs");me(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const Se=t.statistics.users_welcomed;this.restrictObject(Se,"statistics","users_welcomed");me(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const qe=t.statistics.warnings_issued;this.restrictObject(qe,"statistics","warnings_issued");me(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");me(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");me(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");me(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");me(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");me(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const Ee=t.statistics.reports_filed;this.restrictObject(Ee,"statistics","reports_filed");me(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");me(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");me(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");me(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP");me(t.statistics.reports_filed.global_blocks)||this.reset("statistics","reports_filed","global_blocks");me(t.statistics.reports_filed.global_locks)||this.reset("statistics","reports_filed","global_locks")}{const Le=t.statistics.watchlist;this.restrictObject(Le,"statistics","watchlist");me(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");me(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const Ae=t.statistics.items_whitelisted;this.restrictObject(Ae,"statistics","items_whitelisted");me(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");me(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");me(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");me(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const Te=t.statistics.items_highlighted;this.restrictObject(Te,"statistics","items_highlighted");me(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");me(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");me(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");me(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const Ce=t.statistics.actions_executed;this.restrictObject(Ce,"statistics","actions_executed");me(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");me(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const ze=t.statistics.session_time;"number"==typeof ze&&ze>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Me=t.highlight;this.restrictObject(Me,"highlight");{const $e=t.highlight.users;Array.isArray($e)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const Oe=t.highlight.pages;Array.isArray(Oe)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const Ie=t.highlight.tags;Array.isArray(Ie)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const Pe=t.whitelist;this.restrictObject(Pe,"whitelist");{const je=t.whitelist.users;Array.isArray(je)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const We=t.whitelist.pages;Array.isArray(We)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const De=t.whitelist.tags;Array.isArray(De)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}{const Re=t.favorite;this.restrictObject(Re,"favorite");{const Ue=t.favorite.warnings;Array.isArray(Ue)||this.reset("favorite","warnings"),t.favorite.warnings=t.favorite.warnings.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite warning [ ${e} ] from stored data.`),t})}{const Ne=t.favorite.reverts;Array.isArray(Ne)||this.reset("favorite","reverts"),t.favorite.reverts=t.favorite.reverts.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite revert [ ${e} ] from stored data.`),t})}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=3,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},955(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.getWarningFromLookup=function(e){return a[e]},t.warningsLookup=t.warnings=t.warningTemplateColors=void 0;t.warningTemplateColors={0:"grey",1:"#4169e1",2:"#ff8c00",3:"#ff4500",4:"#b22222","4im":"#000000"};const n={0:"1",1:"2",2:"3",3:"4",4:"report","4im":"report"},s=t.warnings={Vandalism:{title:"Vandalism",icon:"fas fa-skull-crossbones",description:"Warnings for different types of vandalism.",warnings:[{reportable:!0,queueType:["edit"],title:"Vandalism",name:"vandalism",icon:"fas fa-skull-crossbones",description:"Warning for general vandalism.",summary:"vandalism",auto:n,templates:[{name:"1",template:"uw-vandalism1"},{name:"2",template:"uw-vandalism2"},{name:"3",template:"uw-vandalism3"},{name:"4",template:"uw-vandalism4"},{name:"4im",template:"uw-vandalism4im"}]},{reportable:!0,queueType:["edit"],title:"Subtle vandalism",name:"subtle vandalism",icon:"fas fa-user-secret",description:"Warning for subtle vandalism.",summary:"subtle vandalism",auto:n,templates:[{name:"1",template:"uw-subtle1"},{name:"2",template:"uw-subtle2"},{name:"3",template:"uw-subtle3"},{name:"4",template:"uw-subtle4"}]},{reportable:!0,queueType:["edit"],title:"Image vandalism",name:"image vandalism",icon:"fas fa-image",description:"Warning for image vandalism.",summary:"image vandalism",auto:n,templates:[{name:"1",template:"uw-image1"},{name:"2",template:"uw-image2"},{name:"3",template:"uw-image3"},{name:"4",template:"uw-image4"},{name:"4im",template:"uw-image4im"}]},{reportable:!0,queueType:["edit"],title:"Sandbox",name:"[[WP:BADSAND|inappropriate]] sandbox use",icon:"fas fa-vial",description:"Warning for vandalism, libelous, or defamatory content added to sandbox",summary:"[[WP:BADSAND|inappropriate]] sandbox use",auto:n,templates:[{name:"1",template:"uw-sandbox1"},{name:"2",template:"uw-sandbox2"},{name:"3",template:"uw-sandbox3"},{name:"4",template:"uw-sandbox4"},{name:"4im",template:"uw-sandbox4im"}]},{reportable:!0,queueType:["edit"],title:"Deliberate errors",name:"deliberate errors",icon:"fas fa-bug",description:"Adding deliberate errors to articles.",summary:"deliberate errors",auto:n,templates:[{name:"1",template:"uw-error1"},{name:"2",template:"uw-error2"},{name:"3",template:"uw-error3"},{name:"4",template:"uw-error4"}]}]},Disruption:{title:"Disruption",icon:"fas fa-exclamation",description:"Warnings for different types of disruptive behavior.",warnings:[{reportable:!0,queueType:["edit"],title:"Disruptive editing",name:"[[WP:DE|disruptive editing]]",icon:"fas fa-exclamation",description:"Default warning for making disruptive edits but may be good faith.",summary:"[[WP:DE|disruptive editing]]",auto:n,templates:[{name:"1",template:"uw-disruptive1"},{name:"2",template:"uw-disruptive2"},{name:"3",template:"uw-disruptive3"},{name:"4",template:"uw-generic4",generic:"''Disruptive editing. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Editing tests",name:"editing tests",icon:"fas fa-flask",description:"Making test edits on live articles.",summary:"test edits",auto:n,templates:[{name:"1",template:"uw-test1"},{name:"2",template:"uw-test2"},{name:"3",template:"uw-test3"},{name:"4",template:"uw-generic4",generic:"''Test edits. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Commentary",name:"commentary",icon:"fas fa-comment-alt",description:"Adding opinion or commentary to articles.",summary:"commentary / talking in article",auto:n,templates:[{name:"1",template:"uw-talkinarticle1"},{name:"2",template:"uw-talkinarticle2"},{name:"3",template:"uw-talkinarticle3"},{name:"4",template:"uw-generic4",generic:"''Adding commentary to articles. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Inappropriate jokes",name:"inappropriate humor",icon:"fas fa-grin-squint",description:"Adding inappropriate humor to an article.",summary:"inappropriate humor",auto:n,templates:[{name:"1",template:"uw-joke1"},{name:"2",template:"uw-joke2"},{name:"3",template:"uw-joke3"},{name:"4",template:"uw-joke4"},{name:"4im",template:"uw-joke4im"}]},{reportable:!0,queueType:["edit"],title:"Deleting",name:"unexplained deletion",icon:"fas fa-trash",description:"Used when a user does not explain deletion of part of an article.",summary:"unexplained deletion",auto:n,templates:[{name:"1",template:"uw-delete1"},{name:"2",template:"uw-delete2"},{name:"3",template:"uw-delete3"},{name:"4",template:"uw-delete4"},{name:"4im",template:"uw-delete4im"}]}]},"Content Issues":{title:"Content Issues",icon:"fas fa-file-alt",description:"Warnings for different types of content issues.",warnings:[{reportable:!0,queueType:["edit"],title:"Unsourced",name:"unsourced changes",icon:"fas fa-question",description:"Warning for unsourced content.",summary:"unsourced changes",auto:n,templates:[{name:"1",template:"uw-unsourced1"},{name:"2",template:"uw-unsourced2"},{name:"3",template:"uw-unsourced3"},{name:"4",template:"uw-unsourced4"}]},{reportable:!0,queueType:["edit"],title:"Unsourced (BLP)",name:"unsourced [[WP:BLP|biographies of living persons']] changes",icon:"fas fa-person-circle-question",description:"Warning for unsourced BLP content.",summary:"unsourced [[WP:BLP|biographies of living persons']] changes",auto:n,templates:[{name:"1",template:"uw-biog1"},{name:"2",template:"uw-biog2"},{name:"3",template:"uw-biog3"},{name:"4",template:"uw-biog4"},{name:"4im",template:"uw-biog4im"}]},{reportable:!0,queueType:["edit"],title:"Unsourced genre",name:"unsourced genre changes",icon:"fas fa-music",description:"Warning for unsourced genre changes.",summary:"unsourced genre changes",auto:n,templates:[{name:"1",template:"uw-genre1"},{name:"2",template:"uw-genre2"},{name:"3",template:"uw-genre3"},{name:"4",template:"uw-genre4"}]},{reportable:!0,queueType:["edit"],title:"Original research",name:"[[WP:OR|original research]]",icon:"fas fa-lightbulb",description:"Adding original research or synthesis.",summary:"[[WP:OR|original research]]",auto:n,templates:[{name:"1",template:"uw-nor1"},{name:"2",template:"uw-nor2"},{name:"3",template:"uw-nor3"},{name:"4",template:"uw-nor4"}]},{reportable:!0,queueType:["edit"],title:"POV",name:"[[WP:NPOV|non-neutral changes]]",icon:"fas fa-balance-scale-left",description:"Adding content which violates the neutral point of view policy.",summary:"[[WP:NPOV|non-neutral changes]]",auto:n,templates:[{name:"1",template:"uw-npov1"},{name:"2",template:"uw-npov2"},{name:"3",template:"uw-npov3"},{name:"4",template:"uw-npov4"}]},{reportable:!0,queueType:["edit"],title:"Censoring",name:"[[WP:NOTCENSORED|censoring content]]",icon:"fas fa-ban",description:"Censoring topically-relevant content.",summary:"[[WP:NOTCENSORED|censoring content]]",auto:n,templates:[{name:"1",template:"uw-notcensored1"},{name:"2",template:"uw-notcensored2"},{name:"3",template:"uw-notcensored3"},{name:"4",template:"uw-notcensored4"}]},{reportable:!0,queueType:["edit"],title:"AI-generated",name:"[[WP:LLM|AI-generated content]]",icon:"fas fa-robot",description:"Adding AI-generated content.",summary:"[[WP:LLM|AI-generated content]]",auto:n,templates:[{name:"1",template:"uw-ai1"},{name:"2",template:"uw-ai2"},{name:"3",template:"uw-ai3"},{name:"4",template:"uw-ai4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==0}},{reportable:!0,queueType:["edit"],title:"AI-generated (talk)",name:"[[WP:LLM|AI-generated content]] in a discussion",icon:"fas fa-robot",description:"Writing an AI-generated comment.",summary:"[[WP:LLM|AI-generated content]] in a discussion",auto:n,templates:[{name:"1",template:"uw-aitalk1"},{name:"2",template:"uw-aitalk2"},{name:"3",template:"uw-aitalk3"},{name:"4",template:"uw-aitalk4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==1}},{reportable:!0,queueType:["edit"],title:"MOS violation",name:"[[WP:MOS|manual of style]] violation",icon:"fas fa-spell-check",description:"Not following the Manual of Style.",summary:"[[WP:MOS|manual of style]] violation",auto:n,templates:[{name:"1",template:"uw-mos1"},{name:"2",template:"uw-mos2"},{name:"3",template:"uw-mos3"},{name:"4",template:"uw-mos4"}]},{reportable:!1,queueType:["edit"],title:"English variant",name:"[[WP:ENGVAR|different English variant]]",icon:"fas fa-globe",description:"Content added in a different English variant than the rest of the article.",summary:"[[WP:ENGVAR|different English variant]]",auto:"notice",templates:[{name:"notice",template:"uw-engvar"}]},{reportable:!1,queueType:["edit"],title:"Not English",name:"non-English content",icon:"fas fa-language",description:"Content added in a language other than English.",summary:"non-English content",auto:"notice",templates:[{name:"notice",template:"uw-lang-noteng"}]}]},Conduct:{title:"Conduct",icon:"fas fa-user-shield",description:"Warnings for different types of conduct issues.",warnings:[{reportable:!0,queueType:["edit"],title:"Personal attacks",name:"[[WP:NPA|personal attacks]]",icon:"fas fa-bomb",description:"Personal attacks towards another user.",summary:"[[WP:NPA|personal attacks]]",auto:n,templates:[{name:"1",template:"uw-npa1"},{name:"2",template:"uw-npa2"},{name:"3",template:"uw-npa3"},{name:"4",template:"uw-npa4"},{name:"4im",template:"uw-npa4im"}]},{reportable:!0,queueType:["edit"],title:"Harassment",name:"[[WP:HARASS|harassment]]",icon:"fas fa-shield-alt",description:"Harassment of another user.",summary:"[[WP:HARASS|harassment]] of another user",auto:n,templates:[{name:"1",template:"uw-harass1"},{name:"2",template:"uw-harass2"},{name:"3",template:"uw-harass3"},{name:"4",template:"uw-harass4"},{name:"4im",template:"uw-harass4im"}]},{reportable:!0,queueType:["edit"],title:"TPO",name:"[[WP:TPO|removing or editing]] others' posts",icon:"fas fa-hand-paper",description:"Removing or editing others' posts.",summary:"[[WP:TPO|removing or editing]] others' posts",auto:n,templates:[{name:"1",template:"uw-tpo1"},{name:"2",template:"uw-tpo2"},{name:"3",template:"uw-tpo3"},{name:"4",template:"uw-tpo4"},{name:"4im",template:"uw-tpo4im"}]},{reportable:!0,queueType:["edit"],title:"Chatting",name:"inappropriate use of article talk pages",icon:"fas fa-comments",description:"Using article talk pages for inappropriate discussion.",summary:"inappropriate use of article talk pages",auto:n,templates:[{name:"1",template:"uw-chat1"},{name:"2",template:"uw-chat2"},{name:"3",template:"uw-chat3"},{name:"4",template:"uw-chat4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==1}},{reportable:!0,queueType:["edit"],title:"Owning",name:"assuming [[WP:OWN|ownership of articles]]",icon:"fas fa-user-shield",description:"Assuming ownership of articles.",summary:"assuming [[WP:OWN|ownership of articles]]",auto:n,templates:[{name:"1",template:"uw-own1"},{name:"2",template:"uw-own2"},{name:"3",template:"uw-own3"},{name:"4",template:"uw-own4"}]},{reportable:!0,queueType:["edit"],title:"AfD removal",name:"removing AfD templates or comments",icon:"fas fa-gavel",description:"Removing AfD templates or other users' comments from AfD discussions.",summary:"removing AfD templates or comments",auto:n,templates:[{name:"1",template:"uw-afd1"},{name:"2",template:"uw-afd2"},{name:"3",template:"uw-afd3"},{name:"4",template:"uw-afd4"}]},{reportable:!1,queueType:["edit"],title:"Edit warring",name:"[[WP:EW|edit warring]]",icon:"fas fa-jet-fighter",description:"Engaging in edit warring.",summary:"[[WP:EW|edit warring]]",auto(e){var t;return+(null==e||null===(t=e.user)||void 0===t?void 0:t.edits)<500?"notice":"warning"},templates:[{name:"notice",template:"uw-ew-soft",color:"grey"},{name:"warning",template:"uw-ew",color:"#ff4500"}]},{reportable:!0,queueType:["edit"],title:"Gaming the system",name:"[[WP:GAME|gaming the system]]",icon:"fas fa-chess-knight",description:"Attempting to game Wikipedia's policies or guidelines.",summary:"[[WP:GAME|gaming the system]]",auto:n,templates:[{name:"1",template:"uw-gaming1"},{name:"2",template:"uw-gaming2"},{name:"3",template:"uw-gaming3"},{name:"4",template:"uw-gaming4"},{name:"4im",template:"uw-gaming4im"}]}]},Promotional:{title:"Promotional",icon:"fas fa-bullhorn",description:"Warnings for promotional content.",warnings:[{reportable:!0,queueType:["edit"],title:"Advertising",name:"[[WP:PROMO|advertising or promotion]]",icon:"fas fa-ad",description:"Adding advertising or promotional content.",summary:"[[WP:PROMO|advertising or promotion]]",auto:n,templates:[{name:"1",template:"uw-advert1"},{name:"2",template:"uw-advert2"},{name:"3",template:"uw-advert3"},{name:"4",template:"uw-advert4"},{name:"4im",template:"uw-advert4im"}]},{reportable:!0,queueType:["edit"],title:"Spam links",name:"adding [[WP:ELNO|inappropriate links]]",icon:"fas fa-link",description:"Adding spam or promotional links.",summary:"adding [[WP:ELNO|inappropriate links]]",auto:n,templates:[{name:"1",template:"uw-spam1"},{name:"2",template:"uw-spam2"},{name:"3",template:"uw-spam3"},{name:"4",template:"uw-spam4"},{name:"4im",template:"uw-spam4im"}]},{reportable:!1,queueType:["edit"],title:"COI Edit",name:"editing with a [[WP:COI|conflict of interest]]",icon:"fas fa-user-tie",description:"Editing with a conflict of interest.",summary:"editing with a [[WP:COI|conflict of interest]]",auto:"notice",templates:[{name:"notice",template:"uw-coi"},{name:"warning",template:"uw-coi-warn"},{name:"username",template:"uw-coi-username"}]},{reportable:!1,queueType:["logevent"],title:"COI Log",name:"apparent [[WP:COI|conflict of interest]]",icon:"fas fa-user-tie",description:"Apparent conflict of interest.",summary:"apparent [[WP:COI|conflict of interest]]",auto:"username",templates:[{name:"username",template:"uw-coi-username"}]}]},"Abuse Log":{title:"Abuse Log",icon:"fas fa-shield-virus",description:"Warnings for triggering edit filters.",warnings:[{reportable:!0,queueType:["abuselog"],title:"Attempt",name:"triggering an edit filter",icon:"fas fa-vial",description:"Triggering an edit filter.",auto:n,templates:[{name:"1",template:"uw-attempt1"},{name:"2",template:"uw-attempt2"},{name:"3",template:"uw-attempt3"},{name:"4",template:"uw-attempt4"},{name:"4im",template:"uw-attempt4im"}],show:e=>!Boolean(null==e?void 0:e.revid)}]},"Edit Summary":{title:"Edit Summary",icon:"fas fa-pen-alt",description:"Warnings for inappropriate edit summaries.",warnings:[{reportable:!1,queueType:["edit"],title:"No edit summary",name:"no [[WP:ES|edit summary]] provided",icon:"fas fa-pen-nib",description:"Making an edit without providing an edit summary.",summary:"no [[WP:ES|edit summary]] provided",auto(e){var t;return+(null==e||null===(t=e.user)||void 0===t?void 0:t.edits)<500?"newcomer":"experienced"},templates:[{name:"notice",template:"uw-es"},{name:"experienced",template:"uw-es2"}]},{reportable:!0,queueType:["edit","logevent","abuselog"],title:"Inappropriate edit summary",name:"inappropriate [[WP:ES|edit summary]]",icon:"fas fa-pen-alt",description:"Using an inappropriate edit summary.",summary:"inappropriate [[WP:ES|edit summary]]",auto:n,templates:[{name:"1",template:"uw-bes1"},{name:"2",template:"uw-bes2"},{name:"3",template:"uw-bes3"},{name:"4",template:"uw-bes4"},{name:"4im",template:"uw-bes4im"}]},{reportable:!0,queueType:["edit","logevent","abuselog"],title:"Misleading edit summary",name:"misleading [[WP:ES|edit summary]]",icon:"fas fa-mask",description:"Using a misleading edit summary.",summary:"misleading [[WP:ES|edit summary]]",auto:n,templates:[{name:"1",template:"uw-mislead1"},{name:"2",template:"uw-mislead2"},{name:"3",template:"uw-mislead3"},{name:"4",template:"uw-generic4",generic:"''Misleading edit summary. ([[WP:WikiShield|WS]])''"}]},{reportable:!1,queueType:["edit","abuselog"],title:"Minor edit abuse",name:"improper use of [[WP:ME|minor edit]] checkbox",icon:"fas fa-minus",description:"Non-minor edit marked as minor",summary:"improper use of [[WP:ME|minor edit]] checkbox",auto:"notice",templates:[{name:"notice",template:"uw-minor"}]}]}},i={};for(const[e,t]of Object.entries(s)){const e=t.warnings.length;for(let n=0;n<e;n++){const e=t.warnings[n];i[e.title]=e}}const a=t.warningsLookup=i},863(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.welcomes=void 0;const n=t.welcomes={Auto:{title:"Auto",template:e=>{}},Default:{title:"Default",template:"Welcome",sign:!0},Basic:{title:"Basic",template:"W-basic",sign:!1},"Non-Latin":{title:"Non-Latin",template:"Welcome-non-latin",sign:!0},"Vandalism fighter":{title:"Vandalism fighter",template:"Welcome-vandalism fighter",sign:!1},Personal:{title:"Personal",template:"Welcome-personal",sign:!0},Cookie:{title:"Cookie",template:"Welcome cookie",sign:!0},Kitten:{title:"Kitten",template:"Welcome kitten",sign:!1},Graphical:{title:"Graphical",template:"W-graphical",sign:!1},Screen:{title:"Screen",template:"W-screen",sign:!1},Autobiography:{title:"Autobiography",template:"Welcome-auto",sign:!0},COI:{title:"COI",template:"Welcome-COI",sign:!0}};n.Auto.template=e=>!n["Non-Latin"].hide&&/[^\u0000-\u007F]/.test(e.name)?"Non-Latin":"Default"},4153(e,t,n){var s=n(8878);void 0===window.electron?(window.isElectron=!1,window.electron={mwapiLoader:()=>{window.dispatchEvent(new CustomEvent("mwapi-loaded",{detail:{server:window.location.host,username:mw.user.getName(),pendingChangesServers:s.MediaWikiAPI.pendingChangesServer,dev:!1}}))},mwapiLoaded:e=>window.addEventListener("mwapi-loaded",t=>{const{server:n,username:s,pendingChangesServers:i,dev:a}=t.detail;e(n,s,i,a)}),mwapi:()=>Promise.reject(new Error("Not running in Electron environment")),menuEnabler:()=>{},setBadgeCount:()=>{},sendNotification:()=>Promise.reject(new Error("Not running in Electron environment")),localStorage:{get:e=>localStorage.getItem(e),set:(e,t)=>localStorage.setItem(e,t),delete:e=>localStorage.removeItem(e)},copyToClipboard:async e=>{if(navigator.clipboard&&navigator.clipboard.writeText)await navigator.clipboard.writeText(e);else{const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}},log:e=>console.debug(e),info:e=>console.info(e),warn:e=>console.warn(e),error:e=>console.error(e),errorbox:(e,t)=>alert(`${e}\n\n${t}`),closePopup:e=>e.close(),openExternal:e=>window.open(e,"_blank"),openInBrowser:async e=>{const t=.8*window.screen.availWidth,n=.8*window.screen.availHeight,s=window.screenX+(window.outerWidth-t)/2,i=window.screenY+(window.outerHeight-n)/2,a=window.open(e,"myPopup",`width=${t},height=${n},left=${s},top=${i},resizable=false,scrollbars=true,menubar=false,toolbar=false,location=false,status=false`);return a.focus(),a.addEventListener("beforeunload",()=>{a.closed&&window.dispatchEvent(new CustomEvent("popup-closed",{detail:a}))}),a},onPopupClosed:e=>window.addEventListener("popup-closed",t=>e(t.detail)),onBeforeunload:()=>{},unloaded:()=>{},saveAccount:()=>{},disable:(e,t)=>{alert(`${e}\n\n${t}`),location.reload()}}):window.isElectron=!0,document.querySelectorAll("[data-electron]").forEach(e=>{"false"===e.dataset.electron&&window.isElectron?e.remove():"true"!==e.dataset.electron||window.isElectron||e.remove()})},7411(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{constructor(){super(),e(this,"handleDragStart",(e,t)=>{this.draggedIndex=e,this.placeholderIndex=e,t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e),requestAnimationFrame(()=>{this.updateDragState()})}),e(this,"handleDragOver",(e,t)=>{if(t.preventDefault(),null===this.draggedIndex||e===this.placeholderIndex)return;const n=[...this.items],s=n[this.draggedIndex];n.splice(this.draggedIndex,1),n.splice(e,0,s),this.items=n,this.draggedIndex=e,this.placeholderIndex=e,this.render()}),e(this,"handleDragEnd",()=>{this.dispatchEvent(new CustomEvent("reorder",{detail:{keys:this.items.map(e=>e.key)},bubbles:!0})),this.draggedIndex=null,this.placeholderIndex=null,this.updateDragState()}),this.items=[],this.draggedIndex=null,this.placeholderIndex=null,this.itemWrappers=[]}connectedCallback(){this.className="draggable-order-list",this.syncItemsFromChildren()}syncItemsFromChildren(){const e=Array.from(this.children);this.items=e.map((e,t)=>({child:e,key:e.dataset.key||e.getAttribute("key")||t})),this.render()}addItem(e,t){this.items.push({child:e,key:t||this.items.length}),this.render()}clearItems(){this.items=[],this.render()}updateDragState(){const e=null!==this.draggedIndex;this.classList.toggle("is-dragging",e),this.itemWrappers.forEach((e,t)=>{e.classList.toggle("dragging",this.draggedIndex===t)})}render(){this.innerHTML="",this.itemWrappers=[],this.items.forEach((e,t)=>{const n=document.createElement("div");n.className="draggable-order-item-wrapper",n.draggable=!0,n.dataset.key=e.key,n.addEventListener("dragstart",e=>this.handleDragStart(t,e)),n.addEventListener("dragover",e=>this.handleDragOver(t,e)),n.addEventListener("dragend",this.handleDragEnd),n.appendChild(e.child.cloneNode?e.child.cloneNode(!0):e.child),this.appendChild(n),this.itemWrappers.push(n)}),this.updateDragState()}}class n extends HTMLElement{static get observedAttributes(){return["name","enabled"]}constructor(){super(),e(this,"handleToggle",e=>{e.stopPropagation(),this._enabled=!this._enabled,this.updateEnabledState(),this.dispatchEvent(new CustomEvent("toggle",{detail:{enabled:this._enabled},bubbles:!0}))}),this._name="",this._enabled=!0}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"name":this._name=n||"",this.nameSpan&&(this.nameSpan.textContent=this._name);break;case"enabled":this._enabled="false"!==n&&"0"!==n,this.updateEnabledState()}}get name(){return this._name}set name(e){this.setAttribute("name",e)}get enabled(){return this._enabled}set enabled(e){this.setAttribute("enabled",e)}updateEnabledState(){this.classList.toggle("disabled",!this._enabled),this.toggle&&(this.toggle.title=this._enabled?"Click to disable":"Click to enable")}render(){this.className="draggable-order-item",this.innerHTML="",this.nameSpan=document.createElement("span"),this.nameSpan.className="draggable-order-item-name",this.nameSpan.textContent=this._name,this.toggle=document.createElement("div"),this.toggle.className="draggable-order-item-toggle",this.toggle.addEventListener("click",this.handleToggle),this.appendChild(this.nameSpan),this.appendChild(this.toggle),this.updateEnabledState()}}customElements.define("draggable-order-list",t),customElements.define("draggable-order-item",n)},7732(e,t,n){var s=n(3241);class i extends HTMLElement{constructor(){super(),this.duration={years:0,months:0,weeks:0,days:0,hours:0,minutes:0,seconds:0},this.isInfinite=!1}connectedCallback(){this.render(),this.attachEventListeners()}render(){this.innerHTML=`\n <label class="infinity-label">\n <span>Infinite Duration</span>\n </label>\n <div class="duration-inputs">\n ${[{key:"years",label:"Years"},{key:"months",label:"Months"},{key:"weeks",label:"Weeks"},{key:"days",label:"Days"},{key:"hours",label:"Hours"},{key:"minutes",label:"Minutes"},{key:"seconds",label:"Seconds"}].map(e=>`\n <label>\n <span>${e.label}</span>\n <input\n type="number"\n min="0"\n data-unit="${e.key}"\n value="0"\n step="1"\n placeholder="0"\n />\n </label>\n `).join("")}\n </div>\n `}attachEventListeners(){const e=this.querySelector(".infinity-label");e.addEventListener("click",()=>{this.isInfinite=!this.isInfinite,e.classList.toggle("selected",this.isInfinite),this.dispatchChangeEvent()}),this.querySelectorAll('input[type="number"]').forEach(e=>{e.addEventListener("input",e=>{const t=e.target.dataset.unit;this.duration[t]=parseInt(e.target.value,10)||0,this.dispatchChangeEvent()})})}dispatchChangeEvent(){this.dispatchEvent(new CustomEvent("change",{detail:this.getDurationString(),bubbles:!0}))}get value(){return this.getDurationString()}getDurationString(){if(this.isInfinite)return"infinite";let e="";const t={years:"Y",months:"M",weeks:"W",days:"D",hours:"H",minutes:"M",seconds:"S"};for(const[n,s]of Object.entries(this.duration))s>0&&(e+=`${s}${t[n]}`);return e||"0S"}set value(e){if("infinite"===e||"infinity"===e||"∞"===e){this.isInfinite=!0;const e=this.querySelector(".infinity-label");return void(e&&e.classList.add("selected"))}this.isInfinite=!1;const t=this.querySelector(".infinity-label");t&&t.classList.remove("selected");const n=s.expiryRegex.exec(e);if(n)for(const e of Object.keys(this.duration)){const t=n.groups[e];this.duration[e]=t?parseInt(t,10):0;const s=this.querySelector(`input[data-unit="${e}"]`);s&&(s.value=this.duration[e])}}}customElements.define("duration-input",i)},1914(e,t,n){n(7732),n(2784),n(5155),n(7411),n(1731)},5155(e,t){function n(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.NumericInput=void 0;class s extends HTMLElement{static get observedAttributes(){return["value","min","max","step"]}constructor(){super(),n(this,"handleMinus",()=>{const e=Number(this.inputValue),t=Math.round(100*Math.max(e-this.step,this.min))/100;this.updateValue(t)}),n(this,"handlePlus",()=>{const e=Number(this.inputValue),t=Math.round(100*Math.min(e+this.step,this.max))/100;this.updateValue(t)}),n(this,"handleInputChange",()=>{const e=this.input.value;if(isNaN(Number(e)))return void(this.input.value=this.inputValue);let t=Math.round(100*Math.min(Math.max(Number(e),this.min),this.max))/100;t=this.step>=1?Math.round(t):t,this.updateValue(t)}),n(this,"handleKeyUp",e=>{"enter"===e.key.toLowerCase()&&(this.handleInputChange(),e.target.blur())}),n(this,"handleInput",e=>{this.inputValue=e.target.value}),this.inputValue=0,this._min=-1/0,this._max=1/0,this._step=1}connectedCallback(){this.render(),this.setupEventListeners()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"value":this.inputValue=Number(n)||0,this.input&&(this.input.value=this.inputValue);break;case"min":this._min=Number(null!=n?n:-1/0);break;case"max":this._max=Number(null!=n?n:1/0);break;case"step":this._step=Number(null!=n?n:1)}}get value(){return this.inputValue}set value(e){this.setAttribute("value",e)}get min(){return this._min}get max(){return this._max}get step(){return this._step}updateValue(e){this.inputValue=e,this.input.value=e,this.dispatchEvent(new CustomEvent("change",{detail:{value:e},bubbles:!0}))}setupEventListeners(){this.minusBtn.addEventListener("click",this.handleMinus),this.plusBtn.addEventListener("click",this.handlePlus),this.input.addEventListener("input",this.handleInput),this.input.addEventListener("blur",this.handleInputChange),this.input.addEventListener("keyup",this.handleKeyUp),this.input.addEventListener("wheel",e=>{e.preventDefault(),e.deltaY<0?this.handlePlus():e.deltaY>0&&this.handleMinus()})}render(){this.className="numeric-input-container",this.minusBtn=document.createElement("span"),this.minusBtn.className="fa fa-minus numeric-input-button",this.input=document.createElement("input"),this.input.type="text",this.input.className="numeric-input",this.input.value=this.inputValue,this.input.autocomplete="off",this.plusBtn=document.createElement("span"),this.plusBtn.className="fa fa-plus numeric-input-button",this.appendChild(this.minusBtn),this.appendChild(this.input),this.appendChild(this.plusBtn)}}t.NumericInput=s,customElements.define("numeric-input",s)},2784(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{static get observedAttributes(){return["value","checked"]}constructor(){super(),e(this,"handleClick",()=>{this._value=!this._value,this.updateState(),this.dispatchEvent(new CustomEvent("change",{detail:{value:this._value,checked:this._value},bubbles:!0}))}),this._value=!1}connectedCallback(){this.render(),this.updateState()}attributeChangedCallback(e,t,n){t!==n&&("value"!==e&&"checked"!==e||(this._value="true"===n||"1"===n||""===n,this.updateState()))}get value(){return this._value}set value(e){this._value=!!e,this.setAttribute("value",this._value),this.updateState()}get checked(){return this._value}set checked(e){this.value=e}updateState(){this.classList.toggle("active",this._value)}render(){this.classList.add("settings-toggle"),this.innerHTML="";const e=document.createElement("div");e.className="toggle-switch";const t=document.createElement("div");t.className="toggle-slider",e.appendChild(t),this.appendChild(e),this.addEventListener("click",this.handleClick)}}customElements.define("toggle-input",t)},1731(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{static get observedAttributes(){return["title","description","value"]}constructor(){super(),e(this,"handleVolumeChange",e=>{const t=Math.max(0,Math.min(1,parseFloat(e.target.value)));this._value=t,this.slider.value=t,this.input.value=t.toFixed(2),this.dispatchEvent(new CustomEvent("change",{detail:{value:t},bubbles:!0}))}),this._title="",this._description="",this._value=.5,this._sound="",this._preview=null}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"title":this._title=n||"",this.titleEl&&(this.titleEl.textContent=this._title);break;case"description":this._description=n||"",this.descEl&&(this.descEl.textContent=this._description);break;case"value":this._value=Math.max(0,Math.min(1,parseFloat(n))),this.slider&&(this.slider.value=this._value),this.input&&(this.input.value=this._value.toFixed(2))}}get title(){return this._title}set title(e){this.setAttribute("title",e)}get value(){return this._value}set value(e){this.setAttribute("value",e)}setPreview(e,t){this._preview={audio:e,path:t},this.render()}render(){this.className="volume-control",this.innerHTML="";const e=document.createElement("div");e.className="volume-control-header";const t=document.createElement("div");if(t.className="volume-control-info",this.titleEl=document.createElement("div"),this.titleEl.className="volume-control-title",this.titleEl.textContent=this._title,this.descEl=document.createElement("div"),this.descEl.className="volume-control-desc",this.descEl.textContent=this._description,t.appendChild(this.titleEl),t.appendChild(this.descEl),e.appendChild(t),this._preview){const t=document.createElement("button");t.className="volume-control-preview",t.title="Preview sound",t.addEventListener("click",()=>{if(t.classList.contains("playing"))return;t.classList.add("playing");const e=t.querySelector("i");e&&(e.className="fa fa-stop");const n=new AbortController;t.onclick=()=>n.abort(),this._preview.audio.stopPreviews(),this._preview.audio.playSound(this._preview.path,n.signal,!0).finally(()=>{t.onclick=null,t.classList.remove("playing"),e&&(e.className="fa fa-play")})});const n=document.createElement("i");n.className="fa fa-play",t.appendChild(n),e.appendChild(t)}this.appendChild(e);const n=document.createElement("div");n.className="volume-control-slider-container",this.slider=document.createElement("input"),this.slider.type="range",this.slider.className="volume-control-slider",this.slider.min="0",this.slider.max="1",this.slider.step="0.01",this.slider.value=this._value,this.slider.autocomplete="off",this.slider.addEventListener("input",this.handleVolumeChange),n.appendChild(this.slider),this.input=document.createElement("input"),this.input.type="number",this.input.className="volume-control-input",this.input.min="0",this.input.max="1",this.input.step="0.01",this.input.value=this._value.toFixed(2),this.input.autocomplete="off",this.input.addEventListener("input",this.handleVolumeChange),n.appendChild(this.input),this.appendChild(n)}}customElements.define("volume-control",t)},8816(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.run=r,n(4153),n(1914);var s=n(7054),i=n(9501),a=n(691);function r(){addEventListener("wheel",e=>{e.target.closest(".no-scroll")||"INPUT"===e.target.tagName&&"number"===e.target.type&&(e.stopPropagation(),e.target.value=Number(e.target.value)+(e.deltaY<0?1:-1),e.target.dispatchEvent(new Event("input")))},{passive:!0}),electron.menuEnabler(),electron.mwapiLoaded(async(e,t,n,r)=>{if(i.StorageManager.okay(null,electron)){var o;document.querySelector("#rollback-needed .request-link").href=null!==(o=await fetch("https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q7765871&props=sitelinks/urls&format=json&origin=*").then(e=>e.json()).then(t=>{var n;return(null===(n=Object.values(t.entities.Q7765871.sitelinks).find(t=>t.url.startsWith(`https://${e}/wiki/`)))||void 0===n?void 0:n.url)||null}).catch(()=>null))&&void 0!==o?o:"https://www.wikidata.org/wiki/Q7765871";const i=new s.WikiShield(e,t,n,r);electron.onOpenBrowser(()=>i.open(null,!1)),electron.onOpenUrl(e=>i.open(e,!1)),electron.onOpenNotification(e=>{const t=new URL(e);if(t.searchParams.has("markasread")){const e=i.notifications.find(null,+t.searchParams.get("markasread"));e&&i.notifications.read(e.type,e.notification)}i.open(e)}),electron.menuEnabler({browser:!0}),i.on("ready",()=>{electron.onBeforeunload(async()=>{await i.save(),electron.unloaded()}),window.addEventListener("beforeunload",async()=>await i.save());const e=new a.Killswitch(i);e.on("kill",()=>{alert("WikiShield has been temporarily disabled. Please contact the development team for more information."),window.close()}),e.on("force-update",()=>{alert("The current version of WikiShield is no longer supported. Please update to the latest version to continue using WikiShield."),window.close()}),e.on("update",()=>{electron.sendNotification({title:"WikiShield Update",body:"A new version of WikiShield is available. Please update to the latest version for the best experience."},"")}),e.on("unsafe",()=>{alert("Could not verify the integrity of WikiShield. Make sure you are connected to the internet. If the problem persists, please contact the development team."),window.close()}),e.on("okay",async()=>{addEventListener("keydown",e=>i.controller(e)),addEventListener("keyup",e=>i.controller(e)),await i.init()},{once:!0}),e.check().then(()=>e.monitor(1e4))},{once:!0})}else alert("An error has occurred with the WikiShield storage system that could lead to data loss. For that reason, WikiShield has been automatically disabled. Please report this immediately to the development team."),window.close()}),electron.mwapiLoader().catch(e=>{alert(`An error occurred while loading the WikiShield API:\n\n${e.stack||e}`),window.close()})}window.isElectron&&r()},317(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AutoScroll=function(){document.querySelectorAll(".auto-scroll").forEach(e=>{e.dataset.autoScrollInitialized||(e.parentElement.addEventListener("wheel",t=>{e.dataset.autoScrollFreeze=750,e.dataset.autoScrollLastTime=performance.now();let n=parseFloat(e.dataset.autoScrollOffset)||0;const s=Math.abs(t.deltaX),i=Math.abs(t.deltaY),a=Math.abs(t.deltaZ),r=s+i+a;if(0===r)return;let o;switch(Math.max(s,i,a)){case s:o=Math.sign(t.deltaX);break;case i:o=Math.sign(t.deltaY);break;case a:o=Math.sign(t.deltaZ)}n+=o*r,e.dataset.autoScrollOffset=n},{passive:!0}),e.dataset.autoScrollInitialized=!0);let t=parseFloat(e.dataset.autoScrollOffset)||0;if("autoScrollFreeze"in e.dataset){const n=parseFloat(e.dataset.autoScrollLastTime)||performance.now(),s=performance.now();t+=s-n,e.dataset.autoScrollOffset=t,e.dataset.autoScrollLastTime=s;const i=parseFloat(e.dataset.autoScrollFreeze);i>0?e.dataset.autoScrollFreeze=i-s+n:(delete e.dataset.autoScrollFreeze,delete e.dataset.autoScrollLastTime)}const s=parseFloat(e.dataset.autoScrollSpeed)||1;let i=parseFloat(e.dataset.autoScrollCarry)||0;i+=s;const a=Math.floor(i);e.dataset.autoScrollCarry=(i-a).toString();let r=e.querySelectorAll(":scope > .auto-scroll-item").length;if(0===r){const t=e.innerHTML;e.innerHTML="";const n=document.createElement("span");n.className="auto-scroll-item",n.innerHTML=t,e.appendChild(n),r=1}const o=e.querySelector(":scope > .auto-scroll-item"),l=getComputedStyle(o),d=o.clientWidth+(parseFloat(l.marginLeft)||0)+(parseFloat(l.marginRight)||0),c=e.clientWidth;if(d<c)return void e.querySelectorAll(":scope > .auto-scroll-item:not(:first-child)").forEach(e=>e.remove());const u=Math.ceil(c/d)+1-r;if(u>0)for(let e=0;e<u;e++){const e=o.cloneNode(!0);o.parentNode.insertBefore(e,o.nextSibling)}else if(u<0){const t=e.querySelectorAll(":scope > .auto-scroll-item");for(let e=0;e<-u;e++){var p;null===(p=t[e])||void 0===p||p.remove()}}const g=(performance.now()-t)/1e3*60*s%d;e.scrollLeft=g;const h=(e,t,n)=>{(async function(e,t,n,s=()=>!0){if(0===t)return Promise.resolve([0,0]);const i=e.scrollLeft,a=i+t,r=performance.now()+n;let o;const l=new Promise(e=>o=e),d=()=>{const l=performance.now(),c=i+Math.min(1,(l-(r-n))/n)*t;l>=r?(e.scrollLeft=a,o([0,0])):s(e,c)?(e.scrollLeft=c,requestAnimationFrame(d)):o([t-c+i,Math.max(0,r-l)])};return requestAnimationFrame(d),l})(e,t,n,(e,t)=>{var n;const s=d;return!(t>=s)||null!==(n=void(e.scrollLeft=t%s))&&void 0!==n&&n}).then(([t,n])=>{t>0&&h(e,t,n)})};s>0&&h(e,a,1e3*n)})};const n=1/60},4784(e,t){function n(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function s(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Dialog=void 0;var i=new WeakSet;function a(e){null!=e&&e.parentElement&&(e.classList.add("hidden"),setTimeout(()=>{e.parentElement&&e.remove()},300))}async function r(){if(this.dialogs.processing||0===this.dialogs.queue.length)return;this.dialogs.processing=!0;const{fn:e,resolve:t,reject:n}=this.dialogs.queue.shift();try{this.dialogs.active=!0;const n=await e();this.dialogs.active=null,t(n)}catch(e){this.dialogs.active=null,n(e)}finally{this.dialogs.processing=!1,requestAnimationFrame(()=>s(i,this,r).call(this))}}function o(e,t=!1){return new Promise((n,a)=>{t&&this.dialogs.active?e().then(n).catch(a):(this.dialogs.queue.push({fn:e,child:t,resolve:n,reject:a}),s(i,this,r).call(this))})}function l(e,t,n="",s=""){return new Promise(i=>{const a=document.createElement("div");a.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal"),a.appendChild(r);const o=document.createElement("div");o.classList.add("confirmation-modal-header"),r.appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal-title"),l.textContent=e,o.appendChild(l);const d=document.createElement("div");d.classList.add("confirmation-modal-body"),d.innerHTML=t,r.appendChild(d);const c=document.createElement("input");c.type="text",c.classList.add("confirmation-modal-input"),c.placeholder=n,c.value=s,d.appendChild(c),c.focus(),c.select();const u=document.createElement("div");u.classList.add("confirmation-modal-footer"),r.appendChild(u);const p=document.createElement("button");p.classList.add("confirmation-modal-button","confirmation-modal-button-cancel"),p.style.setProperty("--background","211, 51, 51"),p.textContent="Cancel",u.appendChild(p);const g=document.createElement("button");g.classList.add("confirmation-modal-button","confirmation-modal-button-submit"),g.style.setProperty("--background","51, 153, 211"),g.textContent="Submit",u.appendChild(g);const h=e=>{document.removeEventListener("keydown",m,!0),a.classList.add("closing"),r.classList.add("closing"),setTimeout(()=>{a.remove(),i(e)},200)},m=e=>{if("Enter"===e.key)return e.preventDefault(),e.stopPropagation(),h(c.value),!1;if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),h(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",m,!0),p.addEventListener("click",()=>h(null)),g.addEventListener("click",()=>h(c.value)),a.addEventListener("click",e=>{e.target===a&&h(null)})})}function d(e){return new Promise(t=>{const n=e=>{document.removeEventListener("keydown",s,!0),i.classList.add("closing"),a.classList.add("closing"),setTimeout(()=>{i.remove(),t(e)},200)},s=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),n(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",s,!0);const i=document.createElement("div");i.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(i);const a=document.createElement("div");a.classList.add("confirmation-modal"),i.appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal-header"),a.appendChild(r);const o=document.createElement("div");o.classList.add("confirmation-modal-title"),o.textContent="Report to UAA",r.appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal-body"),l.innerHTML="Select reason for reporting <span class='confirmation-modal-username'></span> to UAA:",a.appendChild(l),l.querySelector(".confirmation-modal-username").textContent=e;const d=document.createElement("div");d.classList.add("confirmation-modal-footer","confirmation-modal-footer-vertical"),a.appendChild(d),["Disruptive","Offensive","Promotional","Misleading"].forEach(e=>{const t=`${e} username`,s=document.createElement("button");s.classList.add("confirmation-modal-button","confirmation-modal-button-reason"),s.textContent=t,s.addEventListener("click",()=>n(t)),d.appendChild(s)});const c=document.createElement("button");c.classList.add("confirmation-modal-button","confirmation-modal-button-cancel"),c.style.setProperty("--background","211, 51, 51"),c.textContent="Cancel",c.addEventListener("click",()=>n(null)),d.appendChild(c),i.addEventListener("click",e=>{e.target===i&&n(null)})})}function c(e,t,n=null,s=!1){return new Promise(i=>{const a=e=>{document.removeEventListener("keydown",r,!0),o.classList.add("closing"),l.classList.add("closing"),setTimeout(()=>{o.remove(),i(e)},200)},r=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),a(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",r,!0);const o=document.createElement("div");o.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal"),o.appendChild(l);const d=document.createElement("div");d.classList.add("confirmation-modal-header"),l.appendChild(d);const c=document.createElement("div");c.classList.add("confirmation-modal-title"),c.textContent=e,d.appendChild(c);const u=document.createElement("div");u.classList.add("confirmation-modal-body"),u.innerHTML=t,l.appendChild(u);const p=document.createElement("div");if(p.classList.add("confirmation-modal-footer"),l.appendChild(p),n&&!s){const s=document.createElement("button");s.classList.add("confirmation-modal-button","confirmation-modal-button-uaa"),s.style.setProperty("--background","211, 51, 51"),s.textContent="Report to UAA",p.appendChild(s),s.addEventListener("click",()=>{document.removeEventListener("keydown",r,!0),o.classList.add("closing"),l.classList.add("closing"),setTimeout(async()=>{o.remove();const s=await this.UAA(n,!0);s?this.ws.execute({name:"reportToUAA",params:{reportMessage:s}},void 0,void 0,{user:{name:n}}):i(await this.confirm(e,t,n,!1,!0))},200)})}const g=document.createElement("div");g.classList.add("confirmation-modal-footer-right"),p.appendChild(g);const h=document.createElement("button");h.classList.add("confirmation-modal-button","confirmation-modal-button-no"),h.textContent="No",h.addEventListener("click",()=>a(!1)),g.appendChild(h);const m=document.createElement("button");m.classList.add("confirmation-modal-button","confirmation-modal-button-yes"),m.style.setProperty("--background","51, 102, 204"),m.textContent="Yes",m.addEventListener("click",()=>a(!0)),g.appendChild(m),o.addEventListener("click",e=>{e.target===o&&a(null)}),requestAnimationFrame(()=>m.focus())})}function u(e,t){return new Promise(async n=>{const s=document.createElement("div");s.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(s);const i=document.createElement("div");i.classList.add("confirmation-modal"),s.appendChild(i);const a=document.createElement("div");a.classList.add("confirmation-modal-header"),a.textContent=e,i.appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal-body"),r.innerHTML='<div class="dialog-loading">\n <div class="dialog-spinner"></div>\n <div class="dialog-loading-text">Loading...</div>\n </div>',i.appendChild(r);const o=()=>{document.removeEventListener("keydown",l,!0),s.classList.add("closing"),i.classList.add("closing"),setTimeout(()=>{s.remove(),n()},200)},l=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),o(),!1};document.addEventListener("keydown",l,!0),s.addEventListener("click",e=>{e.target===s&&o()}),t instanceof Promise?t.then(e=>{r&&(r.innerHTML=e)}).catch(()=>{r&&(r.innerHTML="Failed to load content")}):r.innerHTML=t})}t.Dialog=class{constructor(e){n(this,i),this.ws=e,this.dialogs={processing:!1,active:null,queue:[]},this.popups=[],addEventListener("focus",()=>{this.popups.length>0&&(this.popups.forEach(e=>electron.closePopup(e)),this.popups=[],requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())}))}),electron.onPopupClosed(e=>{const t=this.popups.indexOf(e);-1!==t&&this.popups.splice(t,1),0===this.popups.length&&requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())})})}controller(e){}check(){if(0===this.popups.length)return requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())});requestAnimationFrame(()=>this.check())}toast(e,t,n="default",r=5e3){const o=this.ws.store.settings.zen_mode;if(o.enabled&&!o.toasts.enabled)return!1;const l=document.createElement("div");l.classList.add("toast-alert",n);const d=document.createElement("div");d.classList.add("toast-icon"),l.appendChild(d);const c=document.createElement("i");switch(c.classList.add("fa"),d.appendChild(c),n){case"success":c.classList.add("fa-check");break;case"warning":c.classList.add("fa-exclamation-triangle");break;case"error":c.classList.add("fa-xmark");break;default:c.classList.add("fa-info-circle")}const u=document.createElement("div");u.classList.add("toast-content"),l.appendChild(u);const p=document.createElement("div");p.classList.add("toast-title"),p.textContent=e,u.appendChild(p);const g=document.createElement("div");g.classList.add("toast-message"),g.textContent=t,u.appendChild(g);const h=document.createElement("div");h.classList.add("toast-close"),h.addEventListener("click",()=>{s(i,this,a).call(this,l)}),l.appendChild(h);const m=document.createElement("i");return m.classList.add("fa","fa-xmark"),h.appendChild(m),document.body.querySelector("#app").appendChild(l),setTimeout(()=>{this.ws.audio.playSound(["notification","toast"]),l.classList.add("show")},10),r>0&&setTimeout(()=>s(i,this,a).call(this,l),r),!0}input(e,t,n="",a="",r=!1){return s(i,this,o).call(this,()=>s(i,this,l).call(this,e,t,n,a),r)}UAA(e,t=!1){return s(i,this,o).call(this,()=>s(i,this,d).call(this,e),t)}confirm(e,t,n=null,a=!1,r=!1){return s(i,this,o).call(this,()=>s(i,this,c).call(this,e,t,n,a),r)}show(e,t){return s(i,this,o).call(this,()=>s(i,this,u).call(this,e,t))}}},8469(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.GUI=void 0;var s=n(4192),i=n(4041),a=n(7054),r=n(2069),o=n(4784),l=n(8921),d=n(9117),c=n(372),u=n(955),p=n(7698),g=n(317);function h(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function m(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var v=new WeakSet;class f{constructor(e){h(this,v),this.ws=e,this.dialog=new o.Dialog(this.ws),this.events=new l.EventManager(this.ws),this.settings=new d.Settings(this.ws),this.intervals={DEFCON:null,outdated:null},this.controllers={current:null}}async build(){this.updateDEFCON(),document.documentElement.style.colorScheme={light:"only light",auto:"light dark",dark:"only dark"}[this.ws.store.UI.theme.app]||"light dark";const e={code:["ArrowUp","ArrowUp","ArrowDown","ArrowDown","ArrowLeft","ArrowRight","ArrowLeft","ArrowRight","b","a"],index:0,function:t=>{t.key!==e.code[e.index]?e.index=t.key===e.code[0]?1:0:++e.index===e.code.length&&(e.index=0,this.ws.open("https://ws.luni.me/konami-easter-egg","force"))}};addEventListener("keydown",e.function),this.updateAccessibility(),document.querySelector("#initial").classList.remove("hidden"),document.querySelectorAll(".VERSION").forEach(e=>e.textContent=a.WikiShield.config.version),Math.random()<.01&&(document.querySelector("#wikishield-sikiwhield").textContent="SikiWhield");const t=new AbortController;let n;const s=new Promise(e=>n=e);let i;this.ws.audio.playSound(["startup"],t.signal,!1,()=>n()),await s;const r=this.ws.store.settings.performance.startup;if("always_off"!==r){const e=document.getElementById("dots-canvas"),t=e.getContext("2d"),n=Math.min(devicePixelRatio||1,2);class s{constructor(){m(this,"radius",2),this.x=Math.random()*e.width,this.y=Math.random()*e.height,this.vx=.5*(Math.random()-.5),this.vy=.5*(Math.random()-.5),this.color=s.colors[Math.random()*s.colors.length|0],this.fill=`rgba(${this.color}, 0.8)`,this.shadow=`rgba(${this.color}, 0.8)`}update(){this.x+=this.vx,this.y+=this.vy,this.x<0?this.x=e.width:this.x>e.width&&(this.x=0),this.y<0?this.y=e.height:this.y>e.height&&(this.y=0)}draw(){t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.fillStyle=this.fill,t.fill()}}m(s,"dots",[]),m(s,"target",0),m(s,"colors",["102, 126, 234","240, 147, 251","118, 75, 162","217, 70, 239"]);let a=null;const o=()=>{a||(a=requestAnimationFrame(()=>{a=null;const i=e.width,r=e.height;e.width=Math.floor(innerWidth*n),e.height=Math.floor(innerHeight*n),e.style.width=`${innerWidth}px`,e.style.height=`${innerHeight}px`,t.setTransform(1,0,0,1,0,0),t.scale(n,n);const o=e.width/(i||e.width),l=e.height/(r||e.height);if(s.dots.forEach(e=>{e.x*=o,e.y*=l}),s.target=Math.floor(innerWidth*innerHeight/7e3),s.target=Math.max(40,Math.min(250,s.target)),s.target>s.dots.length)for(let e=s.dots.length;e<s.target;e++)s.dots.push(new s);else s.target<s.dots.length&&(s.dots.length=s.target)}))};o(),addEventListener("resize",o);const l=160,d=30,c=500;let u=null,p=performance.now();const g=new Array(15).fill(1e3/60),h=()=>{{const n=performance.now(),a=n-p;p=n,g.shift(),g.push(a);const o=[...g].sort((e,t)=>e-t).slice(2,-2),l=1e3/(o.reduce((e,t)=>e+t,0)/o.length);if("adaptive"===r){if(l<d){if(null===u&&(u=n),n-u>=c)return i&&cancelAnimationFrame(i),i=null,void t.clearRect(0,0,e.width,e.height)}else u=null;l<45&&s.dots.length>60&&(s.dots.length=Math.max(60,Math.floor(.9*s.dots.length)),s.target=s.dots.length)}}t.clearRect(0,0,e.width,e.height),s.dots.forEach(e=>{e.update(),e.draw()});const n=Math.ceil(innerWidth/l),a=Math.ceil(innerHeight/l),o=new Array(n*a);for(let e=0;e<o.length;e++)o[e]=[];s.dots.forEach((e,t)=>{const s=Math.max(0,Math.min(n-1,Math.floor(e.x/l))),i=Math.max(0,Math.min(a-1,Math.floor(e.y/l)));o[i*n+s].push(t)});const m=innerWidth/2,v=innerHeight/2,f=(e,n,s,i,a)=>{const r=[0];Math.max(e,s)>innerWidth&&r.push(-innerWidth),Math.min(e,s)<0&&r.push(innerWidth);const o=[0];Math.max(n,i)>innerHeight&&o.push(-innerHeight),Math.min(n,i)<0&&o.push(innerHeight),t.lineWidth=1,t.strokeStyle=a;for(const a of r)for(const r of o)t.beginPath(),t.moveTo(e+a,n+r),t.lineTo(s+a,i+r),t.stroke()};for(let e=0;e<a;e++)for(let t=0;t<n;t++){const i=o[e*n+t];if(0!==i.length)for(let r=-1;r<=1;r++){const l=(e+r+a)%a;for(let e=-1;e<=1;e++){const a=o[l*n+(t+e+n)%n];if(0!==a.length)for(let e=0;e<i.length;e++){const t=s.dots[i[e]];for(let n=0;n<a.length;n++){const r=a[n];if(r<=i[e])continue;const o=s.dots[r];let l=t.x-o.x,d=t.y-o.y;l>m&&(l-=innerWidth),l<-m&&(l+=innerWidth),d>v&&(d-=innerHeight),d<-v&&(d+=innerHeight);const c=l*l+d*d;if(c<22500){const e=.4*(1-Math.sqrt(c)/150),n=t.color.split(","),s=o.color.split(","),i=(parseInt(n[0])+parseInt(s[0]))/2,a=(parseInt(n[1])+parseInt(s[1]))/2,r=(parseInt(n[2])+parseInt(s[2]))/2;f(t.x,t.y,t.x-l,t.y-d,`rgba(${i}, ${a}, ${r}, ${e})`)}}}}}}i=requestAnimationFrame(h)};h()}this.ws.rights.rollback||"LuniZunie"===this.ws.api.username?(document.querySelector("#rollback-needed").classList.add("hidden"),document.querySelector("#start-button").classList.remove("hidden")):(document.querySelector("#rollback-needed").classList.remove("hidden"),document.querySelector("#start-button").classList.add("hidden")),document.querySelector("#start-button").addEventListener("click",()=>{window.removeEventListener("keydown",e.function),t.abort(),this.ws.audio.playSound(["ui","click"]),i&&cancelAnimationFrame(i),this.ws.start()}),window.addEventListener("click",e=>{[...document.querySelectorAll(".tooltip.buttons")].forEach(e=>e.remove());const t=e.target.closest("[href]");if(t){const n=new URL(t.href,location.href);if(n.origin===location.origin&&n.pathname===location.pathname)return;if(t.dataset.multipleHrefs)try{const[e,n=""]=t.dataset.multipleHrefs.split(";"),s=Object.fromEntries(n.split("&").map(e=>{const[t,n]=e.split("=");return[t,decodeURIComponent(n)]}));switch(e){case"page":{const e=s.title,n=+s.id;this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Revision",i.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:Permalink/${n}`),e.altKey),t.remove()}),t.appendChild(i);const a=document.createElement("div");a.classList.add("button"),a.innerText="Diff",a.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:Diff/${n}`),e.altKey),t.remove()}),t.appendChild(a)})}break;case"page-abuse":{const e=s.title,n=+s.id;this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Details",i.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:AbuseLog/${n}`),e.altKey),t.remove()}),t.appendChild(i);const a=document.createElement("div");a.classList.add("button"),a.innerText="Examine",a.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:AbuseFilter/examine/log/${n}`),e.altKey),t.remove()}),t.appendChild(a)})}break;case"log":{const e=s.title,n=JSON.parse(s.log);this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Log",i.addEventListener("click",s=>{const i=this.ws.page(`Special:Log/${encodeURIComponent(n.user)}?page=${encodeURIComponent(e)}&type=${n.type}&wptime=${n.timestamp}&limit=1`,!1,!1),a=this.ws.open(i,s.altKey);t.remove(),a.addEventListener("load",()=>{a.scroll({behavior:"smooth",top:a.document.body.scrollHeight})},{once:!0})}),t.appendChild(i)})}break;case"user":{const e=s.name;this.createTooltip(t,"buttons",null,null,null,t=>{const n=document.createElement("div");n.classList.add("button"),n.innerText="User talk",n.addEventListener("click",n=>{this.ws.open(this.ws.page(`User talk:${e}`),n.altKey),t.remove()}),t.appendChild(n);const s=document.createElement("div");s.classList.add("button"),s.innerText="User contribs",s.addEventListener("click",n=>{this.ws.open(this.ws.page(`Special:Contribs/${e}`),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="User page",i.addEventListener("click",n=>{this.ws.open(this.ws.page(`User:${e}`),n.altKey),t.remove()}),t.appendChild(i)})}break;case"email":this.createTooltip(t,"buttons",null,null,null,e=>{const t=document.createElement("div");t.classList.add("button"),t.innerText="Emergency",t.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Emergency"),t.altKey),e.remove()}),e.appendChild(t);const n=document.createElement("div");n.classList.add("button"),n.innerText="ArbCom",n.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Arbitration Committee"),t.altKey),e.remove()}),e.appendChild(n);const s=document.createElement("div");s.classList.add("button"),s.innerText="Oversight",s.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Oversight"),t.altKey),e.remove()}),e.appendChild(s)})}}catch(n){this.ws.open(t.getAttribute("href"),e.altKey)}finally{e.preventDefault()}else this.ws.open(t.getAttribute("href"),e.altKey);e.preventDefault()}}),document.querySelector("#loading").classList.add("hidden")}async start(){this.intervals.DEFCON=setInterval(this.updateDEFCON.bind(this),6e4),document.querySelector("#DEFCON").addEventListener("click",e=>{this.ws.open("https://en.wikipedia.org/w/index.php?tagfilter=mw-manual-revert%7Cmw-rollback%7Cmw-undo&title=Special%3ARecentChanges&urlversion=2",e.altKey)}),this.settings.start(),document.querySelector("#app").classList.remove("hidden"),document.querySelector("#initial").classList.add("hidden"),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const n=e.closest(".bottom-tool-item"),s=document.querySelector(`#${n.dataset.menu}-menu`),i=s.classList.contains("show");switch(n.dataset.menu){case"revert":s.innerHTML="",this.createWarnMenu("reverts",s,this.ws.queue.current.item);break;case"warn":s.innerHTML="",this.createWarnMenu("warnings",s,this.ws.queue.current.item);break;case"page":{var a;const e=this.ws.queue.current.item,t=!0===(null==e||null===(a=e.page)||void 0===a?void 0:a.watched);document.querySelector("#page-watch").classList.toggle("hidden",t),document.querySelector("#page-unwatch").classList.toggle("hidden",!t)}}this.closeMenus(),i||(s.classList.add("show"),e.classList.add("active"),this.positionBottomMenu(n,s))})}),document.querySelectorAll(".submenu-trigger").forEach(e=>{let t=(0,s.generateRandomUUID)();e.addEventListener("mouseenter",()=>{t=null;const n=e.closest(".bottom-tool-menu");n&&n.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show"));const s=e.querySelector(".submenu");s&&(this.events.submenu(s,s.dataset.eventName),s.classList.add("show"),this.positionSubmenu(s,e))}),e.addEventListener("mouseleave",()=>{const n=(0,s.generateRandomUUID)();t=n,setTimeout(()=>{if(t!==n)return;const s=e.querySelector(".submenu");s&&s.classList.remove("show")},500)})}),document.querySelectorAll(".menu-option:not(.submenu-trigger)").forEach(e=>{e.addEventListener("click",()=>this.closeMenus())}),document.querySelectorAll(".submenu").forEach(e=>{e.addEventListener("click",e=>e.stopPropagation())}),document.querySelectorAll("#queue-tabs > .queue-tab").forEach(e=>this.addTooltipListener(e));{const e=["alert","message"];e.forEach(e=>{const t=document.querySelector(`#${e}s-icon`);this.addTooltipListener(t),t.addEventListener("click",()=>{const t=document.querySelector(`#${e}s-panel`);t.classList.toggle("show"),t.classList.contains("show")&&this.ws.notifications.seen(e)}),document.querySelector(`#mark-all-${e}s-read`).addEventListener("click",t=>{this.ws.notifications.read(e)})}),document.addEventListener("click",t=>{for(const n of e){const e=document.querySelector(`#${n}s-panel`),s=document.querySelector(`#${n}s-icon`);null!=e&&e.contains(t.target)||null!=s&&s.contains(t.target)||null==e||e.classList.remove("show")}t.target.closest(".bottom-tool-menu")||t.target.closest(".confirmation-modal-overlay")||this.closeMenus()})}const e=document.querySelector("#latest-edits-tab");e.addEventListener("click",()=>this.updateDiffDisplay(this.ws.queue.current.item,!1)),this.addTooltipListener(e);const t=document.querySelector("#consecutive-edits-tab");t.addEventListener("click",()=>this.updateDiffDisplay(this.ws.queue.current.item,!0)),this.addTooltipListener(t),document.querySelector("#pending-changes-container > .accept").addEventListener("click",async e=>{await this.ws.gui.settings.waitForClose();const t=await this.dialog.input("Accept Pending Changes","Enter an optional edit summary for accepting this change:","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"next-item",params:{}},{name:"accept-pending-edit",params:{summary:t}}]})}),document.querySelector("#pending-changes-container > .reject").addEventListener("click",async e=>{await this.ws.gui.settings.waitForClose();const t=await this.dialog.input("Reject Pending Changes","Enter an optional edit summary for rejecting this change:","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"next-item",params:{}},{name:"reject-pending-edit",params:{summary:t}}]})}),document.querySelectorAll("#bottom-tools [data-tooltip]").forEach(e=>this.addTooltipListener(e));{const e=document.querySelector("#queue");{const t=this.ws.store.UI.queue.width;t&&(e.style.width=t,document.querySelector("#right-container").style.width=`calc(100% - ${t})`)}const t=document.querySelector("#right-details");{const e=this.ws.store.UI.details.width;e&&(t.style.width=e,document.querySelector("#main-container").style.width=`calc(100% - ${e})`)}const n={active:null,section:null,x:null,width:null,windowWidth:null},s=(e,t,s)=>{s.preventDefault(),n.active=e,n.section=t,n.x=s.clientX,n.width=t.getBoundingClientRect().width,n.windowWidth=innerWidth},i=document.querySelector("#queue-width-adjust");i.addEventListener("pointerdown",t=>s(i,e,t));const a=document.querySelector("#details-width-adjust");a.addEventListener("pointerdown",e=>s(a,t,e)),addEventListener("pointerup",()=>{n.active===i?this.ws.store.UI.queue.width=e.style.width:n.active===a&&(this.ws.store.UI.details.width=t.style.width),n.active=null,n.section=null}),addEventListener("pointermove",e=>{if(!n.active)return;const t=e.clientX-n.x;let s;n.active===i?s=n.width+t:n.active===a&&(s=n.width-t);const r=.1*n.windowWidth,o=.3*n.windowWidth;s=Math.max(r,Math.min(o,s));const l=s/n.windowWidth*100;n.section.style.width=`${l}vw`,n.active===i?document.querySelector("#right-container").style.width=`calc(100% - ${l}vw)`:n.active===a&&(document.querySelector("#main-container").style.width=`calc(100% - ${l}vw)`)})}const n=a.WikiShield.config.changelog.version;var i,r;(n.endsWith("!")||n!==this.ws.store.changelog)&&(this.ws.store.changelog=n.replace(/!$/,""),null===(i=(r=electron).open)||void 0===i||i.call(r,"changelog"));this.addTooltipListener(document.querySelector("#settings-icon")),document.querySelectorAll("#queue-top-right > span").forEach(e=>this.addTooltipListener(e)),this.updateZenMode(),this.reorderQueues(),this.newCurrentItem(null),document.querySelector("#settings-icon").addEventListener("click",()=>{this.settings.open()}),this.events.button(document.querySelector("#clear-queue"),"clear-queue"),this.events.button(document.querySelector("#previous-item-button"),"previous-item"),this.events.button(document.querySelector("#next-item-button"),"next-item"),this.events.button(document.querySelector("#user-open-user-page"),"open-user-page"),this.events.button(document.querySelector("#user-open-user-talk"),"open-user-talk"),this.events.button(document.querySelector("#user-view-contribs"),"open-user-contributions"),this.events.button(document.querySelector("#user-view-filter-log"),"open-filter-log"),this.events.button(document.querySelector("#user-whitelist"),"whitelist-user"),this.events.button(document.querySelector("#user-unwhitelist"),"unwhitelist-user"),this.events.button(document.querySelector("#user-highlight"),"highlight-user"),this.events.button(document.querySelector("#user-unhighlight"),"unhighlight-user"),this.events.submenu(document.querySelector("#user-welcome .submenu"),"welcome-user"),this.events.submenu(document.querySelector("#user-report-aiv .submenu"),"report-user-to-aiv"),this.events.submenu(document.querySelector("#user-report-uaa .submenu"),"report-user-to-uaa"),this.events.submenu(document.querySelector("#user-request-global-block .submenu"),"request-global-block"),this.events.submenu(document.querySelector("#user-request-global-lock .submenu"),"request-global-lock"),this.events.submenu(document.querySelector("#user-new-talk-topic .submenu"),"send-message-to-user-talk"),this.events.button(document.querySelector("#page-open-page"),"open-page"),this.events.button(document.querySelector("#page-open-talk"),"open-page-talk"),this.events.button(document.querySelector("#page-watch"),"watch-page"),this.events.button(document.querySelector("#page-unwatch"),"unwatch-page"),this.events.button(document.querySelector("#page-whitelist"),"whitelist-page"),this.events.button(document.querySelector("#page-unwhitelist"),"unwhitelist-page"),this.events.button(document.querySelector("#page-highlight"),"highlight-page"),this.events.button(document.querySelector("#page-unhighlight"),"unhighlight-page"),this.events.submenu(document.querySelector("#page-request-protection .submenu"),"request-page-protection"),this.events.button(document.querySelector("#page-view-history"),"open-page-history"),this.events.submenu(document.querySelector("#page-new-talk-topic .submenu"),"send-message-to-page-talk"),this.events.button(document.querySelector("#edit-view-revision"),"open-revision"),this.events.button(document.querySelector("#edit-view-diff"),"open-diff"),this.events.button(document.querySelector("#edit-thank-user"),"thank-user"),this.events.submenu(document.querySelector("#edit-rollback .submenu"),"rollback-edit"),this.events.submenu(document.querySelector("#edit-rollback-goodfaith .submenu"),"rollback-goodfaith-edit"),this.events.submenu(document.querySelector("#edit-undo .submenu"),"undo-edit"),this.events.button(document.querySelector("#copy-link"),"copy-link"),this.events.button(document.querySelector("#refresh-user-contributions"),"refresh-user-contributions"),this.events.button(document.querySelector("#user-contributions > .footer"),"open-user-contributions"),this.events.button(document.querySelector("#refresh-page-history"),"refresh-page-history"),this.events.button(document.querySelector("#page-history > .footer"),"open-page-history"),c.Queue.types.forEach(e=>{this.events.button(document.querySelector(`#queue-tab-${e}`),`switch-to-${e}-queue`)}),this.animation(),this.update(),this.renderQueue(),electron.menuEnabler({browser:!0,settings:{preferences:!0},help:{changelog:!0}})}animation(){try{(0,g.AutoScroll)()}catch(e){console.error("Error in animation loop:",e)}requestAnimationFrame(()=>this.animation())}update(){try{const e=new Date;document.querySelectorAll("[data-time]").forEach(t=>{const n=new Date(t.dataset.time);switch(t.dataset.timeFormat){case"notification":t.textContent=this.ws.util.formatNotificationTime(n,"timeNow"in t.dataset?new Date(t.dataset.timeNow):e)+(t.dataset.timePostfix||"");break;case"duration":t.textContent=this.ws.util.formatDuration(n,"timeNow"in t.dataset?new Date(t.dataset.timeNow):e)+(t.dataset.timePostfix||"")}})}catch(e){console.error("Error updating time elements:",e)}setTimeout(()=>this.update(),1e3)}async updateDEFCON(){var e;const t=await this.ws.getDEFCON(),n=document.querySelector("#DEFCON");n.title=`DEFCON-${null!==t.level?t.level:"N/A"} (${t.info?`${t.info} revert${1===+t.info?"":"s"} per minute`:"No data"})`;const s=n.querySelector(".dot");s.className="dot",null!==t.level&&s.classList.add(`DEFCON-${t.level}`),document.querySelector(".DEFCON-RPM").textContent=null!==(e=t.info)&&void 0!==e?e:"N/A"}generateItemHTML(e,t=!1){const n=this.getORESColor(e.ores),s="sizediff"in e?this.ws.util.getChangeColor(e.sizediff):void 0,a=(0,i.CreateDOMElement)("div");{const t=(0,i.CreateDOMElement)("div",{class:"item-color",style:{"--ores-color":n},dataset:{ores:e.ores}});a.appendChild(t)}{var r,o,l;const t=(0,i.CreateDOMElement)("div",{class:"item-body",style:{"--ores-color":n,"--diff-color":s},datset:{ores:e.ores}});a.appendChild(t);{const n=(0,i.CreateDOMElement)("div",{class:"header"});t.appendChild(n);{const t=this.ws.store.highlight.pages.has(e.page.title),s=(0,i.CreateDOMElement)("span",{class:"page-title"+(t?" highlighted":""),content:e.page.title,dataset:t?{tooltip:"Page is highlighted",tooltipDelay:500}:{}});this.addTooltipListener(s),n.appendChild(s);const a=(0,i.CreateDOMElement)("i",{class:"fas fa-file-lines"});s.prepend(a)}{const t=(0,i.CreateDOMElement)("span",{class:"timestamp"});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-clock",style:{"font-size":"11px"}});t.appendChild(s);const a=(0,i.CreateDOMElement)("span",{content:this.ws.util.formatNotificationTime(new Date(e.timestamp)),dataset:{tooltip:new Date(e.timestamp).toLocaleString(),tooltipDelay:500,time:e.timestamp,timeFormat:"notification"}});this.addTooltipListener(a),t.appendChild(a)}}{var d;const n=(0,i.CreateDOMElement)("div",{class:"meta"});t.appendChild(n);const s=null!==(d=e.performer)&&void 0!==d?d:e.user;{const t=s.blocked,a=this.ws.util.expiryToDate(null==t?void 0:t.expiry),r=this.ws.store.highlight.users.has(s.name),o=void 0===s.talk,l=(0,i.CreateDOMElement)("span",{class:"user-chip"+(!1===(null==t?void 0:t.partial)?" blocked":"")+(r?" highlighted":"")+(o?" empty-talk":""),content:e.user.name,dataset:!1===(null==t?void 0:t.partial)?{tooltip:`Blocked ${a===1/0?"indefinitely":`until ${a.toLocaleString()}`} (${t.reason})`,tooltipDelay:500}:r?{tooltip:"User is highlighted",tooltipDelay:500}:o?{tooltip:"User has an empty talk page",tooltipDelay:500}:{}});this.addTooltipListener(l),n.appendChild(l);const d=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(s.anon?"user-secret":"user"),style:{"font-size":"11px"}});l.prepend(d)}{const t=(0,i.CreateDOMElement)("div",{class:"chips"});if(n.appendChild(t),"abuselog"===e.type){const n=["disallow","warn","showcaptcha","tag","none"],s=n.length;let a=s-1;for(let t=0;t<s;t++)if(e.origin.result.has(n[t])){a=t;break}const r=(0,i.CreateDOMElement)("span",{class:"ores-chip",dataset:{tooltip:`Action taken: ${n[a]}`,tooltipDelay:500}});this.addTooltipListener(r),t.appendChild(r);const o=(0,i.CreateDOMElement)("i",{class:`fas fa-${["ban","exclamation-triangle","robot","tag","check"][a]}`,style:{"font-size":"11px"}});r.prepend(o)}else{const n=(0,i.CreateDOMElement)("span",{class:"ores-chip",content:Number.isNaN(e.ores)?"-":Math.round(100*e.ores),dataset:{tooltip:"Score",tooltipDelay:500}});this.addTooltipListener(n),t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-fire",style:{"font-size":"11px"}});n.prepend(s)}{const n=(0,i.CreateDOMElement)("div",{class:"diff-chips"});if(t.appendChild(n),e.minor){const e=(0,i.CreateDOMElement)("span",{class:"minor-chip",dataset:{tooltip:"Minor edit",tooltipDelay:500}});this.addTooltipListener(e),n.appendChild(e);const t=(0,i.CreateDOMElement)("i",{class:"fas fa-m",style:{"font-size":"11px"}});e.appendChild(t)}if("sizediff"in e){const t=(0,i.CreateDOMElement)("span",{class:"diff-chip",content:Math.abs(e.sizediff).toLocaleString(),dataset:{tooltip:"Size difference",tooltipDelay:500}});if(this.addTooltipListener(t),n.appendChild(t),0!==e.sizediff){const n=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.sizediff>0?"plus":"minus"),style:{"font-size":"11px"}});t.prepend(n)}}}}}if(e.has_comment){const n=(0,i.CreateDOMElement)("div",{class:"item-comment"});t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"11px"}});n.appendChild(s);const a=(0,i.CreateDOMElement)("span",{class:"text",html:e.comment,dataset:{tooltip:e.comment,tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(a),n.appendChild(a)}const c=null!==(r=null!==(o=e.tags)&&void 0!==o?o:null===(l=e.filters)||void 0===l?void 0:l.map(e=>`${e.filter} (${"-1"===e.id?"private":e.id})`))&&void 0!==r?r:[];if(c.length>0){const e=(0,i.CreateDOMElement)("div",{class:"item-tags"});t.appendChild(e),c.forEach(t=>{const n=(0,i.CreateDOMElement)("span",{class:"tag",content:t});e.appendChild(n)})}}if(t){const e=(0,i.CreateDOMElement)("div",{class:"remove-button"});a.appendChild(e);const t=(0,i.CreateDOMElement)("i",{class:"fas fa-xmark"});e.appendChild(t)}return a.innerHTML}generateEditDetails(e,t=!1){if(!e)return void(document.querySelector("#edit-details").innerHTML="<div class='central'>Nothing selected</div>");const n="edit"===c.Queue.groups[e.type]?this.ws.queue.pending.get(e.id):null,s=document.querySelector("#edit-details");s.style.setProperty("--diff-color","sizediff"in e?this.ws.util.getChangeColor(e.sizediff):void 0),s.innerHTML="";{const t=(0,i.CreateDOMElement)("div",{class:"header"});s.appendChild(t);{const n=this.ws.store.highlight.pages.has(e.page.title),s=(0,i.CreateDOMElement)("span",{class:"page-title"+(n?" highlighted":""),dataset:n?{tooltip:"Page is highlighted",tooltipDelay:500}:{}});this.addTooltipListener(s),t.appendChild(s);const a=(0,i.CreateDOMElement)("i",{class:"fas fa-file-lines"});let r;switch(s.appendChild(a),c.Queue.groups[e.type]){case"edit":r="page";break;case"logevent":r="log";break;case"abuselog":r="page-abuse"}const o=(0,i.CreateDOMElement)("a",{content:e.page.title,dataset:{multipleHrefs:`${r};title=${encodeURIComponent(e.page.title)}&${"log"===r?`log=${JSON.stringify(e)}`:`id=${e.id}`}`,tooltip:e.page.title,tooltipDelay:500},attributes:{href:null}});this.addTooltipListener(o),s.appendChild(o)}{var a;const s=(0,i.CreateDOMElement)("div",{class:"meta"});t.appendChild(s);const l=null!==(a=e.performer)&&void 0!==a?a:e.user;{var o;const e=Object.keys(null!==(o=null==n?void 0:n.users)&&void 0!==o?o:{}).filter(e=>e!==l.name),t=l.blocked,a=this.ws.util.expiryToDate(null==t?void 0:t.expiry),d=this.ws.store.highlight.users.has(l.name),c=void 0===l.talk,u=(0,i.CreateDOMElement)("span",{class:"user-chip"+(!1===(null==t?void 0:t.partial)?" blocked":"")+(d?" highlighted":"")+(c?" empty-talk":""),dataset:!1===(null==t?void 0:t.partial)?{tooltip:`Blocked ${a===1/0?"indefinitely":`until ${a.toLocaleString()}`} (${t.reason})`,tooltipDelay:500}:d?{tooltip:"User is highlighted",tooltipDelay:500}:c?{tooltip:"User has an empty talk page",tooltipDelay:500}:{}});this.addTooltipListener(u),s.appendChild(u);const p=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.length>0?"users":l.anon?"user-secret":"user")});u.appendChild(p);const g=(0,i.CreateDOMElement)("a",{content:l.name,dataset:{multipleHrefs:`user;name=${encodeURIComponent(l.name)}`,tooltip:l.name,tooltipDelay:500},attributes:{href:null}});if(this.addTooltipListener(g),u.appendChild(g),e.length>0){const t=(0,i.CreateDOMElement)("span",{class:"other-users",content:` and ${e.length} ${r.Text.pluralize("other",e.length)}`,dataset:{tooltip:e.join(", "),tooltipDelay:500}});this.addTooltipListener(t),u.appendChild(t)}}}}{var l;const a=(0,i.CreateDOMElement)("div",{class:"subheader"});if(s.appendChild(a),(null==n?void 0:n.count)>1||t&&(null===(l=e.consecutive)||void 0===l?void 0:l.count)>1){const t=(0,i.CreateDOMElement)("div",{class:"item-comment"});a.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comments",style:{"font-size":"11px"}});t.appendChild(s);const o=null!=n?n:e.consecutive,l=(0,i.CreateDOMElement)("span",{class:"text",content:`${o.count} ${r.Text.pluralize("edit",o.count)} over the course of `,dataset:{tooltip:o.edits.map(e=>{const t=(0,i.CreateDOMElement)("div",{style:{display:"flex","flex-direction":"column",gap:"6px"}});{const n=(0,i.CreateDOMElement)("div",{style:{display:"flex","align-items":"center",gap:"6px",width:"100%","justify-content":"space-between","font-size":"13px"}});t.appendChild(n);{const t=(0,i.CreateDOMElement)("span",{style:{display:"flex","align-items":"center",gap:"4px","font-weight":"500"},content:e.user});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.anon?"user-secret":"user"),style:{"font-size":"11px",opacity:"0.7"}});t.prepend(s)}{const t=(0,i.CreateDOMElement)("span",{style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",opacity:"0.75"},content:this.ws.util.formatNotificationTime(new Date(e.timestamp)),dataset:{time:e.timestamp,timeFormat:"notification"}});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-clock",style:{"font-size":"10px",opacity:"0.7"}});t.prepend(s)}}{const n=(0,i.CreateDOMElement)("div",{style:{display:"flex","align-items":"flex-start",gap:"4px","font-size":"12px",opacity:"0.85",padding:"2px 0"},content:e.comment||"No edit summary"});t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"10px",opacity:"0.7","flex-shrink":"0","margin-top":"2px"}});n.prepend(s)}return t.outerHTML}).join("<br>"),tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(l),t.appendChild(l);const d=(0,i.CreateDOMElement)("span",{class:"time",content:this.ws.util.formatDuration(new Date(o.timestamp.old),new Date(o.timestamp.new)),dataset:{tooltip:`${new Date(o.timestamp.old).toLocaleString()}&mdash;${new Date(o.timestamp.new).toLocaleString()}`,tooltipHtml:!0,tooltipDelay:500,time:o.timestamp.old,timeNow:o.timestamp.new,timeFormat:"duration"}});this.addTooltipListener(d),t.appendChild(d)}else if(e.has_comment){const t=(0,i.CreateDOMElement)("div",{class:"item-comment"});a.appendChild(t);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"11px"}});t.appendChild(n);const s=(0,i.CreateDOMElement)("span",{class:"text",html:e.comment,dataset:{tooltip:e.comment,tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(s),t.appendChild(s)}else{const e=(0,i.CreateDOMElement)("div",{class:"item-comment none",content:"No edit summary"});a.appendChild(e)}{const t=(0,i.CreateDOMElement)("div",{class:"meta"});if(a.appendChild(t),e.minor){const e=(0,i.CreateDOMElement)("span",{class:"minor-chip",dataset:{tooltip:"Minor edit",tooltipDelay:500}});this.addTooltipListener(e),t.appendChild(e);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-m",style:{"font-size":"11px"}});e.appendChild(n)}if("sizediff"in e){const n=(0,i.CreateDOMElement)("span",{class:"diff-chip",content:Math.abs(e.sizediff).toLocaleString(),dataset:{tooltip:"Size difference",tooltipDelay:500}});if(this.addTooltipListener(n),t.appendChild(n),0!==e.sizediff){const t=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.sizediff>0?"plus":"minus"),style:{"font-size":"11px"}});n.prepend(t)}}}}}renderQueue(e=null,t=null,n=null){var s,a,r;if(document.querySelector("#previous-item-button").classList.toggle("disabled",!this.ws.queue.canGoPrevious()),document.querySelector("#next-item-button").classList.toggle("disabled",!this.ws.queue.canGoNext()),null!=e||(e=this.ws.queue.current.queue),null!=t||(t=this.ws.queue.current.item),null!=n||(n=this.ws.queue.current.type),this.updateQueueTabs(),n!==this.ws.queue.current.type)return;const o=document.querySelector("#queue-items");if(0===e.length){var l,d;const e=document.createElement("div");return e.classList.add("queue-empty"),e.textContent="No items in queue",o.innerHTML=e.outerHTML,void((null===(l=this.ws.queue.queues[n].previous)||void 0===l?void 0:l.id)!==(null===(d=t)||void 0===d?void 0:d.id)&&(this.ws.queue.queues[n].previous=t,this.newCurrentItem(t)))}o.querySelectorAll(".queue-empty").forEach(e=>e.remove());const c=new Map;for(const e of o.children)c.set(+e.dataset.id,e);let u=null;for(const s of e){var p;let i=c.get(s.id);var g;if(!i)i=document.createElement("div"),i.classList.add("queue-item"),i.dataset.id=s.id,i.dataset.type=n,i.innerHTML=this.generateItemHTML(s,"pending"!==n),null===(g=i.querySelector(".remove-button"))||void 0===g||g.addEventListener("click",i=>{i.stopPropagation();const a=e.findIndex(e=>e.id===s.id);var r;a>=0&&(s.id===(null===(r=t)||void 0===r?void 0:r.id)?this.ws.queue.next():(e.splice(a,1),this.ws.queue.queues[n].history.push({...s,history:performance.now()}),this.removeQueueItem(n,s.id),this.renderQueue()))}),s.mentions.has&&this.ws.store.settings.username_highlighting.enabled&&(i.classList.add("mentions-me"),i.dataset.tooltip="This queue item contains your username",this.addTooltipListener(i)),i.addEventListener("click",()=>{this.ws.queue.queues[n].item=s,this.ws.current=this.ws.queue.queues[n],this.renderQueue()}),o.appendChild(i),c.set(s.id,i),i.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e));null===u?i!==o.firstChild&&o.insertBefore(i,o.firstChild):i.previousSibling!==u&&o.insertBefore(i,u.nextSibling),i.classList.toggle("current",s.id===(null===(p=t)||void 0===p?void 0:p.id)),u=i}for(const[t,n]of c.entries())e.some(e=>e.id===t)||n.remove();let h=null;for(const t of e){if(!1===t.history)break;h=t}if(null===(s=o.querySelector(".historical-bar"))||void 0===s||s.remove(),null!==h){const e=(0,i.CreateDOMElement)("div",{class:"historical-bar"});o.insertBefore(e,c.get(h.id).nextSibling);const t=(0,i.CreateDOMElement)("span",{class:"label"});e.appendChild(t);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-box-archive",attributes:{title:"All items above this line have been viewed"}});t.appendChild(n)}(null===(a=this.ws.queue.queues[n].previous)||void 0===a?void 0:a.id)!==(null===(r=t)||void 0===r?void 0:r.id)&&(this.ws.queue.queues[n].previous=t,this.newCurrentItem(t))}removeQueueItem(e,t){const n=document.querySelector(`.queue-item[data-type="${e}"][data-id="${t}"]`);n&&(n.remove(),this.updateQueueTabs([e]))}clearQueueItems(){document.querySelector("#queue-items").innerHTML="",this.renderQueue()}updateHiddenItems(e){if(void 0===e&&(e=this.ws.queue.current.item),null===e)return this.ws.store.UI.hide_tools,document.querySelectorAll("[data-queue-type]").forEach(e=>e.classList.add("hidden"));let t=e.type;"abuselog"===t&&e.revid&&(t="edit");const n=c.Queue.groups[t];document.querySelectorAll("[data-queue-type]").forEach(e=>{const t=e.dataset.queueType||"*";"*"===t?e.classList.remove("hidden"):e.classList.toggle("hidden",!t.split(",").includes(n))})}async newCurrentItem(e=null,t=!1){var n,s;null===(n=this.controllers.current)||void 0===n||n.abort();const a=new AbortController;this.controllers.current=a,null!==e&&(this.updateDiffDisplay("loading"),await this.ws.queue.propagate(e,!0)),this.stopOutdatedCheck(),this.toggleEditWarNotice((null==e?void 0:e.reverts)>=3,(null==e?void 0:e.reverts)||0),this.toggleOutdatedNotice(!1),this.togglePendingNotice(!1),this.closeMenus(),this.removeTooltips(),document.querySelectorAll("#right-top > div > :not(.hidden)").forEach(e=>e.classList.add("hidden"));const r=document.querySelector("#user-contributions > .queue-list");r.innerHTML="";const o=document.querySelector("#page-history > .queue-list");if(o.innerHTML="",document.querySelector("#user-contributions > .header > .pills").innerHTML="",document.querySelector("#page-history > .header > .pills").innerHTML="",document.querySelector("#pending-changes-container").classList.toggle("hidden",!(this.ws.rights.review&&this.ws.queue.pending.has(null==e?void 0:e.id))),this.updateHiddenItems(e),null===e)return this.generateEditDetails(),document.querySelector("#diff-container").innerHTML="",document.querySelector("#diff-scroll-up").classList.add("hidden"),document.querySelector("#diff-scroll-down").classList.add("hidden"),document.querySelector("#ai-analysis-container").classList.add("hidden"),void([...document.querySelectorAll("#queue-tabs > .queue-tab")].every(e=>"none"===getComputedStyle(e).display)&&(document.querySelector("#diff-container").innerHTML='\n\t\t\t\t\t<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: grey;">\n\t\t\t\t\t\t<div style="font-size: 48px; margin-bottom: 16px;">\n\t\t\t\t\t\t\t<i class="fas fa-shield-alt"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 24px; margin-bottom: 8px; text-align: center;">\n\t\t\t\t\t\t\tNo queues are enabled\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 14px; text-align: center; max-width: 100%; margin-top: 10px;">\n\t\t\t\t\t\t\tI heard there was a WikiShield,<br>\n\t\t\t\t\t\t\tWhich entered an oversaturated field,<br>\n\t\t\t\t\t\t\tBut you don&rsquo;t ever use Huggle, do you?<br>\n\t\t\t\t\t\t\tWell it simplifies any AIV,<br>\n\t\t\t\t\t\t\tBut superintendence matters to me\n\t\t\t\t\t\t\t<span style="display: block; margin-top: 8px;">&mdash; User:WikiMacaroons</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t'));const l=e.type,d=c.Queue.groups[l];if(!t&&"abuselog"===l&&!e.revid){const t=async()=>{a.signal.aborted||this.ws.api.getAbuseLogRevid(e.id).then(n=>{var s,i;n&&(e.revid=n,e.id===(null===(i=this.ws.queue.current.item)||void 0===i?void 0:i.id)&&this.newCurrentItem(this.ws.queue.current.item,!0));e.id===(null===(s=this.ws.queue.current.item)||void 0===s?void 0:s.id)&&setTimeout(()=>t(),1e3)})};t()}const u=null==e||null===(s=e.page)||void 0===s?void 0:s.watched;if(document.querySelector("#page-watch").classList.toggle("hidden",!0===u),document.querySelector("#page-unwatch").classList.toggle("hidden",!0!==u),document.querySelector("#user-report-uaa").classList.toggle("hidden",null==e?void 0:e.user.anon),document.querySelector("#user-request-global-lock").classList.toggle("hidden",null==e?void 0:e.user.anon),this.ws.AI){const t=this.ws.store;null===e.AI.edit&&t.settings.AI.edit_analysis.enabled&&this.ws.AI.analyze.edit(e).then(t=>{e.AI.edit=t}).catch(t=>{e.AI.edit={error:t.message}}).finally(()=>{var t;e.id===(null===(t=this.ws.queue.current.item)||void 0===t?void 0:t.id)&&this.updateAIAnalysisDisplay(e.AI.edit)}),null!==e.AI.username||e.user.anon||t.whitelist.users.has(e.user)||!t.settings.AI.username_analysis.enabled||this.ws.AI.analyze.username(e).then(t=>{e.AI.username=t,t.flag&&this.ws.queue.promptUAA(e,t)}).catch(t=>{e.AI.username={error:t.message}})}if(this.updateAIAnalysisDisplay(e.AI.edit),!e.seen)switch(e.seen=!0,this.ws.store.statistics.edits_reviewed.total++,this.ws.queue.current.type){case"recent":this.ws.store.statistics.recent_changes_reviewed.total++;break;case"pending":this.ws.store.statistics.pending_changes_reviewed.total++;break;case"watchlist":this.ws.store.statistics.watchlist_changes_reviewed.total++;break;case"users":this.ws.store.statistics.users_reviewed.total++}{const t=(0,i.CreateDOMElement)("div",{class:"pill",content:`${e.user.edits.toLocaleString()} edit${1===e.user.edits?"":"s"}`});document.querySelector("#user-contributions > .header > .pills").appendChild(t)}if("0"!==e.user.warning){const t=(0,i.CreateDOMElement)("div",{class:`pill uw-${e.user.warning}`});document.querySelector("#user-contributions > .header > .pills").appendChild(t),t.textContent=`uw-${e.user.warning}`;const n=e.user.warnings;if(n.length>0){const s=document.createElement("div"),i=document.createElement("div");i.classList.add("tooltip-title"),i.textContent=`Warnings for ${e.user.name}`,s.appendChild(i);for(const e of n){const t=document.createElement("div");t.classList.add("tooltip-item","user-warnings"),s.appendChild(t);const n=document.createElement("span");n.classList.add("tooltip-item-level"),n.textContent=`${e.template}${e.level}`,t.appendChild(n);const i=document.createElement("div");i.classList.add("tooltip-item-details"),t.appendChild(i);const a=document.createElement("span");a.classList.add("tooltip-item-user"),a.textContent=e.username?`by User:${e.username}`:"by Unknown",i.appendChild(a),i.appendChild(document.createElement("br"));const r=document.createElement("span");r.classList.add("tooltip-item-date"),i.appendChild(r),e.timestamp?(r.dataset.time=e.timestamp,r.dataset.timeFormat="notification",r.textContent=this.ws.util.formatNotificationTime(new Date(e.timestamp))):r.textContent="Date unknown"}t.dataset.tooltip=s.innerHTML,t.dataset.tooltipHtml=!0}this.addTooltipListener(t)}const p=e.user.blocks;if(p.length>0){const t=(0,i.CreateDOMElement)("div",{class:"pill ub"});document.querySelector("#user-contributions > .header > .pills").appendChild(t);const n=document.createElement("div"),s=document.createElement("div");s.classList.add("tooltip-title"),s.textContent=`Blocks for ${e.user.name}`,n.appendChild(s);for(const e of p){var g;const t=document.createElement("div");t.classList.add("tooltip-item","user-blocks"),n.appendChild(t);const s=document.createElement("span");s.classList.add("tooltip-item-level"),s.innerHTML=e.parsedcomment||"No reason provided",t.appendChild(s);const i=document.createElement("div");i.classList.add("tooltip-item-details"),t.appendChild(i);const a=document.createElement("span");a.classList.add("tooltip-item-user"),a.textContent=e.user?`by User:${e.user}`:"by Unknown",i.appendChild(a),i.appendChild(document.createElement("br"));const r=document.createElement("span");r.classList.add("tooltip-item-time"),i.appendChild(r);const o=document.createElement("span");e.timestamp?(o.dataset.time=e.timestamp,o.dataset.timeFormat="notification",o.textContent=this.ws.util.formatNotificationTime(new Date(e.timestamp))):o.textContent="Date unknown",r.appendChild(o);const l=document.createElement("span");l.textContent=`(for ${(null===(g=e.params)||void 0===g?void 0:g.duration)||"an unknown duration"})`,r.appendChild(l)}t.classList.remove("hidden"),t.textContent=`${p.length} block${1===p.length?"":"s"}`,t.dataset.tooltip=n.innerHTML,t.dataset.tooltipHtml=!0,this.addTooltipListener(t)}{const t=document.querySelector("#user-whitelist"),n=document.querySelector("#user-unwhitelist");if(t&&n){const s=()=>{const s=this.ws.store.whitelist.users.has(e.user.name);t.classList.toggle("hidden",s),n.classList.toggle("hidden",!s)};t.onclick=s,n.onclick=s,s()}const s=document.querySelector("#user-highlight"),i=document.querySelector("#user-unhighlight");if(s&&i){const t=()=>{const t=this.ws.store.highlight.users.has(e.user.name);s.classList.toggle("hidden",t),i.classList.toggle("hidden",!t)};s.onclick=t,i.onclick=t,t()}}{const t=document.querySelector("#page-whitelist"),n=document.querySelector("#page-unwhitelist");if(t&&n){const s=()=>{const s=this.ws.store.whitelist.pages.has(e.page.title);t.classList.toggle("hidden",s),n.classList.toggle("hidden",!s)};t.onclick=s,n.onclick=s,s()}const s=document.querySelector("#page-highlight"),i=document.querySelector("#page-unhighlight");if(s&&i){const t=()=>{const t=this.ws.store.highlight.pages.has(e.page.title);s.classList.toggle("hidden",t),i.classList.toggle("hidden",!t)};s.onclick=t,i.onclick=t,t()}}(async t=>{const n=e.user.contributions;for(const e of n){var s;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(s=this.ws.queue.current.item.revid)&&void 0!==s?s:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML({page:{title:e.title},user:{name:e.user},comment:"Loading...",timestamp:e.timestamp,sizediff:0,ores:NaN,tags:e.tags||[],type:"edit"}),r.appendChild(t),requestAnimationFrame(()=>t.classList.remove("no-transition"))}if(e.page.cached_contributions){const s=await e.page.cached_contributions;if(t.aborted)return;n.some((e,t)=>{var n;return e.id!==(null===(n=s[t])||void 0===n?void 0:n.id)})&&delete e.page.cached_contributions}e.user.cached_contributions||(e.user.cached_contributions=this.ws.queue.generate("edit",n,!0));const i=await e.user.cached_contributions;if(!t.aborted){r.innerHTML="";for(const e of i.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp))){var a;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(a=this.ws.queue.current.item.revid)&&void 0!==a?a:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML(e),r.appendChild(t),t.addEventListener("mouseover",()=>this.ws.queue.propagate(e,!0)),t.addEventListener("click",()=>this.ws.queue.loadFromItem(e)),t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e)),requestAnimationFrame(()=>t.classList.remove("no-transition"))}}})(a.signal).catch(e=>{a.signal.aborted||console.error("Error loading contributions:",e)});switch(d){case"edit":{var h;if(this.startOutdatedCheck(e),!this.ws.queue.pending.has(e.id))(null===(h=e.consecutive)||void 0===h?void 0:h.count)>=2&&(document.querySelector("#latest-edits-tab").classList.remove("hidden"),document.querySelector("#consecutive-edits-tab").classList.remove("hidden"));const t=e.page.protection;if(t.protected||this.ws.queue.pending.has(e.id)){const n=(0,i.CreateDOMElement)("div",{class:"pill"});if(document.querySelector("#page-history > .header > .pills").appendChild(n),t.protected){let e,s;switch(t.level){case"sysop":e="F",s="Requires sysop right to edit";break;case"template":e="T",s="Requires template editor to edit";break;case"extendedconfirmed":e="EC",s="Requires extended confirmed right to edit";break;case"autoconfirmed":e="AC",s="Requires autoconfirmed right to edit";break;default:e="?",s="Uknown protection level"}n.innerHTML=`<i class="fas fa-lock"></i> <span class="protection-icon" data-tooltip="${s}">${e}</span>`,this.addTooltipListener(n.querySelector("[data-tooltip]"))}else if(this.ws.queue.pending.has(e.id)){var m;const t=(null===(m=this.ws.queue.pending.get(e.id).pending.stability)||void 0===m?void 0:m.parsedcomment)||"No comment provided",s=document.createElement("span");s.classList.add("protection-icon"),s.innerHTML="<i class='fas fa-lock'></i> PC",s.dataset.tooltip=t,s.dataset.tooltipHtml=!0,n.appendChild(s),this.addTooltipListener(n.querySelector("[data-tooltip]"))}}for(const t of e.page.metadata){const e=(0,i.CreateDOMElement)("div",{class:"pill",content:t});document.querySelector("#page-history > .header > .pills").appendChild(e)}}break;case"logevent":break;case"abuselog":{e.revid&&this.startOutdatedCheck(e);const t=document.querySelector("#protection-indicator");if(t){const n=e.page.protection;if(n.protected){let e,s;switch(n.level){case"sysop":e="P",s="Requires sysop right to edit";break;case"extendedconfirmed":e="X",s="Requires extended confirmed right to edit";break;case"autoconfirmed":e="A",s="Requires autoconfirmed right to edit";break;default:e="?",s="Uknown protection level"}t.innerHTML=`<span class="protection-icon" data-tooltip="${s}">${e}</span>`,this.addTooltipListener(t.querySelector("[data-tooltip]"))}else if(this.ws.queue.pending.has(e.id)){var v;const n=(null===(v=this.ws.queue.pending.get(e.id).pending.stability)||void 0===v?void 0:v.parsedcomment)||"No comment provided",s=document.createElement("span");s.classList.add("protection-icon"),s.textContent="PC",s.dataset.tooltip=n,s.dataset.tooltipHtml=!0,t.appendChild(s),this.addTooltipListener(t.querySelector("[data-tooltip]"))}else t.innerHTML=""}}}if("edit"===d||"abuselog"===d){(async t=>{const n=e.page.history;for(const e of n){var s;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(s=this.ws.queue.current.item.revid)&&void 0!==s?s:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML({page:{title:e.title},user:{name:e.user},comment:"Loading...",timestamp:e.timestamp,sizediff:0,ores:NaN,tags:e.tags||[],type:"edit"}),o.appendChild(t),requestAnimationFrame(()=>t.classList.remove("no-transition"))}if(e.page.cached_history){const s=await e.page.cached_history;if(t.aborted)return;n.some((e,t)=>{var n;return e.id!==(null===(n=s[t])||void 0===n?void 0:n.id)})&&delete e.page.cached_history}e.page.cached_history||(e.page.cached_history=this.ws.queue.generate("edit",n,!0));const i=await e.page.cached_history;if(!t.aborted){o.innerHTML="";for(const e of i.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp))){var a;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(a=this.ws.queue.current.item.revid)&&void 0!==a?a:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML(e),o.appendChild(t),t.addEventListener("mouseover",()=>this.ws.queue.propagate(e,!0)),t.addEventListener("click",()=>this.ws.queue.loadFromItem(e)),t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e)),requestAnimationFrame(()=>t.classList.remove("no-transition"))}}})(a.signal).catch(e=>{a.signal.aborted||console.error("Error loading history:",e)})}this.updateDiffDisplay(e,!1)}updateDiffDisplay(e,t){var n;const s=document.querySelector("#diff-container");if(!e)return document.querySelector("#diff-scroll-up").classList.add("hidden"),void document.querySelector("#diff-scroll-down").classList.add("hidden");if("loading"===e){const e=document.createElement("div");e.className="loading-container";const t=document.createElement("div");t.className="loading-spinner",e.appendChild(t);const n=document.createElement("i");n.className="fas fa-spinner fa-spin",t.appendChild(n);const i=document.createElement("div");return i.className="loading-text animate-loading-dots",i.textContent="Loading edit",e.appendChild(i),void(s.innerHTML=e.outerHTML)}switch(document.querySelectorAll("#right-top > .tabs > .tab.selected").forEach(e=>e.classList.remove("selected")),this.generateEditDetails(e,t),c.Queue.groups[e.type]){case"edit":var i,a;if(this.ws.queue.pending.get(e.id))s.innerHTML=`<table>${null!==(i=e.diff)&&void 0!==i?i:"<em>No diff available</em>"}</table>`;else if(t&&(null===(a=e.consecutive)||void 0===a?void 0:a.count)>1){var r,o;document.querySelector("#consecutive-edits-tab").classList.add("selected"),null===(r=e.consecutive.diff)||void 0===r||r?s.innerHTML=`<table>${null!==(o=e.consecutive.diff)&&void 0!==o?o:"<em>No diff available</em>"}</table>`:s.innerHTML="<table><em>No difference</em></table>"}else{var l;document.querySelector("#latest-edits-tab").classList.add("selected"),s.innerHTML=`<table>${null!==(l=e.diff)&&void 0!==l?l:"<em>No diff available</em>"}</table>`}if(this.ws.store.settings.username_highlighting.enabled){const t=this.ws.api.username;t&&(e.mentions.diff&&s.querySelectorAll("td").forEach(e=>{e.textContent&&this.ws.util.match(t,e.textContent)&&e.classList.add("ws-username-highlight")}),e.mentions.comment&&e.comment&&this.ws.util.match(t,e.comment)&&document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"))}break;case"logevent":if("users"===e.type){s.innerHTML="";const t=e.user.profanity,n=document.createElement("div");n.classList.add("profanity"),s.appendChild(n);const i=document.createElement("div");{i.classList.add("profanity-header"),n.appendChild(i);const e=document.createElement("div");{e.classList.add("profanity-score"),i.appendChild(e);const n=document.createElement("span");n.classList.add("score-label"),n.textContent="Profanity Score:",e.appendChild(n);const s=document.createElement("span");s.classList.add("score-value"),s.textContent=t.finalScore,e.appendChild(s)}const s=document.createElement("div");{s.classList.add("profanity-risk",`risk-${t.risk.toLowerCase()}`),i.appendChild(s);const e=document.createElement("span");switch(e.classList.add("fa"),t.risk){case"No":e.classList.add("fa-smile");break;case"Low":e.classList.add("fa-thumbs-up");break;case"Medium":e.classList.add("fa-meh");break;case"High":e.classList.add("fa-thumbs-down");break;case"Critical":e.classList.add("fa-skull-crossbones")}s.appendChild(e);const n=document.createElement("span");n.textContent=`${t.risk} risk`,s.appendChild(n)}}const a=t.matches;if(a.length>0){const e=document.createElement("div");e.classList.add("profanity-matches-header"),n.appendChild(e);const t=document.createElement("span");t.classList.add("fa","fa-search"),e.appendChild(t);const s=document.createElement("span");s.textContent=`Matched Terms (${a.length})`,e.appendChild(s);const i=document.createElement("div");i.classList.add("profanity-matches-list"),n.appendChild(i);for(const e of a){const t=document.createElement("div");{t.classList.add("profanity-match"),i.appendChild(t);const n=document.createElement("div");{n.classList.add("match-header"),t.appendChild(n);const s=document.createElement("span");s.classList.add("match-text"),s.textContent=e.match,n.appendChild(s);const i=document.createElement("span");i.classList.add("fa","fa-arrow-right"),n.appendChild(i);const a=document.createElement("span");a.classList.add("match-name"),a.textContent=e.name,n.appendChild(a)}const s=document.createElement("div");{s.classList.add("match-details"),t.appendChild(s);const n=document.createElement("div");{n.classList.add("match-stat"),s.appendChild(n);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Confidence",n.appendChild(t);const i=document.createElement("span");i.classList.add("stat-value"),i.dataset.tooltip="How certain we are this is a match.",i.dataset.tooltipDelay=500,i.textContent=`${Math.round(100*e.confidence)}%`,n.appendChild(i)}const i=document.createElement("div");{i.classList.add("match-stat"),s.appendChild(i);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Obfuscation",i.appendChild(t);const n=document.createElement("span");n.classList.add("stat-value"),n.dataset.tooltip="How much the term was altered from its original form.",n.dataset.tooltipDelay=500,n.textContent=`${Math.round(100*e.obfuscation)}%`,i.appendChild(n)}const a=document.createElement("div");{a.classList.add("match-stat"),s.appendChild(a);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Severity",a.appendChild(t);const n=document.createElement("span");n.classList.add("stat-value",`severity-${e.severity}`),n.dataset.tooltip="How severe this term is considered.",n.dataset.tooltipDelay=500,n.textContent=e.severity,a.appendChild(n)}}if(e.note){const n=document.createElement("div");{n.classList.add("match-note"),t.appendChild(n);const s=document.createElement("span");s.classList.add("fa","fa-info-circle"),n.appendChild(s);const i=document.createElement("span");i.classList.add("note-text"),i.textContent=e.note,n.appendChild(i)}}}t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e))}}else{const e=document.createElement("div");e.classList.add("profanity-no-matches"),n.appendChild(e);const t=document.createElement("span");t.classList.add("fa","fa-check-circle"),e.appendChild(t);const s=document.createElement("span");s.textContent="No profanity detected.",e.appendChild(s)}}break;case"abuselog":var d;if(s.innerHTML=`<table>${null!==(d=e.diff)&&void 0!==d?d:"<em>No diff available</em>"}</table>`,this.ws.store.settings.username_highlighting.enabled){const t=this.ws.api.username;t&&(e.mentions.diff&&s.querySelectorAll("td").forEach(e=>{e.textContent&&this.ws.util.match(t,e.textContent)&&e.classList.add("ws-username-highlight")}),e.mentions.comment&&e.comment&&this.ws.util.match(t,e.comment)&&document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"))}}s.querySelectorAll(":is(.mw-diff-movedpara-left, .mw-diff-movedpara-right)").forEach(e=>{const t=e.href.split("#")[1];delete e.href,e.innerHTML=e.classList.contains("mw-diff-movedpara-left")?">":"<",e.addEventListener("click",e=>{e.preventDefault();const n=s.querySelector(`a[name="${t}"]`);if(n){const e=n.getBoundingClientRect(),t=s.getBoundingClientRect(),i=e.top-t.top+s.scrollTop-(t.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),s.querySelectorAll(".flash-highlight").forEach(e=>e.classList.remove("flash-highlight"));const a=n.parentElement.parentElement;a.classList.add("flash-highlight"),setTimeout(()=>{var e;return null==a||null===(e=a.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)}})});const u=s.querySelectorAll(".diff-addedline, .diff-deletedline"),p=null!==(n=s.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange")[0])&&void 0!==n?n:u[0];p?requestAnimationFrame(()=>{const e=p.getBoundingClientRect(),t=s.getBoundingClientRect(),n=e.top-t.top+s.scrollTop-(t.height-e.height)/2;function i(){const e=s.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange");let t=null,n=null;const i=s.getBoundingClientRect();for(const s of e){let e=!1,a=!1;const r=s.getBoundingClientRect();r.bottom<i.top&&(e=!0),r.top>i.bottom&&(a=!0),e&&a||(e&&(t=s),null===n&&a&&(n=s))}const a=document.querySelector("#diff-scroll-up");a.classList.toggle("hidden",!t),a.onclick=()=>{const e=t.getBoundingClientRect(),n=s.getBoundingClientRect(),i=e.top-n.top+s.scrollTop-(n.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),t.classList.add("flash-highlight"),setTimeout(()=>{var e;return null===(e=t)||void 0===e||null===(e=e.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)};const r=document.querySelector("#diff-scroll-down");r.classList.toggle("hidden",!n),r.onclick=()=>{const e=n.getBoundingClientRect(),t=s.getBoundingClientRect(),i=e.top-t.top+s.scrollTop-(t.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),n.classList.add("flash-highlight"),setTimeout(()=>{var e;return null===(e=n)||void 0===e||null===(e=e.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)}}s.scrollTo({top:Math.max(0,n),behavior:"smooth"}),i(),s.onscroll=()=>requestAnimationFrame(i),window.onresize=()=>requestAnimationFrame(i)}):(document.querySelector("#diff-scroll-up").classList.add("hidden"),document.querySelector("#diff-scroll-down").classList.add("hidden"))}updateAIAnalysisDisplay(e){const t=document.querySelector("#ai-analysis-container");if(!t||!e)return t.classList.add("hidden");if(t.classList.remove("hidden"),e.error){const n=t.querySelector(":scope > .header > .assessment");n.textContent="Error",n.className="assessment error",t.querySelector(":scope > .header > .confidence").textContent="",t.querySelector(":scope > .explanation").textContent=e.error;t.querySelector(":scope > .issues").innerHTML=""}else{const n=t.querySelector(":scope > .header > .assessment");n.textContent=e.assessment,n.className=`assessment ${e.assessment.toLowerCase().replace(/\s+/g,"-")}`,t.querySelector(":scope > .header > .confidence").textContent=`${Math.round(100*(e.confidence||0))}% confidence`;const s=function(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}(v,this,b).call(this,e.explanation||"No explanation provided.");t.querySelector(":scope > .explanation").innerHTML=s;const i=t.querySelector(":scope > .issues");i.innerHTML="";for(const t of e.issues||[]){const e=document.createElement("div");e.classList.add("issue",t.severity.toLowerCase().replace(/\s+/g,"-")),e.textContent=t.policy,i.appendChild(e)}t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e))}}async outdated(e){let t=e.type,n=e.id;if("abuselog"===t&&e.revid&&(t="edit",n=e.revid),"edit"!==c.Queue.groups[t])return this.toggleOutdatedNotice(!1),void this.togglePendingNotice(!1);if("pending"===e.type)return this.togglePendingNotice(!this.ws.queue.pending.has(n),!0);if(!e.pending&&"pending"===this.ws.queue.type)return this.togglePendingNotice(!0,!1);try{var s;const t=(await this.ws.api.getLatestIds([e.page.title]))[e.page.title];(null===(s=this.ws.queue.current.item)||void 0===s?void 0:s.id)===e.id&&this.toggleOutdatedNotice(t>n,t,e.page.title,n)}catch(e){console.error("Error checking if edit is outdated:",e),this.toggleOutdatedNotice(!1)}}startOutdatedCheck(e){this.stopOutdatedCheck(),this.outdated(e),this.intervals.outdated=setInterval(()=>{var t;e.id===(null===(t=this.ws.queue.current.item)||void 0===t?void 0:t.id)?this.outdated(e):this.stopOutdatedCheck()},1e3)}stopOutdatedCheck(){this.intervals.outdated&&(clearInterval(this.intervals.outdated),this.intervals.outdated=null),this.toggleOutdatedNotice(!1),this.togglePendingNotice(!1)}toggleEditWarNotice(e,t){const n=document.querySelector("#edit-war-notice");if(null!=e||(e=!n),e!==Boolean(n))if(e){const e=document.createElement("div");e.id="edit-war-notice",e.classList.add("notice","edit-war");const n=document.createElement("span");n.classList.add("fa","fa-warning"),e.appendChild(n);const s=document.createElement("span");s.classList.add("text"),s.innerHTML=`<b>3RR:</b> You have made ${t} reverts on this page in the last 24 hours.`,e.appendChild(s);const i=document.querySelector("#diff-container");i.parentElement.insertBefore(e,i)}else{const e=document.querySelector("#edit-war-notice");e&&e.remove()}}toggleOutdatedNotice(e,t,n,s){const i=document.querySelector("#outdated-notice");if(null!=e||(e=!i),e!==Boolean(i))if(e){const e=document.createElement("div");e.id="outdated-notice",e.classList.add("notice","outdated"),e.dataset.id=t,e.dataset.page=n;const s=document.createElement("span");s.classList.add("fa","fa-clock-rotate-left"),e.appendChild(s);const i=document.createElement("span");i.classList.add("text"),i.textContent="Newer revision available on this page.",e.appendChild(i);const a=document.createElement("span");a.classList.add("button"),a.innerHTML="<i class='fas fa-redo restore'></i> Restore this revision",a.addEventListener("click",async e=>{e.preventDefault();const t=await this.dialog.input("Restore Edit","Are you sure you want to restore this revision? This will create a new edit that reverts the page to this revision.","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"restore-edit",params:{summary:t}}]})}),e.appendChild(a);const r=document.createElement("span");r.classList.add("button"),r.innerHTML="View latest <i class='fas fa-arrow-right'></i>",r.addEventListener("click",t=>{t.preventDefault();const n=e.dataset.page,s=+e.dataset.id;n&&s&&this.ws.queue.loadFromRevision(n,s)}),e.appendChild(r);const o=document.querySelector("#diff-container");o.parentElement.insertBefore(e,o)}else{const e=document.querySelector("#outdated-notice");e&&e.remove()}else i&&(i.dataset.id=t,i.dataset.page=n)}togglePendingNotice(e,t){const n=document.querySelector("#pending-notice");if(null!=e||(e=!n),e!==Boolean(n))if(e){const e=document.createElement("div");e.id="pending-notice",e.classList.add("notice","outdated","pending");const n=document.createElement("span");n.classList.add("fa","fa-shield-alt"),e.appendChild(n);const s=document.createElement("span");s.classList.add("text"),s.textContent=t?"This revision cannot be reviewed because it is outdated":"This revision cannot be reviewed because it is not pending review",e.appendChild(s);const i=document.querySelector("#diff-container");i.parentElement.insertBefore(e,i)}else{const e=document.querySelector("#pending-notice");e&&e.remove()}}getORESColor(e){if(isNaN(e)||e<0)return"rgba(128, 128, 128, .5)";e=Math.min(Math.max(e||0,0),1);const t=f.palettes[this.ws.store.UI.theme.palette];return t[e*(t.length-1)|0]}updatePalette(){document.querySelectorAll("[data-ores]").forEach(e=>{e.style.setProperty("--ores-color",this.getORESColor(parseFloat(e.dataset.ores)))})}updateZenMode(){this.ws.notifications.count();const e=this.ws.store.settings.zen_mode;e.enabled&&e.music.enabled?this.ws.audio.zengine.start():this.ws.audio.zengine.stop(),document.querySelectorAll("[data-zen-show]").forEach(t=>{const n=t.dataset.zenShow.split(",");e.enabled&&!n.some(t=>{var n;return null===(n=e[t])||void 0===n?void 0:n.enabled})?t.style.display="none":t.style.display=""})}updateAccessibility(){document.body.classList.toggle("colorblind-mode",this.ws.store.settings.accessibility.colorblind),document.body.classList.toggle("dyslexia-font",this.ws.store.settings.accessibility.dyslexia),document.body.classList.toggle("high-contrast",this.ws.store.settings.accessibility.high_contrast),document.body.classList.toggle("reduce-motion",this.ws.store.settings.accessibility.reduce_motion)}reorderQueues(){var e;const t=c.Queue.types.map(e=>({name:e,...this.ws.store.settings.queue[e]}));t.sort((e,t)=>e.order-t.order),t.forEach(e=>{const t=document.querySelector(`#queue-tab-${e.name}`);t&&(t.style.display=e.enabled?"":"none",t.parentElement.appendChild(t))});const n=t.find(e=>e.name===this.ws.queue.current.type)?this.ws.queue.current.type:null===(e=t.find(e=>e.enabled))||void 0===e?void 0:e.name;if(n)this.ws.queue.switch(n);else{const e=document.createElement("div");e.classList.add("queue-empty"),e.textContent="No items in queue",document.querySelector("#queue-items").innerHTML=e.outerHTML,this.newCurrentItem(null),this.ws.queue.switch("void")}}updateQueueTabs(e=c.Queue.types){const t=this.ws.queue.queues;e.forEach(e=>{const n=document.querySelector(`#queue-tab-${e}`);if(!n||!t[e])return;const s=n.querySelector(":scope > span > .icon-count"),i=t[e].queue.length;s.classList.toggle("hidden",0===i),s.textContent=i,n.classList.toggle("mentions-me",this.ws.store.settings.username_highlighting.enabled&&t[e].queue.some(e=>e.mentions.has))})}createTooltip(e,t="",n="",s=!1,i=10,a=null){const r=document.createElement("div");r.className=`tooltip ${t}`,r.style.opacity=0,s?r.innerHTML=n:r.textContent=n,document.body.querySelector("#app").appendChild(r),"function"==typeof a&&a(r),r.offsetHeight;const o=r.getBoundingClientRect(),l=o.width,d=o.height,c=e.getBoundingClientRect(),u=innerWidth,p=innerHeight,g=[["bottom",(c.left+c.right)/2-l/2,c.bottom+10,!0],["top",(c.left+c.right)/2-l/2,c.top-d-10,!0],["right",c.right+10,(c.top+c.bottom)/2-d/2,!0],["left",c.left-l-10,(c.top+c.bottom)/2-d/2,!0]];let h=null,m=-1/0;for(const[e,t,n,s]of g){let e=t,i=n;if(e>=0&&e+l<=u&&i>=0&&i+d<=p){m=100,h=[e,i];break}if(s){const s=Math.max(0,Math.min(e,u-l)),a=Math.max(0,Math.min(i,p-d)),r=!(s+l<=c.left||s>=c.right||a+d<=c.top||a>=c.bottom),o=Math.abs(s-t)+Math.abs(a-n),g=r?-50-o:50-o/10;g>m&&(m=g,h=[s,a])}}return h?(r.style.left=`${h[0]}px`,r.style.top=`${h[1]}px`):(r.style.left=`${Math.max(0,Math.min((c.left+c.right)/2-l/2,u-l))}px`,r.style.top=`${Math.max(0,Math.min((c.top+c.bottom)/2-d/2,p-d))}px`),e.addEventListener("mousewheel",e=>r.scrollBy({left:e.deltaX,top:e.deltaY,behavior:"smooth"})),setTimeout(()=>r.style.opacity=1,i),r}removeTooltips(){document.querySelectorAll(".tooltip").forEach(e=>e.remove())}addTooltipListener(e){if(!e.dataset.tooltip)return;let t;e.addEventListener("mouseenter",()=>{e.dataset.tooltip&&(t&&t.remove(),t=this.createTooltip(e,"",e.dataset.tooltip,"true"===e.dataset.tooltipHtml,+e.dataset.tooltipDelay||100))}),e.addEventListener("mouseleave",()=>{t&&(t.remove(),t=null)})}positionBottomMenu(e,t){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="";const n=()=>{if(!t.classList.contains("show"))return;const s=t.getBoundingClientRect(),i=e.getBoundingClientRect(),a=innerWidth,r=innerHeight;i.left+s.width<=a?(t.style.left=`${i.left}px`,t.style.right="auto"):(t.style.right=a-i.right+"px",t.style.left="auto");i.top>=s.height?(t.style.bottom=r-i.top+"px",t.style.top="auto"):(t.style.top=`${i.bottom}px`,t.style.bottom="auto"),requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionSubmenu(e,t){e.style.left="",e.style.right="",e.style.top="",e.style.bottom="";const n=()=>{if(!e.classList.contains("show"))return;const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left;o<s.width+20&&l>o&&(e.style.left="auto",e.style.right="calc(100% + 4px)");const d=r-i.bottom,c=i.top;s.bottom>r&&c>d&&(e.style.top="auto",e.style.bottom="0"),requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionLevelsMenu(e,t){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="";const n=()=>{if(!t.classList.contains("show"))return;const s=t.getBoundingClientRect(),i=e.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left,d=o>=s.width+8,c=l>=s.width+8;d?(t.style.left=`${i.right+8}px`,t.style.right="auto"):c?(t.style.right=a-i.left+8+"px",t.style.left="auto"):o>l?(t.style.left=`${i.right+8}px`,t.style.right="auto"):(t.style.right=a-i.left+8+"px",t.style.left="auto");const u=Math.max(Math.min(i.top+(i.height-s.height)/2,r-s.height-8),8);t.style.top=`${u}px`,t.style.bottom="auto",requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionWarningSubmenu(e,t){e.style.left="",e.style.right="",e.style.top="",e.style.bottom="";const n=()=>{if(!e.classList.contains("show"))return;const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left,d=o>=s.width+8,c=l>=s.width+8;d?(e.style.left=`${i.right+8}px`,e.style.right="auto"):c?(e.style.right=a-i.left+8+"px",e.style.left="auto"):o>l?(e.style.left=`${i.right+8}px`,e.style.right="auto"):(e.style.right=a-i.left+8+"px",e.style.left="auto");const u=Math.max(Math.min(i.top+(i.height-s.height)/2,r-s.height-8),8);e.style.top=`${u}px`,e.style.bottom="auto",requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}createWarningItem(e,t,n,s,i=!1){const a=this.ws.store.favorite[s],r=document.createElement("div");r.classList.add("warning-menu-item"),i?(r.draggable=!0,r.classList.add("favorite-item")):r.classList.add("submenu-option"),r.dataset.warning=e.title;const o=document.createElement("span");o.classList.add("favorite-star"),a.includes(e.title)?(o.classList.add("favorited"),o.innerHTML="<i class='fas fa-star'></i>"):o.innerHTML="<i class='fa-regular fa-star'></i>",r.appendChild(o),o.addEventListener("click",t=>{t.stopPropagation();const n=a.indexOf(e.title),l="reverts"===s?document.querySelector("#revert-menu > .warning-menu"):document.querySelector("#warn-menu > .warning-menu");if(-1===n){a.push(e.title),o.classList.add("favorited","spin"),o.innerHTML="<i class='fas fa-star'></i>";let t=l.querySelector(".favorites-section");if(!t){t=document.createElement("div"),t.className="favorites-section";const e=document.createElement("div");e.className="favorites-header",e.innerHTML='<span class="icon fas fa-star"></span><span>Favorites</span>',t.appendChild(e);const n=document.createElement("div");n.className="favorites-container",t.appendChild(n),l.insertBefore(t,l.firstChild);const s=document.createElement("div");s.className="favorites-separator",l.insertBefore(s,t.nextSibling)}const n=l.__executeCallbacks__;n&&t.querySelector(".favorites-container").appendChild(this.createWarningItem(e,n.executeWithWarn,n.executeNoWarn,s,!0))}else if(a.splice(n,1),o.classList.remove("favorited"),o.classList.add("spin"),o.innerHTML="<i class='fa-regular fa-star'></i>",i){r.remove();const t=l.querySelector(".favorites-section");var d;if(0===(null==t?void 0:t.querySelector(".favorites-container").children.length))t.remove(),null===(d=l.querySelector(".favorites-separator"))||void 0===d||d.remove();const n=document.body.querySelector(`.warning-menu-item:not(.favorite-item)[data-warning="${e.title}"]`);if(n){const e=n.querySelector(".favorite-star");e.classList.remove("favorited"),e.innerHTML="<i class='fa-regular fa-star'></i>",e.classList.add("spin"),setTimeout(()=>e.classList.remove("spin"),500)}}else{const t=l.querySelector(".favorites-section");if(t){const n=t.querySelector(`[data-warning="${e.title}"]`);var c;if(n)if(n.remove(),0===t.querySelector(".favorites-container").children.length)t.remove(),null===(c=l.querySelector(".favorites-separator"))||void 0===c||c.remove()}}setTimeout(()=>o.classList.remove("spin"),500)});const l=document.createElement("span");l.className=`icon ${e.icon}`,r.appendChild(l);const d=document.createElement("span");d.className="warning-menu-title",d.textContent=e.title,r.appendChild(d);const c=document.createElement("span");if(c.className="fas fa-circle-question",c.dataset.tooltip=`${e.description} (click for template preview)`,r.appendChild(c),this.addTooltipListener(c),c.addEventListener("click",async t=>{t.preventDefault(),t.stopPropagation();const n=this.ws;this.dialog.show(e.title,async function(){return(await Promise.allSettled(e.templates.map(e=>{const t=n.queue.current.item;return n.api.parse(`{{${e.template}|${t.page.title}}}`,`User:${t.user.name}`,!0)}))).map(e=>{let t="";t="fulfilled"===e.status?e.value:`<em>Error loading template preview: ${e.reason}</em>`;const s=(new DOMParser).parseFromString(t,"text/html").body;return s.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${n.server}`).href)}),s.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${n.server}`).href)}),s.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,s]=e.trim().split(/\s+/,2),i=new URL(t,`https://${n.server}`).href;return s?`${i} ${s}`:i}).join(", ");e.setAttribute("srcset",t)}),s.innerHTML}).join("<div style='height: 1px; background: #0004; margin: 8px 0;'></div>")}())}),!i){const i=document.createElement("div");if(i.classList.add("warning-menu-buttons"),"reverts"===s){const t=document.createElement("span");t.className="warning-menu-button warning-menu-no-warn-button",t.textContent="no warn",i.appendChild(t),t.addEventListener("click",async t=>{t.stopPropagation(),await n(e.title)})}const a=document.createElement("span");a.className="warning-menu-button warning-menu-levels-button",a.textContent="advanced",i.appendChild(a),r.appendChild(i);const o=document.createElement("div");o.className="levels-menu";for(const n of e.templates){if(n.generic)continue;const s=document.createElement("span");s.className=`levels-menu-item colorize-level colorize-level-${n.name}`,s.textContent=n.name,o.appendChild(s),s.addEventListener("click",async()=>await t(e.title,n.name))}document.body.querySelector("#app").appendChild(o),a.addEventListener("click",e=>{e.stopPropagation();const t=o.classList.contains("show");document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show")),t||(o.classList.add("show"),this.positionLevelsMenu(a,o))})}return r.addEventListener("click",async n=>{n.target.closest(".warning-menu-button")||n.target.closest(".favorite-star")||await t(e.title,"auto")}),i&&(r.addEventListener("dragstart",t=>{t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e.title),r.classList.add("dragging")}),r.addEventListener("dragend",()=>{r.classList.remove("dragging")}),r.addEventListener("dragover",e=>{e.preventDefault(),e.dataTransfer.dropEffect="move";const t=document.querySelector(".dragging");if(t&&t!==r){const n=r.getBoundingClientRect(),s=n.top+n.height/2;e.clientY<s?r.parentNode.insertBefore(t,r):r.parentNode.insertBefore(t,r.nextSibling)}}),r.addEventListener("drop",e=>{e.preventDefault();const t=Array.from(r.closest(".favorites-section").querySelectorAll(".favorite-item"));this.ws.store.favorite[s]=t.map(e=>e.dataset.warning)})),r}createWarnMenu(e,t,n){var s,i,a;removeEventListener("keydown",this.warningMenuKeyListener),document.querySelectorAll(".levels-menu").forEach(e=>e.remove()),document.querySelectorAll(".warning-submenu").forEach(e=>e.remove());const r=document.createElement("div");r.className="warning-menu",t.appendChild(r),r.addEventListener("click",e=>{e.target.closest(".warning-submenu")||document.body.querySelectorAll(".warning-submenu.show").forEach(e=>e.classList.remove("show")),e.target.closest(".levels-menu")||document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show"))});const o=async(t,n)=>{const s=(0,u.getWarningFromLookup)(t),i=this.ws.store.settings.auto_report;await this.ws.execute({actions:[{name:"next-item",params:{}},"reverts"===e?{name:"rollback-edit",params:{summary:s.summary}}:{},{name:"warn-user",params:{warning:t,level:n}},{name:"highlight-user",params:{}}].concat(i.enabled&&s.reportable&&i.for.has(t)?[{name:"if",condition:{name:"user-final-warning"},actions:[{name:"report-user-to-aiv",params:{reportMessage:"Vandalism past final warning"}}]}]:[])})},l=async e=>{const t=(0,u.getWarningFromLookup)(e);await this.ws.execute({actions:[{name:"next-item",params:{}},{name:"rollback-edit",params:{summary:t.summary}}]})},d=null!==(s=null===(i=this.ws.queue.current.item)||void 0===i?void 0:i.type)&&void 0!==s?s:this.ws.queue.current.type;let p=c.Queue.groups[d];if("abuselog"===d&&null!==(a=this.ws.queue.current.item)&&void 0!==a&&a.revid&&(p="edit"),r.__executeCallbacks__={executeWithWarn:o,executeNoWarn:l},this.ws.store.favorite.reverts.length>0){const t=document.createElement("div");t.className="favorites-section";const s=document.createElement("div");s.className="favorites-header",s.innerHTML='<span class="icon fas fa-star"></span><span>Favorites</span>',t.appendChild(s);const i=document.createElement("div");i.className="favorites-container",t.appendChild(i);const a=Object.values(u.warningsLookup).filter(e=>e.queueType.includes(p)&&(!n||"function"!=typeof e.show||e.show(n)));for(const t of this.ws.store.favorite[e]){const n=a.find(e=>e.title===t);if(n){const t=this.createWarningItem(n,o,l,e,!0);i.appendChild(t)}}r.appendChild(t);const d=document.createElement("div");d.className="favorites-separator",r.appendChild(d)}let g=0;for(const[,t]of Object.entries(u.warnings)){let s=0;const i=[];for(const e of t.warnings)("function"!=typeof e.show||e.show(n))&&e.queueType.includes(p)&&(i.push(e),s++,g++);if(0===s)continue;const a=document.createElement("div");a.className="menu-option submenu-trigger";const d=document.createElement("span");d.className=`icon ${t.icon}`,a.appendChild(d);const c=document.createElement("span");c.textContent=t.title,a.appendChild(c);const u=document.createElement("span");u.className="submenu-arrow fas fa-chevron-right",a.appendChild(u),r.appendChild(a);const h=document.createElement("div");h.className="warning-submenu submenu",document.body.querySelector("#app").appendChild(h);for(const t of i){const n=this.createWarningItem(t,o,l,e,!1);h.appendChild(n)}a.addEventListener("click",e=>{e.stopPropagation();const t=h.classList.contains("show");document.body.querySelectorAll(".warning-submenu.show").forEach(e=>{e!==h&&(e.classList.remove("show"),document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show")))}),t?(a.classList.remove("focus-opened"),h.classList.remove("show"),document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show"))):(a.classList.add("focus-opened"),h.classList.add("show"),this.positionWarningSubmenu(h,a))})}if(0===g){const e=document.createElement("div");e.className="warning-menu-no-items",e.textContent="No warnings available for this edit.",r.appendChild(e)}addEventListener("keydown",this.warningMenuKeyListener)}warningMenuKeyListener(e){if("Tab"===e.key){const t=document.querySelector("#warn-menu.show, #revert-menu.show");if(t){if(t.querySelector(":scope > div > .menu-option.focus-opened")){const t=document.body.querySelector(".submenu.show");if(t){const n=t.querySelectorAll(":scope > .warning-menu-item");if(n.length>0){const s=(Array.from(n).indexOf(t.querySelector(".focus-visible"))+(e.shiftKey?-1:1)+n.length)%n.length;document.querySelectorAll(".focus-visible").forEach(e=>e.classList.remove("focus-visible")),n[s].classList.add("focus-visible"),e.preventDefault()}}}else{const n=t.querySelectorAll(":scope > div > .favorites-section > .favorites-container > .warning-menu-item,\n\t\t\t\t\t\t :scope > div > .menu-option");if(n.length>0){const s=(Array.from(n).indexOf(t.querySelector(".focus-visible"))+(e.shiftKey?-1:1)+n.length)%n.length;document.querySelectorAll(".focus-visible").forEach(e=>e.classList.remove("focus-visible")),n[s].classList.add("focus-visible"),e.preventDefault()}}}}else if("Enter"===e.key){if(document.querySelector("#warn-menu.show, #revert-menu.show")){const t=document.querySelector(".focus-visible");t&&(t.click(),e.preventDefault())}}else if("Escape"===e.key){if(document.querySelector("#warn-menu.show, #revert-menu.show")){const t=document.querySelector(".focus-opened");t?(t.classList.remove("focus-opened"),t.classList.add("focus-visible"),t.click()):(document.querySelectorAll(".bottom-tool-menu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".levels-menu").forEach(e=>e.classList.remove("show"))),e.preventDefault()}}}closeMenus(){document.querySelectorAll(".bottom-tool-menu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".levels-menu").forEach(e=>e.classList.remove("show"))}}function b(e){const t=new Set(["B","I","EM","STRONG","CODE","SPAN","BR"]),n=document.createElement("div");n.innerHTML=e;const s=e=>{const n=[...e.childNodes];for(const e of n)if(e.nodeType===Node.ELEMENT_NODE)if(t.has(e.tagName)){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name);s(e)}else e.replaceWith(...e.childNodes)};return s(n),n.innerHTML}t.GUI=f,m(f,"palettes",{traffic:(0,p.BuildPalette)(1e3,"#78c675","#fdff7a","#fcff54","#fbff12","#ffc619","#ff8812","#f56214","#f73214","#fc0303","#fc0303"),magma:(0,p.BuildPalette)(1e3,"#000004","#1b0c41","#4a0c6b","#781c6d","#a52c60","#cf4446","#ed6925","#fb9b06","#f7d13d","#fcffa4"),plasma:(0,p.BuildPalette)(1e3,"#0d0887","#46039f","#7201a8","#9c179e","#bd3786","#d8576b","#ed7953","#fb9f3a","#fdca26","#f0f921"),viridis:(0,p.BuildPalette)(1e3,"#440154","#3b528b","#21918c","#5ec962","#fde725"),natural:(0,p.BuildPalette)(1e3,"#ffffff","#18ff18"),cool:(0,p.BuildPalette)(1e3,"#ffffff","#1818ff"),heat:(0,p.BuildPalette)(1e3,"#ffffff","#ff1818"),grey:(0,p.BuildPalette)(1e3,"#000000","#ffffff")})},4674(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Notifications=void 0;t.Notifications=class{constructor(e){this.ws=e,this.first={},["alert","message"].forEach(e=>{this[e]=[],this.update(e),this.first[e]=!0,this.load(e)})}find(e,t){if(!1===(null!=e&&e)){let e=this.alert.find(e=>e.id===t);return e?{type:"alert",notification:e}:(e=this.message.find(e=>e.id===t),e?{type:"message",notification:e}:void 0)}return this[e].find(e=>e.id===t)}async load(e){try{const t=(await this.ws.api.continuous({action:"query",meta:"notifications",notlimit:"max",notprop:"list",notfilter:"!read",notsections:e,notformat:"model"})).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.notifications)||void 0===t?void 0:t.list)||[]});await Promise.all(t.map(async e=>this.ws.api.parse(e["*"].body).then(t=>{var n;return null!==(n=void(e["*"].parsed=t))&&void 0!==n?n:e})));let n=!1;for(const s of t)this[e].some(e=>e.id===s.id&&e.read===s.read)||(this[e].unshift(s),n=!0);if(n){const t=this.ws.store.settings.zen_mode;t.enabled&&!t[`${e}s`].enabled||this.ws.audio.playSound(["notification",e]),this.update(e)}}finally{setTimeout(()=>this.load(e),1e4)}}update(e){this.count();const t=this[e],n=t.filter(e=>!e.read),s=this.ws.store.settings.zen_mode;s.enabled&&!s[`${e}s`].enabled||n.filter(e=>!e.seen&&!e.notified).forEach(t=>{t.notified=!0,this.first[e]||electron.sendNotification({title:this.ws.util.textify(t["*"].header),body:this.ws.util.textify(t["*"].body)},t["*"].links.primary.url)}),this.first[e]=!1;const i=document.querySelector(`#${e}s-count`),a=document.querySelector(`#${e}s-list`);i.textContent=n.length,i.classList.toggle("hidden",0===n.length),0===t.length?a.innerHTML=`<div class="notifications-empty">No new ${e}s</div>`:(a.innerHTML="",t.forEach(t=>{const n=t["*"];{const s=document.createElement("div");s.classList.add("notification"),s.classList.add(t.read?"read":"unread"),s.addEventListener("click",()=>{this.read(e,t),this.ws.open(n.links.primary.url)});{const e=document.createElement("div");e.classList.add("notification-icon"),e.innerHTML=`<img src="${new URL(n.iconUrl,`https://${this.ws.server}/`).toString()}" alt="icon">`,s.appendChild(e)}{const e=document.createElement("div");e.classList.add("notification-content"),s.appendChild(e);{const t=document.createElement("div");t.classList.add("notification-header"),t.innerHTML=this.ws.util.truncate(n.header,100),e.appendChild(t)}{const t=document.createElement("div");t.classList.add("notification-body"),t.innerHTML=n.parsed,e.appendChild(t),t.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,n]=e.trim().split(/\s+/,2),s=new URL(t,`https://${this.ws.server}`).href;return n?`${s} ${n}`:s}).join(", ");e.setAttribute("srcset",t)}),t.querySelectorAll("a").forEach(e=>{e.target="_blank"})}{const t=document.createElement("div");t.classList.add("notification-links"),n.links.secondary.forEach(e=>{const n=document.createElement("a");n.href=e.url,n.target="_blank",n.textContent=e.label,t.appendChild(n)}),e.appendChild(t)}}{const n=document.createElement("div");if(n.classList.add("notification-right"),s.appendChild(n),!t.read){const s=document.createElement("div");s.classList.add("notification-unread-indicator"),s.addEventListener("click",n=>{n.stopPropagation(),this.read(e,t)}),n.appendChild(s)}{const e=document.createElement("div");e.classList.add("notification-timestamp"),e.dataset.time=t.timestamp.utciso8601,e.dataset.timeFormat="notification",e.textContent=this.ws.util.formatNotificationTime(new Date(t.timestamp.utciso8601)),n.appendChild(e)}}a.appendChild(s)}}))}seen(e){this.ws.api.postWithToken({action:"echomarkseen",type:e}),this[e].forEach(e=>e.seen=!0)}read(e,t){t?(t.read=!0,this.update(e),this.ws.api.postWithToken({action:"echomarkread",sections:e,list:t.id})):(this[e].forEach(e=>e.read=!0),this.update(e),this.ws.api.postWithToken({action:"echomarkread",sections:e,all:!0}))}count(){var e,t;const n=this.ws.store.settings.zen_mode;let s=0;n.enabled&&!n.alerts.enabled||(s+=(null===(e=this.alert)||void 0===e?void 0:e.filter(e=>!e.read).length)||0),n.enabled&&!n.messages.enabled||(s+=(null===(t=this.message)||void 0===t?void 0:t.filter(e=>!e.read).length)||0),electron.setBadgeCount(s),document.title=s>0?`(${s}) WikiShield`:"WikiShield"}}},6151(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ProgressBar=void 0;t.ProgressBar=class{constructor(){this.$bar=document.createElement("div"),this.$bar.classList.add("progress-bar"),this.$bar.style.opacity=1,document.querySelector("#progress-bar-container").appendChild(this.$bar),this.$overlay=document.createElement("div"),this.$overlay.classList.add("progress-bar-overlay"),this.$overlay.style.width="0%",this.$bar.appendChild(this.$overlay),this.$text=document.createElement("div"),this.$text.classList.add("progress-bar-text"),this.$bar.appendChild(this.$text)}set(e,t,n){this.$text.textContent=e,this.$overlay.style.width=100*Math.min(Math.max(t,0),1)+"%",this.$bar.classList.toggle("error",n),t>=1&&setTimeout(()=>{this.$bar.style.opacity=0,setTimeout(()=>this.$bar.remove(),300)},1700)}}},9117(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Settings=void 0;var s=n(8678),i=n(870),a=n(9808),r=n(985),o=n(372),l=n(7054),d=n(4018),c=(n(9501),n(955)),u=n(5564),p=n(2069),g=n(8469);function h(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function m(e,t,n){return e.set(f(e,t),n),n}function v(e,t){return e.get(f(e,t))}function f(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var b=new WeakMap,w=new WeakMap,y=new WeakMap;t.Settings=class{constructor(e){h(this,b,void 0),h(this,w,void 0),h(this,y,void 0),this.ws=e,this.ws.api.getTags().then(e=>{this.wikipediaTags=e})}get active(){return document.querySelector("#settings-container > .settings > .settings-right > div:not(.hidden)")}controller(e){const t=e.key.toLowerCase();if(v(b,this)){if("escape"===t)return v(b,this).call(this,"escape",!0);if("control"===t||"shift"===t||"alt"===t||a.controls.has(t))switch(e.preventDefault(),e.type){case"keydown":v(b,this).call(this,(0,a.buildShortcut)(e),!1);break;case"keyup":v(b,this).call(this,(0,a.buildShortcut)(e),!0)}}else"escape"===t&&"keydown"===e.type&&this.close()}collapsible(e,t,n,s=!0){const i=document.createElement("div");i.className="settings-section collapsible",e.appendChild(i);const a=document.createElement("div");a.className="settings-section-header collapse-title",a.textContent=t(s),i.appendChild(a);const r=document.createElement("div");r.className="collapse-content collapsible",i.appendChild(r);const o=document.createElement("div");o.className="settings-section-desc",o.textContent=n,r.appendChild(o),s?(r.style.height="0px",r.style.opacity=0,r.style.overflow="hidden",i.classList.add("collapsed")):(r.style.height="auto",r.style.opacity=1,r.style.overflow="visible",i.classList.remove("collapsed"));let l,d,c,u,p,g,h=!1;const m=e=>{d||(d=e);const t=e-d,n=Math.min(t/300,1),i=(a=n)<.5?2*a*a:(4-2*a)*a-1;var a;const o=c+(p-c)*i,v=u+(g-u)*i;r.style.height=`${o}px`,r.style.opacity=v,n<1?l=requestAnimationFrame(m):(s?r.style.overflow="hidden":(r.style.height="auto",r.style.overflow="visible"),h=!1,l=null,d=null)};return a.addEventListener("click",()=>{if(h){cancelAnimationFrame(l);const e=r.getBoundingClientRect().height;c=e,u=parseFloat(getComputedStyle(r).opacity)}else c=s?0:r.scrollHeight,u=s?0:1;s=!s,a.textContent=t(s),i.classList.toggle("collapsed",s),r.style.overflow="hidden",s?(p=0,g=0):(p=r.scrollHeight,g=1),h=!0,d=null,l=requestAnimationFrame(m)}),r}start(){electron.onOpenChangelog(()=>{var e;return null!==(e=void this.open())&&void 0!==e?e:this.changelog()});let e=0;document.querySelector("#settings-container").addEventListener("click",t=>{"settings-container"!==t.target.id||(e=Math.max(0,e))||this.close()}),document.querySelector("#settings-general-button").addEventListener("click",this.general.bind(this)),document.querySelector("#settings-audio-button").addEventListener("click",this.audio.bind(this)),document.querySelector("#settings-controls-button").addEventListener("click",this.controls.bind(this)),document.querySelector("#settings-zen-button").addEventListener("click",this.zen.bind(this)),document.querySelector("#settings-app-button").addEventListener("click",this.app.bind(this)),document.querySelector("#settings-queue-button").addEventListener("click",this.queue.bind(this)),document.querySelector("#settings-accessibility-button").addEventListener("click",this.accessibility.bind(this)),document.querySelector("#settings-AI-button").addEventListener("click",this.AI.bind(this)),document.querySelector("#settings-auto-reporting-button").addEventListener("click",this.autoReporting.bind(this)),document.querySelector("#settings-gadgets-button").addEventListener("click",this.gadgets.bind(this)),document.querySelector("#settings-whitelist-users-button").addEventListener("click",this.whitelist.bind(this,"user")),document.querySelector("#settings-whitelist-pages-button").addEventListener("click",this.whitelist.bind(this,"page")),document.querySelector("#settings-whitelist-tags-button").addEventListener("click",this.whitelist.bind(this,"tag")),document.querySelector("#settings-highlight-users-button").addEventListener("click",this.highlight.bind(this,"user")),document.querySelector("#settings-highlight-pages-button").addEventListener("click",this.highlight.bind(this,"page")),document.querySelector("#settings-highlight-tags-button").addEventListener("click",this.highlight.bind(this,"tag")),document.querySelector("#settings-statistics-button").addEventListener("click",this.statistics.bind(this)),document.querySelector("#settings-save-button").addEventListener("click",this.save.bind(this)),document.querySelector("#settings-changelog-button").addEventListener("click",this.changelog.bind(this)),document.querySelector("#settings-about-button").addEventListener("click",this.about.bind(this));{const t=document.querySelector("#settings-ores-bias"),n=t.querySelector(".settings-slider-track"),s=t.querySelector(".settings-slider-thumb"),i=t.querySelector(".settings-slider-label-left"),a=i.querySelector(".percent"),r=t.querySelector(".settings-slider-label-right"),o=r.querySelector(".percent"),l=e=>{this.ws.store.settings.queue.ores_bias=+e.toFixed(2),e=Math.max(0,Math.min(100,Math.round(100*e))),s.style.left=`${e}%`,n.style.setProperty("--fill",`${e}%`);const t=100-e;a.textContent=`${t}%`,i.classList.toggle("active",t>0);const l=e;o.textContent=`${l}%`,r.classList.toggle("active",l>0)},d=e=>{const t=n.getBoundingClientRect();return(e.clientX-t.left)/t.width};n.addEventListener("click",e=>l(d(e)));let c=!1;s.addEventListener("mousedown",t=>{t.preventDefault(),c=!0,e++,s.classList.add("dragging")}),window.addEventListener("mousemove",e=>{c&&l(d(e))}),window.addEventListener("mouseup",()=>{c&&(c=!1,e--,s.classList.remove("dragging"))}),l(this.ws.store.settings.queue.ores_bias)}{const e=document.querySelector("#settings-maximum-edit-count");e.value=this.ws.store.settings.queue.max_edits,e.addEventListener("change",e=>{const t=+e.target.value;this.ws.store.settings.queue.max_edits=t;for(const[e,n]of this.ws.queue.bypass.entries())n<=t&&this.ws.queue.bypass.delete(e)});const t=document.querySelector("#settings-maximum-queue-size");t.value=this.ws.store.settings.queue.max_size,t.addEventListener("change",e=>this.ws.store.settings.queue.max_size=+e.target.value);const n=document.querySelector("#settings-minimum-ores-score");n.value=this.ws.store.settings.queue.min_ores,n.addEventListener("change",e=>this.ws.store.settings.queue.min_ores=+e.target.value);const s=document.querySelector("#settings-watchlist-expiry");s.value=this.ws.store.settings.expiry.watchlist,s.addEventListener("change",e=>this.ws.store.settings.expiry.watchlist=e.target.value);const i=document.querySelector("#settings-namespaces-container");i.innerHTML="",d.namespaces.forEach(e=>{const t=document.createElement("div");t.className="namespace-item",t.dataset.namespaceId=e.id,t.innerHTML=`\n\t\t\t\t\t<label class="checkbox-box">\n\t\t\t\t\t\t<input type="checkbox" autoComplete="off">\n\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t</label>\n\t\t\t\t\t<span class="namespace-name">${e.name}</span>\n\t\t\t\t`;const n=t.querySelector("input[type=checkbox]");n.checked=this.ws.store.settings.namespaces.includes(e.id),n.addEventListener("change",t=>{if(t.target.checked)this.ws.store.settings.namespaces.includes(e.id)||this.ws.store.settings.namespaces.push(e.id);else{const t=this.ws.store.settings.namespaces.indexOf(e.id);-1!==t&&this.ws.store.settings.namespaces.splice(t,1)}}),i.appendChild(t)})}{const e=document.querySelector("#settings-ORES-alert-toggle");e.value=this.ws.store.settings.audio.ores_alert.enabled,e.addEventListener("change",t=>{this.ws.store.settings.audio.ores_alert.enabled=e.value});const t=document.querySelector("#settings-ORES-alert-threshold");t.value=this.ws.store.settings.audio.ores_alert.threshold,t.addEventListener("change",e=>{this.ws.store.settings.audio.ores_alert.threshold=+t.value});const n=document.querySelector("#settings-master-volume");n.value=this.ws.store.settings.audio.volume.master,n.addEventListener("change",e=>{this.ws.store.settings.audio.volume.master=+n.value});const s={sound:(e,t,n,s,i)=>{const a=["master",...t].join("."),r=document.createElement("volume-control");r.setAttribute("title",n),r.setAttribute("description",s),i&&r.setPreview(this.ws.audio,t),r.value=this.ws.store.settings.audio.volume[a],r.addEventListener("change",()=>{const e=this.ws.store.settings.audio.volume[a];this.ws.store.settings.audio.volume[a]=r.value,e!==r.value&&this.ws.audio.onvolumechanged()}),e.appendChild(r)},category:(e,t,n,s)=>{const i=["master",...t].join("."),a=this.collapsible(e,e=>n,s,!0),r=document.createElement("volume-control");r.setAttribute("title","Category Volume"),r.value=this.ws.store.settings.audio.volume[i],r.addEventListener("change",()=>{const e=this.ws.store.settings.audio.volume[i];this.ws.store.settings.audio.volume[i]=r.value,e!==r.value&&this.ws.audio.onvolumechanged()}),a.appendChild(r);const o=document.createElement("div");return o.className="settings-content",a.appendChild(o),o}},i=(e,t,n)=>{for(const[r,o]of Object.entries(e))switch(o.type){case"sound":var a;s.sound(n,[...t,r],o.title,o.description,null===(a=o.preview)||void 0===a||a);break;case"category":i(o.properties,[...t,r],s.category(n,[...t,r],o.title,o.description))}};i(this.ws.audio.audio,[],document.querySelector("#settings-sounds-container"))}{const e=document.querySelector("#repeat-control-scripts-toggle");e.value=this.ws.store.settings.repeat_control_scripts,e.addEventListener("change",t=>this.ws.store.settings.repeat_control_scripts=e.value),document.querySelector("#settings-new-control-script").addEventListener("click",async()=>{this.ws.store.control_scripts.unshift({keys:[],actions:[]}),this.controls()})}{const e=document.querySelector("#settings-zen-mode");e.value=this.ws.store.settings.zen_mode.enabled,e.addEventListener("change",t=>{this.ws.store.settings.zen_mode.enabled=e.value,this.ws.gui.updateZenMode()});const t=document.querySelector("#settings-zen-mode-sound");t.value=this.ws.store.settings.zen_mode.sound.enabled,t.addEventListener("change",e=>{this.ws.store.settings.zen_mode.sound.enabled=t.value,this.ws.gui.updateZenMode()});const n=document.querySelector("#settings-zen-mode-music");n.value=this.ws.store.settings.zen_mode.music.enabled,n.addEventListener("change",e=>{this.ws.store.settings.zen_mode.music.enabled=n.value,this.ws.gui.updateZenMode()});const s=document.querySelector("#settings-zen-mode-alerts");s.value=this.ws.store.settings.zen_mode.alerts.enabled,s.addEventListener("change",e=>{this.ws.store.settings.zen_mode.alerts.enabled=s.value,this.ws.gui.updateZenMode()});const i=document.querySelector("#settings-zen-mode-messages");i.value=this.ws.store.settings.zen_mode.messages.enabled,i.addEventListener("change",e=>{this.ws.store.settings.zen_mode.messages.enabled=i.value,this.ws.gui.updateZenMode()});const a=document.querySelector("#settings-zen-mode-toasts");a.value=this.ws.store.settings.zen_mode.toasts.enabled,a.addEventListener("change",e=>{this.ws.store.settings.zen_mode.toasts.enabled=a.value,this.ws.gui.updateZenMode()});const r=document.querySelector("#settings-zen-mode-badges");r.value=this.ws.store.settings.zen_mode.badges.enabled,r.addEventListener("change",e=>{this.ws.store.settings.zen_mode.badges.enabled=r.value,this.ws.gui.updateZenMode()})}if(!window.isElectron){const e=document.querySelector("#settings-launch-behavior");document.querySelectorAll("#settings-launch-behavior .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-launch-behavior [data-value=${electron.localStorage.get("WikiShield:OpenExternally")?"new_tab":"current_tab"}]`).classList.add("selected");const t=e.querySelector("[data-value=current_tab]");t.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),t.classList.add("selected"),electron.localStorage.set("WikiShield:OpenExternally",!1)});const n=e.querySelector("[data-value=new_tab]");n.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"),electron.localStorage.set("WikiShield:OpenExternally",!0)})}{const e=document.querySelector("#settings-startup-performance");document.querySelectorAll("#settings-startup-performance .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected");const t=e.querySelector("[data-value=always_off]");t.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),t.classList.add("selected"),this.ws.store.settings.performance.startup="always_off"});const n=e.querySelector("[data-value=adaptive]");n.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"),this.ws.store.settings.performance.startup="adaptive"});const s=e.querySelector("[data-value=always_on]");s.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),s.classList.add("selected"),this.ws.store.settings.performance.startup="always_on"})}{const e=document.querySelector("#settings-queues");o.Queue.types.map(e=>({type:e,data:this.ws.store.settings.queue[e]})).sort((e,t)=>e.data.order-t.data.order).forEach(t=>{var n;const s=document.createElement("draggable-order-item");s.setAttribute("key",t.type),s.setAttribute("name",null!==(n={recent:"Recent changes",pending:"Pending changes",users:"User creations",watchlist:"Watchlist",abuselog:"Abuse log"}[t.type])&&void 0!==n?n:t.type),s.enabled=t.data.enabled,e.addItem(s,t.type)}),e.addEventListener("toggle",e=>{var t;const n=null===(t=e.target.closest("draggable-order-item"))||void 0===t?void 0:t.getAttribute("key");n&&(this.ws.store.settings.queue[n].enabled=e.detail.enabled,this.ws.gui.reorderQueues())}),e.addEventListener("reorder",e=>{e.detail.keys.forEach((e,t)=>{this.ws.store.settings.queue[e].order=t,this.ws.gui.reorderQueues()})});const t=document.querySelector("#settings-palette-selector");Object.entries(g.GUI.palettes).forEach(([e,n])=>{const s=document.createElement("div");s.className="palette-option",s.classList.toggle("selected",this.ws.store.UI.theme.palette===e),s.dataset.palette=e,s.addEventListener("click",()=>{document.querySelectorAll(".palette-option.selected").forEach(e=>e.classList.remove("selected")),s.classList.add("selected"),this.ws.store.UI.theme.palette=e,this.ws.gui.updatePalette()}),t.appendChild(s);const i=document.createElement("div");i.className="palette-name",i.textContent=new p.Text(e).case(p.Text.Case.Title).get(),s.appendChild(i);const a=document.createElement("div");a.className="palette-preview",s.appendChild(a);const r=n.length,o=document.createElement("canvas");o.width=r,o.height=1;const l=o.getContext("2d"),d=l.createImageData(r,1);n.forEach((e,t)=>{const n=e.match(/\d+/g).map(e=>parseInt(e,10)),s=4*t;d.data[s]=n[0],d.data[s+1]=n[1],d.data[s+2]=n[2],d.data[s+3]=255}),l.putImageData(d,0,0),a.appendChild(o)})}{const e=document.querySelector("#settings-dyslexia-font");e.value=this.ws.store.settings.accessibility.dyslexia,e.addEventListener("change",t=>{this.ws.store.settings.accessibility.dyslexia=e.value,this.ws.gui.updateAccessibility()});const t=document.querySelector("#settings-reduce-motion");t.value=this.ws.store.settings.accessibility.reduce_motion,t.addEventListener("change",e=>{this.ws.store.settings.accessibility.reduce_motion=t.value,this.ws.gui.updateAccessibility()})}{const e=document.querySelector("#settings-AI-toggle");e.value=this.ws.store.settings.AI.enabled,e.addEventListener("change",t=>{var n;if(null===(n=this.ws.AI)||void 0===n||n.cancel.all(!0),this.ws.store.settings.AI.enabled=e.value,this.ws.store.settings.AI.enabled)if("Ollama"===this.ws.store.settings.AI.provider)this.ws.AI=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);else this.ws.AI=null;else this.ws.AI=null});const t=document.querySelector("#settings-AI-edit-analysis-toggle");t.value=this.ws.store.settings.AI.edit_analysis.enabled,t.addEventListener("change",e=>this.ws.store.settings.AI.edit_analysis.enabled=e.target.value);const n=document.querySelector("#settings-AI-username-analysis-toggle");n.value=this.ws.store.settings.AI.username_analysis.enabled,n.addEventListener("change",e=>this.ws.store.settings.AI.username_analysis.enabled=e.target.value);const i=document.querySelector("#ollama-url-input");i.value=this.ws.store.settings.AI.Ollama.server,i.addEventListener("change",e=>{this.ws.store.settings.AI.Ollama.server=i.value.trim(),"Ollama"===this.ws.store.settings.AI.provider&&this.ws.AI&&this.ws.AI.cancel.all(!0)});const a=document.querySelector("#settings-ollama-test-connection");a.addEventListener("click",async()=>{var e;if(a.disabled)return;a.disabled=!0;const t=document.querySelector("#settings-ollama-connection-status"),n=t.parentElement;let i;if(n.classList.add("testing"),n.classList.remove("connected","failed"),t.classList.add("animate-loading-dots"),t.textContent="Testing connection","Ollama"===this.ws.store.settings.AI.provider)i=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);null===(e=this.ws.AI)||void 0===e||e.cancel.all(!0),i instanceof s.AI&&await i.test()?(n.classList.add("connected"),n.classList.remove("testing","failed"),t.innerHTML="<span class='fa fa-check-circle'></span> Connected!"):(n.classList.add("failed"),n.classList.remove("testing","connected"),t.innerHTML="<span class='fa fa-times-circle'></span> Failed to connect.<br><small>Make sure you have followed the setup instructions (see below)</small>"),t.classList.remove("animate-loading-dots"),a.disabled=!1});const r=document.querySelector("#settings-ollama-refresh-models");r.addEventListener("click",async()=>{var e;if(r.disabled)return;r.disabled=!0;const t=document.querySelector("#settings-ollama-models"),n=document.querySelector("#settings-ollama-models-status"),i=n.parentElement;n.textContent="Searching",i.classList.add("searching","animate-loading-dots"),i.classList.remove("none","error"),null===(e=this.ws.AI)||void 0===e||e.cancel.all(!0);try{let e;if("Ollama"===this.ws.store.settings.AI.provider)e=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);const a=e instanceof s.AI&&await e.models()||[];a.length>0?(i.classList.remove("searching","none","error","animate-loading-dots"),n.innerHTML=`<span class="fa fa-check-circle"></span> Found ${a.length} ${new p.Text("model").get(a.length)}.`,t.innerHTML="",a.forEach(e=>{const n=e.name===this.ws.store.settings.AI.Ollama.model,s=document.createElement("div");s.className="model",s.classList.toggle("selected",n),s.dataset.model=e.name,t.appendChild(s);const i=document.createElement("div");i.className="model-top",s.appendChild(i);const a=document.createElement("span");a.className="indicator fa",a.classList.add(n?"fa-check-circle":"fa-circle"),i.appendChild(a);const r=document.createElement("span");r.className="model-name",r.textContent=e.name,i.appendChild(r);const o=document.createElement("span");o.className="psuedo-indicator fa fa-circle",i.appendChild(o);const l=document.createElement("div");l.className="model-bottom",s.appendChild(l);const d=document.createElement("span");d.className="model-size",d.textContent=this.ws.util.formatBytes(e.size),l.appendChild(d);const c=document.createElement("span");c.className="model-modified",c.textContent=new Date(e.modified_at).toLocaleDateString(),l.appendChild(c),s.addEventListener("click",()=>{var n;if(null===(n=this.ws.AI)||void 0===n||n.cancel.all(!0),"Ollama"===this.ws.store.settings.AI.provider)this.ws.store.settings.AI.Ollama.model=e.name;t.querySelectorAll(".model.selected").forEach(e=>{e.classList.remove("selected");const t=e.querySelector(".indicator");t.classList.remove("fa-circle"),t.classList.add("fa-check-circle")}),s.classList.add("selected");const i=s.querySelector(".indicator");i.classList.remove("fa-circle"),i.classList.add("fa-check-circle")})})):(i.classList.add("none"),i.classList.remove("searching","error","animate-loading-dots"),n.textContent="No models found.")}catch(e){i.classList.add("error"),i.classList.remove("searching","none","animate-loading-dots"),n.innerHTML="<span class='fa fa-times-circle'></span> Error fetching models."}r.disabled=!1})}{const e=document.querySelector("#settings-auto-reporting-toggle");e.value=this.ws.store.settings.auto_report.enabled,e.addEventListener("change",t=>{this.ws.store.settings.auto_report.enabled=e.value});const t=document.querySelector("#settings-auto-reporting-warnings-container");Object.entries(c.warningsLookup).filter(([e,t])=>t.reportable).sort((e,t)=>e[1].title.localeCompare(t[1].title)).forEach(([e,n])=>{const s=document.createElement("div");s.className="auto-reportable-warning-item",s.innerHTML=`\n\t\t\t\t\t\t<label class="checkbox-box" data-warning-key="${e}">\n\t\t\t\t\t\t\t<input type="checkbox" autoComplete="off" ${this.ws.store.settings.auto_report.for.has(e)?"checked":""}>\n\t\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<span class="checkbox-name">${n.title}</span>\n\t\t\t\t\t`,s.querySelector("input[type=checkbox]").addEventListener("change",t=>{t.target.checked?this.ws.store.settings.auto_report.for.has(e)||this.ws.store.settings.auto_report.for.add(e):this.ws.store.settings.auto_report.for.delete(e)}),t.appendChild(s)})}{const e=document.querySelector("#settings-auto-welcome-toggle");e.value=this.ws.store.settings.auto_welcome.enabled,e.addEventListener("change",t=>{this.ws.store.settings.auto_welcome.enabled=e.value});const t=document.querySelector("#settings-wikipedia-popups-toggle");t.value=this.ws.store.settings.wikipedia_popups.enabled,t.addEventListener("change",e=>{this.ws.store.settings.wikipedia_popups.enabled=t.value});const n=document.querySelector("#talk-page-thanks-for-temporary-users-toggle");n.value=this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled,n.addEventListener("change",e=>{this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled=n.value});const s=document.querySelector("#settings-username-highlighting-toggle");s.value=this.ws.store.settings.username_highlighting.enabled,s.addEventListener("change",e=>{this.ws.store.settings.username_highlighting.enabled=s.value});const i=document.querySelector("#settings-username-highlighting-fuzzy-toggle");i.value=this.ws.store.settings.username_highlighting.fuzzy,i.addEventListener("change",e=>{this.ws.store.settings.username_highlighting.fuzzy=i.value})}{const e=document.querySelector("#settings-save-status");document.querySelector("#settings-export-button").addEventListener("click",async t=>{try{const t=this.ws.export();await electron.copyToClipboard(t),e.classList.remove("hidden","error","info"),e.classList.add("success"),e.innerHTML='\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings exported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">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'}catch(t){e.classList.remove("hidden","success","info"),e.classList.add("error"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Export failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${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`}});document.querySelector("#settings-import-button").addEventListener("click",async t=>{try{const t=await this.ws.gui.dialog.input("Import Settings","Please paste the base64 string of your exported settings below:");if(!t)throw new Error("No input provided.");const n=await this.ws.noinit(t),[s,i]=n.reduce((e,t)=>(t.expected?e[0].push(t):e[1].push(t),e),[[],[]]);e.classList.remove("hidden","error","info"),e.classList.add("success"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings imported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">\n\t\t\t\t\t\t\t\t\t${i.length>0?`<br><br><strong>Encountered ${new p.Text("%n issue").get(i.length)}:</strong><br>${i.map(e=>`- ${e.message}`).join("<br>")}`:""}\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`}catch(t){e.classList.remove("hidden","success","info"),e.classList.add("error"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Import failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${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`}});document.querySelector("#settings-reset-button").addEventListener("click",async t=>{await this.ws.gui.dialog.confirm("Reset Settings","Are you sure you want to reset all settings to their default values? This action cannot be undone.","Reset Settings",!0)&&(this.ws.noinit("e30="),e.classList.remove("hidden","error","success"),e.classList.add("info"),e.innerHTML='\n\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t<i class="fa fa-info-circle status-icon"></i>\n\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t<div class="status-title">Settings reset successfully.</div>\n\t\t\t\t\t\t\t<div class="status-desc">All settings have been restored to their default values.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t')})}document.querySelectorAll("#settings-container > .settings > .settings-right > .about [data-link]").forEach(e=>{e.addEventListener("click",t=>this.ws.open(e.dataset.link,t.altKey))})}update(){document.querySelector("#settings-maximum-edit-count").value=this.ws.store.settings.queue.max_edits,document.querySelector("#settings-maximum-queue-size").value=this.ws.store.settings.queue.max_size,document.querySelector("#settings-minimum-ores-score").value=this.ws.store.settings.queue.min_ores,document.querySelector("#settings-watchlist-expiry").value=this.ws.store.settings.expiry.watchlist,document.querySelectorAll("#settings-namespaces-container .namespace-item").forEach(e=>{const t=parseInt(e.dataset.namespaceId,10);e.querySelector("input[type=checkbox]").checked=this.ws.store.settings.namespaces.includes(t)}),document.querySelector("#settings-zen-mode").value=this.ws.store.settings.zen_mode.enabled,document.querySelector("#settings-zen-mode-sound").value=this.ws.store.settings.zen_mode.sound.enabled,document.querySelector("#settings-zen-mode-music").value=this.ws.store.settings.zen_mode.music.enabled,document.querySelector("#settings-zen-mode-alerts").value=this.ws.store.settings.zen_mode.alerts.enabled,document.querySelector("#settings-zen-mode-messages").value=this.ws.store.settings.zen_mode.messages.enabled,document.querySelector("#settings-zen-mode-toasts").value=this.ws.store.settings.zen_mode.toasts.enabled,document.querySelector("#settings-zen-mode-badges").value=this.ws.store.settings.zen_mode.badges.enabled,document.querySelectorAll("#settings-startup-performance .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected");{const e=document.querySelector("#settings-queues");e.clearItems(),o.Queue.types.map(e=>({type:e,data:this.ws.store.settings.queue[e]})).sort((e,t)=>e.data.order-t.data.order).forEach(t=>{var n;const s=document.createElement("draggable-order-item");s.setAttribute("key",t.type),s.setAttribute("name",null!==(n={recent:"Recent changes",pending:"Pending changes",users:"User creations",watchlist:"Watchlist"}[t.type])&&void 0!==n?n:t.type),s.enabled=t.data.enabled,e.addItem(s,t.type)}),document.querySelectorAll(".palette-option").forEach(e=>{e.classList.toggle("selected",e.dataset.palette===this.ws.store.UI.theme.palette)})}document.querySelector("#settings-AI-toggle").value=this.ws.store.settings.AI.enabled,document.querySelector("#settings-AI-edit-analysis-toggle").value=this.ws.store.settings.AI.edit_analysis.enabled,document.querySelector("#settings-AI-username-analysis-toggle").value=this.ws.store.settings.AI.username_analysis.enabled,document.querySelector("#ollama-url-input").value=this.ws.store.settings.AI.Ollama.server;{const e=document.querySelector("#settings-ollama-connection-status"),t=e.parentElement;e.innerHTML="",t.classList.remove("testing","connected","failed")}{document.querySelector("#settings-ollama-models").querySelectorAll(".model").forEach(e=>e.remove());const e=document.querySelector("#settings-ollama-models-status"),t=e.parentElement;e.innerHTML="",t.classList.remove("searching","none","error")}document.querySelector("#settings-auto-reporting-toggle").value=this.ws.store.settings.auto_report.enabled,document.querySelectorAll("#settings-auto-reporting-warnings-container .auto-reportable-warning-item").forEach(e=>{const t=e.querySelector("label").dataset.warningKey;e.querySelector("input[type=checkbox]").checked=this.ws.store.settings.auto_report.for.has(t)}),document.querySelector("#settings-auto-welcome-toggle").value=this.ws.store.settings.auto_welcome.enabled,document.querySelector("#settings-wikipedia-popups-toggle").value=this.ws.store.settings.wikipedia_popups.enabled,document.querySelector("#settings-username-highlighting-toggle").value=this.ws.store.settings.username_highlighting.enabled,document.querySelector("#settings-username-highlighting-fuzzy-toggle").value=this.ws.store.settings.username_highlighting.fuzzy}open(){document.querySelector("#settings-container").classList.add("show"),this.general(),m(y,this,new Promise(e=>{m(w,this,e)}))}close(){this.deselect(),this.ws.audio.stopPreviews(),document.querySelector("#settings-container").classList.remove("show"),v(w,this)&&(v(w,this).call(this),m(w,this,null))}waitForClose(){return v(y,this)}deselect(){document.querySelectorAll("#settings-container > .settings > .settings-left .settings-left-menu-item.selected").forEach(e=>e.classList.remove("selected")),document.querySelectorAll("#settings-container > .settings > .settings-right > :not(.hidden)").forEach(e=>e.classList.add("hidden"))}general(){this.deselect(),document.querySelector("#settings-general-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .general").classList.remove("hidden")}performance(){this.deselect(),document.querySelector("#settings-performance-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .performance").classList.remove("hidden")}audio(){this.deselect(),document.querySelector("#settings-audio-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .audio").classList.remove("hidden")}controls(){this.deselect(),document.querySelector("#settings-controls-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .controls").classList.remove("hidden");{const e=(t,n)=>{if(n.actions.includes(t))return n;for(const s of n.actions)if("if"===s.name||"if not"===s.name){const n=e(t,s);if(n)return n}return null},t=(n,s,a,o)=>{const l=document.createElement("div");if(l.className="control-action",n.appendChild(l),"if"===s.name||"if not"===s.name){var d,c,p;l.innerHTML=`\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t\t\t${"if"===s.name?"If":"If not"} <select></select> <span class="params"></span> then:\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;const e=l.querySelector("select");Object.entries(i.conditions).forEach(([t,n])=>{e.innerHTML+="title"in n?`<option value="${t}">${n.title}</option>`:`<option value="${t}">${t}</option>`});const n=null!==(d=s.condition)&&void 0!==d?d:{name:Object.keys(i.conditions)[0],params:{}};null!==(c=n.name)&&void 0!==c||(n.name=Object.keys(i.conditions)[0]),null!==(p=n.params)&&void 0!==p||(n.params={}),e.value=n.name,e.addEventListener("change",t=>{n.name=e.value,o()});const r=new Map;for(const e of(0,u.sortDependencies)((null===(g=(h=i.conditions[n.name]).parameters)||void 0===g?void 0:g.call(h))||[])){var g,h;const t=document.createElement("div");t.className="condition-parameter",l.querySelector(".params").appendChild(t);const s={};for(const t of null!==(m=e.dependencies)&&void 0!==m?m:[]){var m;s[t]=n.params[t]}const i="function"==typeof e.default?e.default(s):e.default;let a=null;switch(e.type){case"choice":{const o=document.createElement("select");o.dataset.paramid=e.id,t.appendChild(o);const l="function"==typeof e.options?e.options(s):e.options;for(const e of null!=l?l:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(void 0!==n.params[e.id]){o.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(o.value=i,n.params[e.id]=i);a=()=>{const t={};for(const i of null!==(s=e.dependencies)&&void 0!==s?s:[]){var s;t[i]=n.params[i]}const i=o.value,a="function"==typeof e.options?e.options(t):e.options;o.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(a.includes(i))o.value=i;else{const s="function"==typeof e.default?e.default(t):e.default;o.value=s,n.params[e.id]=s}},o.addEventListener("change",()=>{n.params[e.id]=o.value;for(const t of r.get(e.id)||[])t()})}break;case"text":{const s=document.createElement("input");if(s.type="text",s.dataset.paramid=e.id,t.appendChild(s),void 0!==n.params[e.id]){s.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.value=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=s.value;for(const t of r.get(e.id)||[])t()})}break;case"boolean":{const s=document.createElement("input");if(s.type="checkbox",s.dataset.paramid=e.id,t.appendChild(s),void 0!==n.params[e.id]){s.checked=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.checked=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=s.checked;for(const t of r.get(e.id)||[])t()})}break;case"number":{const s=document.createElement("input");if(s.type="number",s.dataset.paramid=e.id,"min"in e&&(s.min=e.min),"max"in e&&(s.max=e.max),t.appendChild(s),void 0!==n.params[e.id]){s.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.value=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=parseFloat(s.value);for(const t of r.get(e.id)||[])t()})}}if("function"==typeof a)for(const t of null!==(v=e.dependencies)&&void 0!==v?v:[]){var v;r.has(t)||r.set(t,[]),r.get(t).push(a)}}for(const e of s.actions)t(l,e,a,o)}else{const e=r.events[s.name];l.innerHTML=`\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="${"icon"in e?e.icon:"fas fa-bolt"}"></span>\n\t\t\t\t\t\t\t\t${"title"in e?e.title:s.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;const t=new Map;for(const n of(0,u.sortDependencies)((null===(f=e.parameters)||void 0===f?void 0:f.call(e))||[])){var f;const e=document.createElement("div");e.className="action-parameter",e.innerHTML=`<div class="parameter-title">${n.title}</div>`,l.appendChild(e);const i={};for(const e of null!==(b=n.dependencies)&&void 0!==b?b:[]){var b;i[e]=s.params[e]}const a="function"==typeof n.default?n.default(i):n.default;let r=null;switch(n.type){case"choice":{const o=document.createElement("select");o.dataset.paramid=n.id,e.appendChild(o);const l="function"==typeof n.options?n.options(i):n.options;for(const e of null!=l?l:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(void 0!==s.params[n.id]){o.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(o.value=a,s.params[n.id]=a);r=()=>{const e={};for(const i of null!==(t=n.dependencies)&&void 0!==t?t:[]){var t;e[i]=s.params[i]}const i=o.value,a="function"==typeof n.options?n.options(e):n.options;o.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(a.includes(i))o.value=i;else{const t="function"==typeof n.default?n.default(e):n.default;o.value=t,s.params[n.id]=t}},o.addEventListener("change",()=>{s.params[n.id]=o.value;for(const e of t.get(n.id)||[])e()})}break;case"text":{const i=document.createElement("input");if(i.type="text",i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.value=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.value;for(const e of t.get(n.id)||[])e()})}break;case"boolean":{const i=document.createElement("input");if(i.type="checkbox",i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.checked=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.checked=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.checked;for(const e of t.get(n.id)||[])e()})}break;case"duration":{const i=document.createElement("duration-input");if(i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.value=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.value;for(const e of t.get(n.id)||[])e()})}}if("function"==typeof r)for(const e of null!==(w=n.dependencies)&&void 0!==w?w:[]){var w;t.has(e)||t.set(e,[]),t.get(e).push(r)}}}l.querySelector(".move-action-up").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]);const t=e(s,a),n=t.actions.indexOf(s);if(0===t.actions.indexOf(s)){if("if"!==t.name&&"if not"!==t.name)return;const i=e(t,a);i.actions.splice(i.actions.indexOf(t),0,s),t.actions.splice(n,1)}else{const e=t.actions[n-1];"if"===e.name||"if not"===e.name?(e.actions.push(s),t.actions.splice(n,1)):(t.actions.splice(n,1),t.actions.splice(n-1,0,s))}o()}),l.querySelector(".move-action-down").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]);const t=e(s,a),n=t.actions.indexOf(s);if(t.actions.indexOf(s)===t.actions.length-1){if("if"!==t.name&&"if not"!==t.name)return;const i=e(t,a);i.actions.splice(i.actions.indexOf(t)+1,0,s),t.actions.splice(n,1)}else{const e=t.actions[n+1];"if"===e.name||"if not"===e.name?(e.actions.unshift(s),t.actions.splice(n,1)):(t.actions.splice(n,1),t.actions.splice(n+1,0,s))}o()}),l.querySelector(".delete-action").addEventListener("click",async t=>{if(this.ws.audio.playSound(["ui","click"]),t.shiftKey||await this.ws.gui.dialog.confirm("Delete Action","Are you sure you want to delete this action?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>",null,!0)){const t=e(s,a);t.actions.splice(t.actions.indexOf(s),1),o()}})},n=()=>{const e=new Set,t=new Set;this.ws.store.control_scripts.forEach(n=>{n.keys.forEach(n=>{e.has(n)?t.add(n):e.add(n)})}),document.querySelectorAll(".control-keys div[data-key]").forEach(e=>{e.classList.toggle("duplicate",t.has(e.dataset.key))})},s=(e,o)=>{e.innerHTML='\n\t\t\t\t\t<div class="control-container">\n\t\t\t\t\t\t<div class="control-container-title">When these keys are pressed</div>\n\t\t\t\t\t\t<div class="control-keys"></div>\n\t\t\t\t\t\t<div class="control-container-title margin-top">Complete these actions</div>\n\t\t\t\t\t\t<div class="control-actions"></div>\n\t\t\t\t\t</div>\n\t\t\t\t';const l=e.querySelector(".control-keys");for(const t of o.keys){const i=document.createElement("div");i.dataset.key=t,i.innerHTML=`\n\t\t\t\t\t\t<span class="key-elem-title">${" "===t?"space":t}</span>\n\t\t\t\t\t\t<span class="fas fa-trash-can remove"></span>\n\t\t\t\t\t`,l.appendChild(i),i.querySelector(".remove").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),o.keys.splice(o.keys.indexOf(t),1),s(e,o),n()})}const d=document.createElement("div");d.className="add",d.innerHTML='<span class="fas fa-plus"></span>',l.appendChild(d),d.addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),document.querySelectorAll(".key-select").forEach(e=>e.remove());const t=document.createElement("div");t.className="key-select animate-loading-dots",t.textContent="Press a key",l.insertBefore(t,d);const i=()=>{t.remove(),m(b,this,null)};t.addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),i()}),m(b,this,(r,l,d)=>{if("escape"===r)i();else if(l){if(!(0,a.validateShortcut)(r))return i(),void this.ws.gui.dialog.toast("Invalid Key","The key you pressed is not a valid shortcut key.","error");o.keys.includes(r)||o.keys.push(r),i(),s(e,o),n()}else t.textContent=r||"Press a key"})});const c=e.querySelector(".control-actions");for(const e of o.actions)t(c,e,o,()=>{this.controls()});const u=document.createElement("div");u.className="control-bottom-container",u.innerHTML='\n\t\t\t\t\t<div class="add-action-button"></div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<button class="add-action-button control-delete" style="--background: 211, 51, 51;">Delete</button>\n\t\t\t\t\t</div>\n\t\t\t\t',c.appendChild(u),u.querySelector(".control-delete").addEventListener("click",async e=>{this.ws.audio.playSound(["ui","click"]),(e.shiftKey||await this.ws.gui.dialog.confirm("Delete Control Script","Are you sure you want to delete this control script? This action cannot be undone?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>",null,!0))&&(this.ws.store.control_scripts.splice(this.ws.store.control_scripts.indexOf(o),1),this.controls())});const p=()=>{const t=u.querySelector(".add-action-button");t.innerHTML='<button class="add-action-button new-button"><span class="fa fa-plus"></span> Add Action</button>',t.querySelector(".new-button").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),t.innerHTML='\n\t\t\t\t\t\t\t<select style="height: 35px;"></select>\n\t\t\t\t\t\t\t<button class="add-action-button cancel-button" style="margin-left: 10px;">Cancel</button>\n\t\t\t\t\t\t\t<button class="add-action-button create-button" style="margin-left: 10px;">Create</button>\n\t\t\t\t\t\t';const n=t.querySelector("select");n.innerHTML+='<option value="if">If Condition</option>',n.innerHTML+='<option value="if not">If Not Condition</option>',Object.entries(r.events).forEach(([e,t])=>{n.innerHTML+="title"in t?`<option value="${e}">${t.title}</option>`:`<option value="${e}">${e}</option>`}),t.querySelector(".cancel-button").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),p()}),t.querySelector(".create-button").addEventListener("click",()=>{if(this.ws.audio.playSound(["ui","click"]),"if"===n.value||"if not"===n.value||n.value in r.events){const t={name:n.value,params:{}};"if"!==n.value&&"if not"!==n.value||(t.condition={name:Object.keys(i.conditions)[0]},t.actions=[]),o.actions.push(t),s(e,o)}})})};p()},o=document.querySelector("#settings-container > .settings > .settings-right > .controls");o.querySelectorAll(".control-script-item").forEach(e=>e.remove());for(const e of this.ws.store.control_scripts){const t=document.createElement("div");t.className="settings-section control-script-item",o.appendChild(t),s(t,e)}n()}}zen(){this.deselect(),document.querySelector("#settings-zen-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .zen").classList.remove("hidden")}app(){this.deselect(),document.querySelector("#settings-app-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .app").classList.remove("hidden")}queue(){this.deselect(),document.querySelector("#settings-queue-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .queue").classList.remove("hidden")}accessibility(){this.deselect(),document.querySelector("#settings-accessibility-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .accessibility").classList.remove("hidden")}AI(){this.deselect(),document.querySelector("#settings-AI-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .AI").classList.remove("hidden")}autoReporting(){this.deselect(),document.querySelector("#settings-auto-reporting-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .auto-reporting").classList.remove("hidden")}gadgets(){this.deselect(),document.querySelector("#settings-gadgets-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .gadgets").classList.remove("hidden")}whitelist(e){this.deselect(),document.querySelector(`#settings-whitelist-${e}s-button`).classList.add("selected"),document.querySelector(`#settings-container > .settings > .settings-right > .whitelist.${e}s`).classList.remove("hidden");{const t=document.querySelector(`#settings-whitelist-${e}s-expiry`);t.value=this.ws.store.settings.expiry.whitelist[`${e}s`],t.addEventListener("change",t=>this.ws.store.settings.expiry.whitelist[`${e}s`]=t.target.value);const n=document.querySelector(`#settings-whitelist-${e}s-input`),s=()=>{const t=n.value.trim();t&&(n.value="",this.ws.store.whitelist[`${e}s`].set(t,[Date.now(),this.ws.util.expiryToDate(this.ws.store.settings.expiry.whitelist[`${e}s`]).valueOf()]),this.ws.store.statistics.items_whitelisted.total++,this.ws.store.statistics.items_whitelisted[`${e}s`]++,this.ws.gui.renderQueue(),this.whitelist(e))};if("tag"===e&&this.wikipediaTags){const e=this.wikipediaTags.map(e=>e.name).sort();for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.appendChild(e)}n.setAttribute("list",n.id+"-datalist");const t=document.createElement("datalist");t.id=n.id+"-datalist",n.parentElement.appendChild(t);for(const n of e){const e=document.createElement("option");e.value=n,t.appendChild(e)}}document.querySelector(`#settings-whitelist-${e}s-add-button`).addEventListener("click",s),n.addEventListener("keydown",e=>{"Enter"===e.key&&(s(),e.preventDefault())})}{const t=document.querySelector(`#settings-whitelist-${e}s-list`);t.innerHTML="";const n=t=>{switch(e){case"user":return this.ws.page(`Special:Contributions/${t}`);case"page":return this.ws.page(t);case"tag":return this.ws.page(`Special:Tags/${t}`)}},s=[...this.ws.store.whitelist[`${e}s`]].sort((e,t)=>t[1][1]-e[1][1]);for(const[i,a]of s){const s=document.createElement("div"),r=new Date(a[0]),o=a[1]===1/0?"Never":`${new Date(a[1]).toLocaleDateString()} ${new Date(a[1]).toLocaleTimeString()}`;s.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${n(i)}">${i}</a>\n\t\t\t\t\t\t<span>Added: ${r.toLocaleDateString()} ${r.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now()>a[1]?"expired":""}">\n\t\t\t\t\t\t\t${Date.now()>a[1]?"Expired":"Expires"}: ${o}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from whitelisted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`,s.querySelector(".remove-button").addEventListener("click",()=>{this.ws.store.whitelist[`${e}s`].delete(i),this.ws.gui.renderQueue(),this.whitelist(e)}),t.appendChild(s)}0===s.length&&(t.innerHTML=`<div class="empty">No whitelisted ${e}s.</div>`)}}highlight(e){this.deselect(),document.querySelector(`#settings-highlight-${e}s-button`).classList.add("selected"),document.querySelector(`#settings-container > .settings > .settings-right > .highlight.${e}s`).classList.remove("hidden");{const t=document.querySelector(`#settings-highlight-${e}s-expiry`);t.value=this.ws.store.settings.expiry.highlight[`${e}s`],t.addEventListener("change",t=>this.ws.store.settings.expiry.highlight[`${e}s`]=t.target.value);const n=document.querySelector(`#settings-highlight-${e}s-input`),s=()=>{const t=n.value.trim();t&&(n.value="",this.ws.store.highlight[`${e}s`].set(t,[Date.now(),this.ws.util.expiryToDate(this.ws.store.settings.expiry.highlight[`${e}s`]).valueOf()]),this.ws.store.statistics.items_highlighted.total++,this.ws.store.statistics.items_highlighted[`${e}s`]++,this.ws.gui.renderQueue(),this.highlight(e))};if("tag"===e&&this.wikipediaTags){const e=this.wikipediaTags.map(e=>e.name).sort();for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.appendChild(e)}n.setAttribute("list",n.id+"-datalist");const t=document.createElement("datalist");t.id=n.id+"-datalist",n.parentElement.appendChild(t);for(const n of e){const e=document.createElement("option");e.value=n,t.appendChild(e)}}document.querySelector(`#settings-highlight-${e}s-add-button`).addEventListener("click",s),n.addEventListener("keydown",e=>{"Enter"===e.key&&(s(),e.preventDefault())})}{const t=document.querySelector(`#settings-highlight-${e}s-list`);t.innerHTML="";const n=t=>{switch(e){case"user":return this.ws.page(`Special:Contributions/${t}`);case"page":return this.ws.page(t);case"tag":return this.ws.page(`Special:Tags/${t}`)}},s=[...this.ws.store.highlight[`${e}s`]].sort((e,t)=>t[1][1]-e[1][1]);for(const[i,a]of s){const s=document.createElement("div"),r=new Date(a[0]),o=a[1]===1/0?"Never":`${new Date(a[1]).toLocaleDateString()} ${new Date(a[1]).toLocaleTimeString()}`;s.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${n(i)}">${i}</a>\n\t\t\t\t\t\t<span>Added: ${r.toLocaleDateString()} ${r.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now()>a[1]?"expired":""}">\n\t\t\t\t\t\t\t${Date.now()>a[1]?"Expired":"Expires"}: ${o}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from highlighted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`,s.querySelector(".remove-button").addEventListener("click",()=>{this.ws.store.highlight[`${e}s`].delete(i),this.ws.gui.renderQueue(),this.highlight(e)}),t.appendChild(s)}0===s.length&&(t.innerHTML=`<div class="empty">No highlighted ${e}s.</div>`)}}statistics(){this.deselect(),document.querySelector("#settings-statistics-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .statistics").classList.remove("hidden");document.querySelector("#reset-statistics-button").addEventListener("click",async()=>{await this.ws.gui.dialog.confirm("Reset statistics","Are you sure you want to reset all statistics? This action cannot be undone.",void 0,!0)&&(this.ws.store.statistics={},this.ws.storage.load(this.ws.store),this.ws.time.load=performance.now(),this.statistics())});const e=this.ws.store.statistics;document.querySelector("#stats-total-reviewed").textContent=(e.edits_reviewed.total||0).toLocaleString();document.querySelector("#stats-thanks-percentage").textContent=(e.edits_reviewed.thanked/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-recent-changes-reviewed").textContent=(e.recent_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-recent-changes-percentage").textContent=(e.recent_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-reviewed").textContent=(e.pending_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-pending-changes-accepted").textContent=(e.pending_changes_reviewed.accepted||0).toLocaleString();document.querySelector("#stats-pending-changes-accepted-percentage").textContent=(e.pending_changes_reviewed.accepted/e.pending_changes_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-rejected").textContent=(e.pending_changes_reviewed.rejected||0).toLocaleString();document.querySelector("#stats-pending-changes-rejected-percentage").textContent=(e.pending_changes_reviewed.rejected/e.pending_changes_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-percentage").textContent=(e.pending_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-user-creations-reviewed").textContent=(e.users_reviewed.total||0).toLocaleString();document.querySelector("#stats-user-creations-percentage").textContent=(e.users_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-watchlist-changes-reviewed").textContent=(e.watchlist_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-watchlist-changes-percentage").textContent=(e.watchlist_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-abuselog-changes-reviewed").textContent=(e.abuselogs_reviewed.total||0).toLocaleString();document.querySelector("#stats-abuselog-changes-percentage").textContent=(e.abuselogs_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-reverts-made").textContent=(e.reverts_made.total||0).toLocaleString();document.querySelector("#stats-reverts-percentage").textContent=(e.reverts_made.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-goodfaith-reverts-percentage").textContent=(e.reverts_made.good_faith/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-recent-reverts-percentage").textContent=(e.reverts_made.from_recent_changes/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-pending-reverts-percentage").textContent=(e.reverts_made.from_pending_changes/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-watchlist-reverts-percentage").textContent=(e.reverts_made.from_watchlist/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-abuselog-reverts-percentage").textContent=(e.reverts_made.from_abuselogs/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-other-reverts-percentage").textContent=(e.reverts_made.from_loaded_edits/e.reverts_made.total*100||0).toFixed(2);{document.querySelector("#stats-users-welcomed").textContent=(e.users_welcomed.total||0).toLocaleString();const t=document.querySelector("#stats-users-welcomed-message");e.edits_reviewed.total===e.users_welcomed.total?t.textContent=`You welcome every user whose edit you review! (${e.users_welcomed.total.toLocaleString()})`:0===e.users_welcomed.total?t.innerHTML="For every Infinity edits you review, you still won&rsquo;t welcome a new user.":t.textContent=`For every ${(e.edits_reviewed.total/e.users_welcomed.total||0).toFixed(3)} edits you review, you welcome a new user.`}document.querySelector("#stats-warnings").textContent=(e.warnings_issued.total||0).toLocaleString();document.querySelector("#stats-warning-1-percentage").textContent=(e.warnings_issued.level_1/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-2-percentage").textContent=(e.warnings_issued.level_2/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-3-percentage").textContent=(e.warnings_issued.level_3/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-4-percentage").textContent=(e.warnings_issued.level_4/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-4im-percentage").textContent=(e.warnings_issued.level_4im/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-reports").textContent=(e.reports_filed.total||0).toLocaleString();document.querySelector("#stats-AIV-reports-percentage").textContent=(e.reports_filed.AIV/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-UAA-reports-percentage").textContent=(e.reports_filed.UAA/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-global-block-reports-percentage").textContent=(e.reports_filed.global_block/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-global-lock-reports-percentage").textContent=(e.reports_filed.global_lock/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-RFPP-reports-percentage").textContent=(e.reports_filed.RFPP/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-pages-watched").textContent=(e.watchlist.watched||0).toLocaleString();document.querySelector("#stats-pages-unwatched").textContent=(e.watchlist.unwatched||0).toLocaleString();document.querySelector("#stats-items-whitelisted").textContent=(e.items_whitelisted.total||0).toLocaleString();document.querySelector("#stats-users-whitelisted").textContent=(e.items_whitelisted.users||0).toLocaleString();document.querySelector("#stats-users-whitelisted-percentage").textContent=(e.items_whitelisted.users/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-pages-whitelisted").textContent=(e.items_whitelisted.pages||0).toLocaleString();document.querySelector("#stats-pages-whitelisted-percentage").textContent=(e.items_whitelisted.pages/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-tags-whitelisted").textContent=(e.items_whitelisted.tags||0).toLocaleString();document.querySelector("#stats-tags-whitelisted-percentage").textContent=(e.items_whitelisted.tags/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-items-highlighted").textContent=(e.items_highlighted.total||0).toLocaleString();document.querySelector("#stats-users-highlighted").textContent=(e.items_highlighted.users||0).toLocaleString();document.querySelector("#stats-users-highlighted-percentage").textContent=(e.items_highlighted.users/e.items_highlighted.total*100||0).toFixed(2);document.querySelector("#stats-pages-highlighted").textContent=(e.items_highlighted.pages||0).toLocaleString();document.querySelector("#stats-pages-highlighted-percentage").textContent=(e.items_highlighted.pages/e.items_highlighted.total*100||0).toFixed(2);document.querySelector("#stats-tags-highlighted").textContent=(e.items_highlighted.tags||0).toLocaleString();document.querySelector("#stats-tags-highlighted-percentage").textContent=(e.items_highlighted.tags/e.items_highlighted.total*100||0).toFixed(2);{const t=e.session_time+(performance.now()-this.ws.time.load);document.querySelector("#stats-session-time").textContent=(e=>{const t=Math.floor(e/1e3),n=Math.floor(t/86400),s=Math.floor(t%86400/3600),i=Math.floor(t%3600/60);let a="";return n>0&&(a+=`${n}d `),s>0&&(a+=`${s}h `),i>0&&(a+=`${i}m `),a+=t%60+"s",a.trim()})(t);document.querySelector("#stats-reports-per-day").textContent=(e.reports_filed.total/(t/864e5||1)||0).toFixed(2);document.querySelector("#stats-reverts-per-hour").textContent=(e.reverts_made.total/(t/36e5||1)||0).toFixed(2);document.querySelector("#stats-reviews-per-minute").textContent=(e.edits_reviewed.total/(t/6e4||1)||0).toFixed(2)}}save(){this.deselect(),document.querySelector("#settings-save-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .save").classList.remove("hidden"),document.querySelector("#settings-save-status").classList.add("hidden")}changelog(){this.deselect(),document.querySelector("#settings-changelog-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .changelog").classList.remove("hidden");const e=document.querySelector("#settings-container > .settings > .settings-right > .changelog > div > .changelog-content");e.innerHTML="<em class='animate-loading-dots'>Loading changelog</em>",l.WikiShield.config.changelog.HTML.then(t=>e.innerHTML=t)}about(){this.deselect(),document.querySelector("#settings-about-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .about").classList.remove("hidden"),document.querySelector("#settings-about-version").textContent=l.WikiShield.config.version,document.querySelectorAll("#settings-container > .settings > .settings-right > .about > .randomize").forEach(e=>{for(let t=e.children.length;t>=0;t--)e.appendChild(e.children[Math.random()*t|0])})}}},7698(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.BuildPalette=function(e,...t){const n=document.createElement("canvas");n.width=e,n.height=1;const s=n.getContext("2d"),i=s.createLinearGradient(0,0,n.width,0),a=1/(t.length-1);t.forEach((e,t)=>{i.addColorStop(a*t,e)}),s.fillStyle=i,s.fillRect(0,0,n.width,n.height);const r=s.getImageData(0,0,n.width,1).data;return Array.from({length:e},(e,t)=>{const n=4*t;return`rgb(${r[n]}, ${r[n+1]}, ${r[n+2]})`})}},3241(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.expiryRegex=t.Utility=void 0;var s=n(4551);function i(){i=function(e,t){return new n(e,void 0,t)};var e=RegExp.prototype,t=new WeakMap;function n(e,s,i){var r=RegExp(e,s);return t.set(r,i||t.get(e)),a(r,n.prototype)}function s(e,n){var s=t.get(n);return Object.keys(s).reduce(function(t,n){var i=s[n];if("number"==typeof i)t[n]=e[i];else{for(var a=0;void 0===e[i[a]]&&a+1<i.length;)a++;t[n]=e[i[a]]}return t},Object.create(null))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&a(e,t)}(n,RegExp),n.prototype.exec=function(t){var n=e.exec.call(this,t);if(n){n.groups=s(n,this);var i=n.indices;i&&(i.groups=s(i,this))}return n},n.prototype[Symbol.replace]=function(n,i){if("string"==typeof i){var a=t.get(this);return e[Symbol.replace].call(this,n,i.replace(/\$<([^>]+)(>|$)/g,function(e,t,n){if(""===n)return e;var s=a[t];return Array.isArray(s)?"$"+s.join("$"):"number"==typeof s?"$"+s:""}))}if("function"==typeof i){var r=this;return e[Symbol.replace].call(this,n,function(){var e=arguments;return"object"!=typeof e[e.length-1]&&(e=[].slice.call(e)).push(s(e,r)),i.apply(this,e)})}return e[Symbol.replace].call(this,n,i)},i.apply(this,arguments)}function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}const r=t.expiryRegex=i(/(infinity|^(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)W)?(([0-9]+)D)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?)$/,{years:3,months:5,weeks:7,days:9,hours:11,minutes:13,seconds:15});t.Utility=class{constructor(e){this.ws=e}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}escape(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}utcString(e){if(e===1/0)return"indefinite";const t=this.padString;return`${e.getUTCFullYear()}-${t(e.getUTCMonth()+1,2)}-${t(e.getUTCDate(),2)}T${t(e.getUTCHours(),2)}:${t(e.getUTCMinutes(),2)}:${t(e.getUTCSeconds(),2)}`}padString(e,t){for(e=e.toString();e.length<t;)e=`0${e}`;return e}getMonth(e){return["January","February","March","April","May","June","July","August","September","October","November","December"][e]}monthSectionName(){return`${this.getMonth((new Date).getUTCMonth())} ${(new Date).getUTCFullYear()}`}escape(e){return(e||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}textify(e){const t=document.createElement("div");return t.innerHTML=e,t.textContent||t.innerText||""}pageLink(e,t=!1,n=!0){return t?`https://${this.ws.server}/w/index.php${e}`:`https://${this.ws.server}/wiki/${n?encodeURIComponent(e):e}`}truncate(e,t){return(0,s.truncate)(e,t)}formatBytes(e){if(0===e)return"0 B";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB","RiB","QiB"][t]}getChangeColor(e){if(0===e)return"#888";if(e>0)return e>=1e3?"#00b894":e>=500?"#00d4a1":e>=100?"#26de81":"#55efc4";{const t=Math.abs(e);return t>=1e3?"#d63031":t>=500?"#e74c3c":t>=100?"#ff6b6b":"#ff8787"}}getChangeString(e){return e>0?"+"+e:0===e?"0":`&ndash;${Math.abs(e).toString()}`}formatNotificationTime(e,t=new Date){const n=Math.floor((t-e)/1e3);return n<=0?"Now":n<60?`${n}s ago`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:n<2592e3?`${Math.floor(n/86400)}d ago`:n<31536e3?`${Math.floor(n/2592e3)}mo ago`:`${Math.floor(n/31536e3)}y ago`}formatDuration(e,t=new Date){const n=Math.floor((t-e)/1e3);return n<=0?"0s":n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m`:n<86400?`${Math.floor(n/3600)}h`:n<2592e3?`${Math.floor(n/86400)}d`:n<31536e3?`${Math.floor(n/2592e3)}mo`:`${Math.floor(n/31536e3)}y`}match(e,t){return this.ws.store.settings.username_highlighting.fuzzy?function(e,t,n){const s=e.length,i=t.length;if(0===s)return!0;if(0===i)return s<=n;let a=new Array(i+1).fill(0),r=new Array(i+1).fill(0);for(let e=0;e<=i;e++)a[e]=0;for(let o=1;o<=s;o++){r[0]=o;let l=r[0];for(let d=1;d<=i;d++){const i=e[o-1]===t[d-1]?0:1,c=a[d]+1,u=r[d-1]+1,p=a[d-1]+i,g=Math.min(c,u,p);if(r[d]=g,g<l&&(l=g),o===s&&g<=n)return!0}if(l>n)return!1;[a,r]=[r,a]}return!1}(e,t,2):t.toLowerCase().includes(e.toLowerCase())}isIPv4Address(e){const t="(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|0?[0-9]{1,2})";return new RegExp(`^(${t}\\.){3}${t}$`).test(e)}isIPv6Address(e){return!!new RegExp("^(?::(?::|(?::[0-9A-Fa-f]{1,4}){1,7})|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,6}::|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){7})$").test(e)||new RegExp("^[0-9A-Fa-f]{1,4}(?:::?[0-9A-Fa-f]{1,4}){1,6}$").test(e)&&/::/.test(e)&&!/::.*::/.test(e)}isIPAddress(e){return this.isIPv4Address(e)||this.isIPv6Address(e)}isTempAccount(e){return/^~[0-9]{4,}(-[0-9A-Fa-f]{5})*(-[0-9A-Fa-f]{1,5})$/.test(e)}expiryToDate(e){if("infinity"===e)return 1/0;const t=new Date,n=r.exec(e);return n?new Date(t.getFullYear()+(parseInt(n.groups.years)||0),t.getMonth()+(parseInt(n.groups.months)||0),t.getDate()+7*(parseInt(n.groups.weeks)||0)+(parseInt(n.groups.days)||0),t.getHours()+(parseInt(n.groups.hours)||0),t.getMinutes()+(parseInt(n.groups.minutes)||0),t.getSeconds()+(parseInt(n.groups.seconds)||0)):t}getPageSections(e){const t=e.split("\n"),n=[];let s={title:"",heading:"",level:0,content:""};for(const e of t){const t=/^(=+)\s*(.*?)\s*\1\s*$/.exec(e);t?(""!==s.title&&n.push(s),s={title:t[2],heading:t[0],level:t[1].length,content:""}):(""!==s.content&&(s.content+="\n"),s.content+=e)}return""===s.content&&""===s.title||n.push(s),n}}},5564(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.sortDependencies=function(e){const t=new Map(e.map(e=>[e.id,e])),n=new Set,s=new Set,i=[],a=(e,r)=>{if(n.has(e))return;if(s.has(e)){const t=r.indexOf(e),n=r.slice(t).concat(e).join(" -> ");throw new Error(`Cyclic dependency detected: ${n}`)}const o=t.get(e);if(!o)throw new Error(`Unknown dependency: ${e}`);s.add(e),r.push(e);const l=o.dependencies||[];for(const e of l)a(e,r);r.pop(),n.add(e),s.delete(e),i.push(o)};for(const t of e)n.has(t.id)||a(t.id,[]);return i}},2069(e,t){var n;function s(e,t,n){i(e,t),t.set(e,n)}function i(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function a(e,t){return e.get(o(e,t))}function r(e,t,n){return e.set(o(e,t),n),n}function o(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function l(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.Text=void 0;class d{}l(d,"Lower",Symbol("lower case")),l(d,"Upper",Symbol("UPPER CASE")),l(d,"Title",Symbol("Title Case")),l(d,"Sentence",Symbol("Sentence case")),l(d,"Camel",Symbol("camelCase")),l(d,"Pascal",Symbol("PascalCase")),l(d,"Snake",Symbol("snake_Case")),l(d,"Split",Symbol("split,case"));var c=new WeakMap,u=new WeakMap,p=new WeakMap,g=new WeakSet;class h{static pluralize(e,t,n){return new h(e).plural(n).get(t)}constructor(e,t=d.Sentence){var n,a;i(n=this,a=g),a.add(n),s(this,c,!1),s(this,u,void 0),s(this,p,void 0);const l=m.call(h,e,t);r(c,this,l.inSentenceCase),r(u,this,l.words),r(p,this,o(g,this,v).call(this))}plural(){return r(p,this,o(g,this,v).apply(this,arguments)),this}case(e=d.Sentence){const t=t=>{switch(e){case d.Lower:return t.map(e=>e.toLowerCase()).join(" ");case d.Upper:return t.map(e=>e.toUpperCase()).join(" ");case d.Title:return t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");case d.Sentence:if(a(c,this))return t.join(" ");let e=!0;return t.map(t=>{let n=e?t.charAt(0).toUpperCase()+t.slice(1).toLowerCase():t.toLowerCase();return e=/[.!?]$/.test(t),n}).join(" ");case d.Camel:return t.map((e,t)=>0===t?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("");case d.Pascal:return t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("");case d.Snake:return t.map(e=>e.toLowerCase()).join("_");case d.Split:return t;default:throw new TypeError("Invalid case type, must be a Case value")}},[n,s]=[t(a(u,this)),t(a(p,this))];return Object.freeze({get:(e=1)=>(Number.isNaN(Number(e))||1===e||1n===e||"1"===e?n:s).replace(/(?<!\\)%n/g,e)})}get(e=1){return this.case().get(e)}}function m(e,t){const n=(e=>{switch(t){case d.Lower:case d.Upper:case d.Title:case d.Sentence:return e.split(/\s+/);case d.Camel:case d.Pascal:return e.split(/(?=[A-Z])/);case d.Snake:return e.split(/_/g);case d.Split:throw new TypeError("Split case is only used for output, not input");default:throw new TypeError("Invalid case type, must be a Case value")}})(e.toString().trim());return t===d.Sentence?{inSentenceCase:!0,words:n.map(e=>e.trim()).filter(e=>e.length>0)}:{inSentenceCase:!1,words:n.map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}}function v(e){if(null==e||e){const e=[...a(u,this)],t=e.length-1;return e[t]=(e=>{let t;return t=e.replace(/(?<=sh?|ch|x|z|[^aeiou]o)$/i,"es"),t!==e?t:(t=e.replace(/(?<=[^aeiou])y$/i,"ies"),t!==e?t:(t=e.replace(/fe?$/i,"ves"),t!==e?t:`${e}s`))})(a(u,this)[t]),e}if(!1===e)return[...a(u,this)];if(e instanceof n)return e.case(d.Split).get();throw new TypeError("Invalid plural argument, must be boolean or Text instance")}t.Text=h,n=h,l(h,"Case",d)},8878(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.MediaWikiAPI=void 0;var s=n(1289),i=n(4551),a=n(2852),r=n(6873),o=n(505),l=n(8582);const d=console,c=new Set(l.__servers__.filter(e=>e.tag).map(e=>e.host)),u=new Set(l.__servers__.filter(e=>e.pending_changes).map(e=>e.host));class p{static get pendingChangesServers(){return Array.from(u)}static hasPendingChanges(e){return u.has(e)}static chunk(e,t=50){const n=[],s=e.length;for(let i=0;i<s;i+=t)n.push(e.slice(i,i+t));return n}static paramify(e){return Array.isArray(e)||(e=[e]),[...new Set(e)]}static join(e){return e.join("|").replace(/\|\|+/g,"|")}static getUsername(e,t){return e.fetch(`https://${t}/w/api.php`,{action:"query",meta:"userinfo",uiprop:"name",format:"json",formatversion:2},void 0,"POST",!0).then(e=>{var t;return(null==e||null===(t=e.query)||void 0===t||null===(t=t.userinfo)||void 0===t?void 0:t.name)||null})}constructor(e,t,n,s){var i,o;this.glob=e,this.oauth=t,this.server=n,this.username=s,this.tokens={},null!==(o=(i=p.cache)[n])&&void 0!==o||(i[n]={parse:new r.Trie({size:1e3}),pending:new a.Memory({size:2500,timeout:36e5}),abuse:new a.Memory({size:2500,timeout:9e5}),ores:new a.Memory({size:1e4,timeout:9e5}),diff:new a.Memory({size:500,timeout:3e5})})}close(){this.stream.disconnect()}get cache(){return p.cache[this.server]}build(e={},t=null){return{tags:c.has(null!=t?t:this.server)?"WikiShield script":"",assertuser:this.username,discussiontoolsautosubscribe:"no",...e}}user(e){return`[[Special:Contribs/${e}|${e}]] ([[User talk:${e}|talk]])`}revision(e){return`[[Special:Diff/${e}|${e}]]`}centralAuthUser(e){return`[[Special:CentralAuth/${e}|${e}]]`}summary(e,t){const n=" ([[:en:WP:WikiShield|WS]])",s=`${e}${t?`: ${t}`:""}`;return`${(0,i.truncate)(s,473)}${n}`}async post(e,t=!1,n=null){try{const s=await this.oauth.fetch(`https://${n||this.server}/w/api.php`,this.build({...e,format:"json",formatversion:2},n),void 0,"POST",t,n);if(s.error){if("alreadyrolled"===s.error.code||"editconflict"===s.error.code)return"editconflict";if("missingcontent"===s.error.code&&"compare"===e.action)return{compare:{body:""}};throw new Error(`API Error: ${s.error.code} - ${s.error.info}`)}return s}catch(t){throw d.error("Error in API POST request:",t,JSON.stringify(e)),t}}async continuous(e,t,n,s){try{let i=null;const a=[];do{const r=await this.post({...e,...i||{}},n,s);a.push(r),i=r.continue||null,"function"==typeof t&&!0===await t(r,a)&&(i=!1)}while(i);return{stopped:null!==i,responses:a}}catch(t){return d.error("Error in API continuous request:",t,JSON.stringify(e)),{stopped:!0,responses:[]}}}async getToken(e="csrf",t,n){const s=`${null!=n?n:this.server}:${e}`;if(void 0!==this.tokens[s])return this.tokens[s];try{return this.tokens[s]=this.post({action:"query",meta:"tokens",type:e},t,n).then(t=>{var n;return(null==t||null===(n=t.query)||void 0===n||null===(n=n.tokens)||void 0===n?void 0:n[`${e}token`])||null})}catch(e){throw d.error("Error fetching token:",e),e}}async postWithToken(e,t="csrf",n,s){try{return await this.post({...e,token:await this.getToken(t,n,s)},n,s)}catch(e){throw d.error("Post with token error:",e),e}}async account(e,t){try{var n;return(null===(n=await this.post({action:"query",meta:"userinfo",uiprop:"*"},e,t))||void 0===n||null===(n=n.query)||void 0===n?void 0:n.userinfo)||{}}catch(e){var s;return null!==(s=void d.error("Error fetching account info:",e))&&void 0!==s?s:{}}}async getGlobalUserInfo(e,t,n){try{var s;return(null===(s=(await this.post({action:"query",meta:"globaluserinfo",guiuser:e,guiprop:"groups|rights"},t,n)).query)||void 0===s?void 0:s.globaluserinfo)||{}}catch(e){var i;return null!==(i=void d.error("Error fetching global user info:",e))&&void 0!==i?i:{}}}async markWatchlistSeen(e,t,n,s){try{await this.postWithToken({action:"setnotificationtimestamp",titles:e,newerthanrevid:t},"csrf",n,s)}catch(e){var i;return null!==(i=void d.error("Error marking watchlist item as seen:",e))&&void 0!==i?i:{valid:!1,reason:e.message}}}async append(e,t,n,s,i=null,a,r){try{if(null!==i){return{needsCheck:!0,text:(await this.getPagesContent([e],a,r))[e]||""}}return"editconflict"===await this.postWithToken({action:"edit",title:e,...null===(null!=t?t:null)?{}:{section:t},appendtext:`\n${n}`,summary:s},"csrf",a,r)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var o;return null!==(o=void d.error("Error appending to section:",e))&&void 0!==o?o:{valid:!1,reason:e.message}}}async editSection(e,t,n,s,i,a=null,r,o){try{if(null!==a){return{needsCheck:!0,text:(await this.getPagesContent([e],r,o))[e]||""}}return"editconflict"===await this.postWithToken({action:"edit",title:e,section:t,sectiontitle:n,text:s,summary:i},"csrf",r,o)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var l;return null!==(l=void d.error("Error editing section:",e))&&void 0!==l?l:{valid:!1,reason:e.message}}}async acceptPendingEdit(e,t,n,s){try{return await this.postWithToken({action:"review",revid:e,comment:t},"csrf",n,s),{valid:!0}}catch(e){return{valid:!1,reason:"Edit could not be accepted."}}}async rejectPendingEdit(e,t,n,s,i,a){try{const r=(await this.getRevisionsContent([t],i,a))[t]||"";return"editconflict"===await this.postWithToken({action:"edit",title:n,text:r,summary:s,baserevid:e},"csrf",i,a)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){return{valid:!1,reason:"Edit could not be rejected."}}}async rollbackEdit(e,t,n,s,i){try{var a;const r=await this.postWithToken({action:"rollback",title:e,user:t,summary:n},"rollback",s,i);if("editconflict"===r)return{valid:!1,reason:"Edit conflict."};if("onlyauthor"===r)return{valid:!1,reason:"Cannot rollback edits as the no other user has edited the page."};if(null===(a=r.rollback)||void 0===a||!a.revid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,r.rollback.revid,s,i)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var r;return null!==(r=void d.error("Error rolling back edit:",e))&&void 0!==r?r:{valid:!1,reason:e.message}}}async undoEdit(e,t,n,s,i){try{var a;const r=await this.postWithToken({action:"edit",title:e,undo:t,summary:n},"csrf",s,i);if("editconflict"===r)return{valid:!1,reason:"Edit conflict."};if(null===(a=r.edit)||void 0===a||!a.newrevid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,r.edit.newrevid,s,i)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var r;return null!==(r=void d.error("Error undoing edit:",e))&&void 0!==r?r:{valid:!1,reason:e.message}}}async restoreEdit(e,t,n,i,a){try{var r;const o=(0,s.convertToUTCString)(new Date),l=(await this.getRevisionsContent([t],i,a))[t]||"",d=await this.postWithToken({action:"edit",title:e,text:l,summary:n,starttimestamp:o},"csrf",i,a);if("editconflict"===d)return{valid:!1,reason:"Edit conflict."};if(null===(r=d.edit)||void 0===r||!r.newrevid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,d.edit.newrevid,i,a)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var o;return null!==(o=void d.error("Error restoring edit:",e))&&void 0!==o?o:{valid:!1,reason:e.message}}}async thankRevision(e,t,n){try{return await this.postWithToken({action:"thank",rev:e},"csrf",t,n),{valid:!0}}catch(e){var s;return null!==(s=void d.error("Error thanking revision:",e))&&void 0!==s?s:{valid:!1,reason:e.message}}}async watchPage(e,t,n,s){try{return await this.postWithToken({action:"watch",title:e,expiry:t},"watch",n,s),{valid:!0}}catch(e){var i;return null!==(i=void d.error("Error watching page:",e))&&void 0!==i?i:{valid:!1,reason:e.message}}}async unwatchPage(e,t,n){try{return await this.postWithToken({action:"watch",title:e,unwatch:!0},"watch",t,n),{valid:!0}}catch(e){var s;return null!==(s=void d.error("Error unwatching page:",e))&&void 0!==s?s:{valid:!1,reason:e.message}}}async parse(e,t,n=!1,s,i){null!=t||(t=void 0);const a=[t,e].filter(e=>void 0!==e);if(this.cache.parse.has(...a))return this.cache.parse.get(...a);try{var r;const o=(null===(r=await this.post({action:"parse",prop:"text",preview:n,text:e,title:t,contentmodel:"wikitext"},s,i))||void 0===r||null===(r=r.parse)||void 0===r?void 0:r.text)||"";return this.cache.parse.set(...a,o),o}catch(e){var o;return null!==(o=void d.error("Error parsing wikitext:",e))&&void 0!==o?o:""}}async getTags(e,t){try{return(await this.continuous({action:"query",list:"tags",tglimit:"max"},void 0,e,t)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.tags)||[]})}catch(e){var n;return null!==(n=void d.error("Error fetching revisions between IDs:",e))&&void 0!==n?n:[]}}async getPagesContent(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"content",rvslots:"*",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=(null===(i=t.revisions)||void 0===i||null===(i=i[0])||void 0===i||null===(i=i.slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content)||""}return r}catch(e){var a;return null!==(a=void d.error("Error fetching pages content:",e))&&void 0!==a?a:{}}}async getRevisionsContent(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|content",rvslots:"*",revids:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s;for(const e of t.revisions||[]){var i;r[e.revid]=(null===(i=e.slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content)||""}}return r}catch(e){var a;return null!==(a=void d.error("Error fetching revisions content:",e))&&void 0!==a?a:{}}}async getLatestIds(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=(null===(i=t.revisions)||void 0===i||null===(i=i[0])||void 0===i?void 0:i.revid)||null}return r}catch(e){var a;return null!==(a=void d.error("Error fetching latest IDs:",e))&&void 0!==a?a:{}}}async getRevisionsBetween(e,t,n,s,i){try{return(await this.continuous({action:"query",prop:"revisions",titles:e,rvstartid:n,rvendid:t,rvprop:"title|ids|flags|user|timestamp|comment|parsedcomment|size|tags",rvlimit:"max"},void 0,s,i)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions)||[]})}catch(e){var a;return null!==(a=void d.error("Error fetching revisions between IDs:",e))&&void 0!==a?a:[]}}async getEditCounts(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",list:"users",usprop:"editcount",ususers:p.join(e)},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.users)||[]){var s;a[t.name]=t.editcount}return a}catch(e){var i;return null!==(i=void d.error("Error fetching edit counts:",e))&&void 0!==i?i:{}}}async areUsersBlocked(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",list:"blocks",bkusers:p.join(e),bkprop:"id|user|by|reason|expiry|flags"},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.blocks)||[]){var s;a[t.user]=t}return a}catch(e){var i;return null!==(i=void d.error("Error fetching blocked users:",e))&&void 0!==i?i:{}}}async isUserGloballyLocked(e,t,n){try{var s;return!0===(null===(s=(await this.post({action:"query",meta:"globaluserinfo",guiuser:e},t,n)).query)||void 0===s||null===(s=s.globaluserinfo)||void 0===s?void 0:s.locked)}catch(e){var i;return null!==(i=void d.error("Error checking if user is globally locked:",e))&&void 0!==i&&i}}async getContributions(e,t=10,n,s){try{var i;return(null===(i=(await this.post({action:"query",list:"usercontribs",ucuser:e,uclimit:t,ucprop:"ids|title|timestamp|comment|parsedcomment|flags|tags|sizediff|flags"},n,s)).query)||void 0===i?void 0:i.usercontribs)||[]}catch(e){var a;return null!==(a=void d.error("Error fetching contributions:",e))&&void 0!==a?a:[]}}async getBlocks(e,t,n){try{return(await this.continuous({action:"query",list:"logevents",letype:"block",letitle:`User:${e}`,leaction:"block/block",lelimit:"max",leprop:"id|timestamp|details|user|comment|parsedcomment"},void 0,t,n)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.logevents)||[]})}catch(e){var s;return null!==(s=void d.error("Error fetching blocks:",e))&&void 0!==s?s:[]}}async pagesExist(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"content",rvslots:"*",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=t.missing||null===(i=t.revisions)||void 0===i||null===(i=i[0].slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content}return r}catch(e){var a;return null!==(a=void d.error("Error checking page existence:",e))&&void 0!==a?a:[]}}async getPagesDetails(e,t,n){e=p.paramify(e);try{const o=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.continuous({action:"query",prop:"info|categories|templates",titles:p.join(e),inprop:"protection|watched",cllimit:"max",tllimit:"max",tlnamespace:"10"},void 0,t,n))),l={};for(const e of o)if("fulfilled"===e.status)for(const t of e.value.responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.pages)||[]})){var s,i,a,r;null!==(i=l[s=t.title])&&void 0!==i||(l[s]={protection:null,watched:!1,categories:[],metadata:[]});let e=(null===(a=l[t.title])||void 0===a||null===(a=a.protection)||void 0===a?void 0:a.level)||null;for(const n of t.protection||[])"edit"===n.type&&("sysop"===n.level||"sysop"===e?e="sysop":"autoconfirmed"===n.level||"autoconfirmed"===e?e="autoconfirmed":"extendedconfirmed"!==n.level&&"extendedconfirmed"!==e||(e="extendedconfirmed"));const n=[];for(const e of t.templates||[]){const t=e.title.replace(/^Template:/i,"");t.match(/^use\s/i)&&n.push(t)}l[t.title]={protection:null===e?{protected:!1}:{protected:!0,level:e},watched:!0===t.watched||l[t.title].watched,categories:l[t.title].categories.concat((null===(r=t.categories)||void 0===r?void 0:r.map(e=>e.title))||[]),metadata:l[t.title].metadata.concat(n)}}return l}catch(e){var o;return null!==(o=void d.error("Error fetching page details:",e))&&void 0!==o?o:{}}}async getHistory(e,t=10,n,s){try{var i;const a=null===(i=(await this.post({action:"query",prop:"revisions",titles:e,rvlimit:t+1,rvprop:"ids|user|timestamp|comment|parsedcomment|flags|tags|size|flags"},n,s)).query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];if(null==a||!a.revisions)return[];const r=a.revisions.length,o=Math.min(t,r||0);for(let e=0;e<o;e++){const t=a.revisions[e];t.ns=a.ns,t.pageid=a.pageid,t.title=a.title,t.sizediff=e+1<r?t.size-a.revisions[e+1].size:t.size}return a.revisions.slice(0,o)}catch(e){var a;return null!==(a=void d.error("Error fetching page history:",e))&&void 0!==a?a:[]}}async countPageReverts(e,t,n,i){const a=e=>"mw-undo"===e||"mw-rollback"===e||"mw-manual-revert"===e;try{const o=await this.continuous({action:"query",prop:"revisions",titles:e,rvdir:"newer",rvstart:(0,s.convertToUTCString)(new Date(Date.now()-864e5)),rvprop:"tags",rvuser:t,rvlimit:"max"},void 0,n,i);let l=0;for(const e of o.responses){var r;l+=(null===(r=e.query)||void 0===r||null===(r=r.pages)||void 0===r||null===(r=r[0])||void 0===r||null===(r=r.revisions)||void 0===r?void 0:r.filter(e=>e.tags.some(a)).length)||0}return l}catch(e){var o;return null!==(o=void d.error("Error counting page reverts:",e))&&void 0!==o?o:0}}async getORES(e,t,n,s){e=p.paramify(e);try{const a={};e=e.filter(e=>{var t;const n=this.cache.ores.get(e);return!n||null!==(t=void(a[e]=n))&&void 0!==t&&t});const r=p.chunk(e,50),l=await Promise.allSettled(r.map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|oresscores",rvslots:"*",revids:p.join(e)},n,s)));for(const e of l)if("fulfilled"===e.status)for(const t of(null===(i=e.value.query)||void 0===i?void 0:i.pages)||[]){var i;for(const e of t.revisions||[])a[e.revid]=e.oresscores||{}}return o.ORES.extract(a,t)}catch(e){var a;return null!==(a=void d.error("Error fetching ORES scores:",e))&&void 0!==a?a:{}}}async extractORES(e,t=.5){return o.ORES.extract(e,t)}async getDiff(e,t,n="table",s,i){null!=e||(e=!1);const a=`${n}@${e}-${t}`;if(this.cache.diff.has(a))return this.cache.diff.get(a);try{var r;const o={action:"compare",prop:"diff",difftype:n,torev:t};0==e?(o.fromslots="main",o["fromtext-main"]=""):o.fromrev=e;const l=(null===(r=(await this.post(o,s,i)).compare)||void 0===r?void 0:r.body)||"";return this.cache.diff.set(a,l),l}catch(e){var o;return null!==(o=void d.error("Error fetching diff:",e))&&void 0!==o?o:""}}async getWikitextDiff(e,t,n="table",s,i){null!=e||(e=!1);try{var a;return(null===(a=(await this.post({action:"compare",prop:"diff",difftype:n,fromslots:"main","fromtext-main":!1===e?"":e,toslots:"main","totext-main":t},s,i)).compare)||void 0===a?void 0:a.body)||""}catch(e){var r;return null!==(r=void d.error("Error fetching wikitext diff:",e))&&void 0!==r?r:""}}async getSizeDiff(e,t,n,s){try{var i;const a=await(null===(i=this.post({action:"query",prop:"revisions",rvprop:"size",revids:`${e}|${t}`},n,s).query)||void 0===i||null===(i=i.pages)||void 0===i||null===(i=i[0])||void 0===i?void 0:i.revisions)||[];return 0===a.length?0:1===a.length?a[0].size:a[1].size-a[0].size}catch(e){var a;return null!==(a=void d.error("Error fetching size diff:",e))&&void 0!==a?a:0}}async getRevision(e,t,n,s){try{var i,a,r;const o=null===(i=(await this.post({action:"query",prop:"revisions",titles:e,rvprop:"ids|user|comment|parsedcomment|timestamp|size|tags|flags",rvslots:"*",rvstartid:t,rvlimit:2},n,s)).query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];if(null==o||null===(a=o.revisions)||void 0===a||!a.length)return{};const l=o.revisions[0];return{revid:l.revid,parentid:l.parentid,user:l.user,parsedcomment:l.parsedcomment,comment:l.comment,timestamp:l.timestamp,size:l.size,oldlen:(null===(r=o.revisions[1])||void 0===r?void 0:r.size)||0,minor:l.minor||!1,tags:l.tags||[]}}catch(e){var o;return null!==(o=void d.error("Error fetching revision:",e))&&void 0!==o?o:{}}}async getRevisions(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|user|comment|parsedcomment|timestamp|size|tags|flags|oresscores",rvslots:"*",revids:p.join(e)},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s;for(const e of t.revisions||[])a[e.revid]=e}return a}catch(e){var i;return null!==(i=void d.error("Error fetching revisions:",e))&&void 0!==i?i:{}}}async getConsecutiveEdits(e,t,n,s,i){try{var a,r;const o=await this.continuous({action:"query",prop:"revisions",titles:e,rvprop:"ids|timestamp|user|size|parsedcomment",rvlimit:"max",rvstartid:t},e=>{var t;return null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions.some(e=>e.user!==n)},s,i),l=o.responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions)||[]});let d,c;const u=l[0];if((null==u?void 0:u.user)!==n)return{count:0,sizediff:0,timestamp:{new:null,old:null},diff:null,edits:[]};const p={count:0,sizediff:0,timestamp:{new:null,old:null},diff:null,edits:[]},g=l.length;for(let e=0;e<g;e++){const t=l[e];if(c=t,t.user!==n)break;p.edits.push(t),d=t,p.count++,p.sizediff+=e+1<g?t.size-l[e+1].size||0:t.size||0}return p.timestamp.new=(null==u?void 0:u.timestamp)||null,p.timestamp.old=(null===(a=d)||void 0===a?void 0:a.timestamp)||null,o.stopped?p.diff=await this.getDiff((null===(r=c)||void 0===r?void 0:r.revid)||null,u.revid,"table",s,i):p.diff=await this.getDiff(null,u.revid,"table",s,i),p}catch(e){return d.error("Get consecutive edits error:",e),{count:0,sizediff:0,timestamp:{new:null,old:null},diff:null}}}async parseUsers(e,t,n,s){e=p.paramify(e);const i=Array.from({length:e.length},()=>({user:{}}));try{const a=[];return a.push(this.getEditCounts(e,n,s).then(t=>{e.forEach((e,n)=>i[n].user.edits=t[e]||0)}),this.areUsersBlocked(e,n,s).then(t=>{e.forEach((e,n)=>i[n].user.blocked=t[e]||null)}),this.pagesExist(e.map(e=>`User talk:${e}`),n,s).then(t=>{e.forEach((e,n)=>i[n].user.talk=t[`User talk:${e}`])})),t||a.push((async()=>{await Promise.all(e.map(async(e,t)=>{[i[t].user.contributions,i[t].user.blocks]=await Promise.all([this.getContributions(e,void 0,n,s),this.getBlocks(e,n,s)])}))})()),await Promise.all(a),i}catch(e){var a;return null!==(a=void d.error("Parse user error:",e))&&void 0!==a?a:i}}async parseEdits(e,t,n,s,i){e=p.paramify(e);const a=p.paramify(e.map(e=>e.item.user)),r=p.paramify(e.map(e=>e.item.revid)),o=p.paramify(e.map(e=>e.item.title)),l=e.map(({item:e,prior:t})=>({item:e,prior:t,data:{user:{},page:{},edit:{}}}));try{const d=[];return d.push(this.parseUsers(a,t,s,i).then(t=>{e.forEach((e,n)=>{const s=a.indexOf(e.item.user);l[n].data.user=t[s].user})}),this.getPagesDetails(o,s,i).then(t=>{e.forEach((e,n)=>{var s,i,a,r;l[n].data.page.protection=(null===(s=t[e.item.title])||void 0===s?void 0:s.protection)||{protected:!1},l[n].data.page.watched=(null===(i=t[e.item.title])||void 0===i?void 0:i.watched)||!1,l[n].data.page.categories=(null===(a=t[e.item.title])||void 0===a?void 0:a.categories)||[],l[n].data.page.metadata=(null===(r=t[e.item.title])||void 0===r?void 0:r.metadata)||[]})}),this.getORES(r,n,s,i).then(t=>{e.forEach((e,n)=>{l[n].data.edit.ores=t[e.item.revid]||0})})),t||d.push((async()=>{await Promise.all(e.map(async(e,t)=>{[l[t].data.page.consecutive,l[t].data.page.reverts,l[t].data.page.history,l[t].data.edit.diff]=await Promise.all([this.getConsecutiveEdits(e.item.title,e.item.revid,e.item.user,s,i),this.countPageReverts(e.item.title,this.username,s,i),this.getHistory(e.item.title,void 0,s,i),this.getDiff(e.prior||null,e.item.revid,"table",s,i)])}))})()),await Promise.all(d),l}catch(e){var c;return null!==(c=void d.error("Parse edit error:",e))&&void 0!==c?c:l}}async parseAbuselogs(e,t,n,s){e=p.paramify(e);const i=p.paramify(e.map(e=>e.user)),a=p.paramify(e.map(e=>e.title)),r=e.map(e=>({item:e,data:{user:{},page:{},edit:{}}}));try{const o=[];return o.push((async()=>{await Promise.all(e.map(async(e,t)=>{[r[t].data.parsedcomment]=await Promise.all([this.parse(e.comment,void 0,!1,n,s)])}))})(),this.parseUsers(i,t,n,s).then(t=>{e.forEach((e,n)=>{const s=i.indexOf(e.user);r[n].data.user=t[s].user})}),this.getPagesDetails(a,n,s).then(t=>{e.forEach((e,n)=>{var s,i,a,o;r[n].data.page.protection=(null===(s=t[e.title])||void 0===s?void 0:s.protection)||{protected:!1},r[n].data.page.watched=(null===(i=t[e.title])||void 0===i?void 0:i.watched)||!1,r[n].data.page.categories=(null===(a=t[e.title])||void 0===a?void 0:a.categories)||[],r[n].data.page.metadata=(null===(o=t[e.title])||void 0===o?void 0:o.metadata)||[]})})),t||o.push((async()=>{await Promise.all(e.map(async(e,t)=>{[r[t].data.page.reverts,r[t].data.page.history,r[t].data.edit.diff]=await Promise.all([this.countPageReverts(e.title,this.username,n,s),this.getHistory(e.title,void 0,n,s),e.diff?this.getWikitextDiff(e.diff.old,e.diff.new,"table",n,s):Promise.resolve(null)])}))})()),await Promise.all(o),r}catch(e){var o;return null!==(o=void d.error("Parse abuselog error:",e))&&void 0!==o?o:r}}async getAbuseLogRevid(e,t,n){try{var s,i;return(null===(i=((null===(s=(await this.post({action:"query",list:"abuselog",afllogids:e,aflprop:"ids|revid"},t,n)).query)||void 0===s?void 0:s.abuselog)||[]).find(t=>t.id===e))||void 0===i?void 0:i.revid)||null}catch(e){var a;return null!==(a=void d.error("Error fetching abuse log revids:",e))&&void 0!==a?a:{}}}async feeds(e=null,t=null,n=null,s=null,i=null){[e,t,n,s,i]=[e,t,n,s,i].map(e=>"object"==typeof e?e:{});try{const a={action:"query",list:[]};null!==e&&(a.list.push("recentchanges"),a.rctype="edit",a.rcprop="title|ids|sizes|flags|user|timestamp|comment|parsedcomment|tags|oresscores",a.rcshow="!bot",a.rcnamespace=e.ns||"*",e.since&&(a.rcstart=e.since),a.rcdir=e.since?"newer":"older",a.rclimit="max"),null!==t&&u.has(this.server)&&(a.list.push("oldreviewedpages"),a.ornamespace=t.ns||"*",a.orlimit="max"),null!==n&&(a.list.push("logevents"),a.letype="newusers",a.wlprop="ids|title|type|user|timestamp|comment|details|parsedcomment",n.since&&(a.lestart=n.since),a.ledir=n.since?"newer":"older",a.lelimit="max"),null!==s&&(a.list.push("watchlist"),a.wltype="edit",a.wlprop="title|ids|sizes|flags|user|timestamp|comment|tags|oresscores|parsedcomment",a.wlexcludeuser=this.username,a.wlnamespace=s.ns||"*",s.since&&(a.wlstart=s.since),a.wldir=s.since?"newer":"older",a.wllimit="max"),null!==i&&(a.list.push("abuselog"),a.aflnamespace=i.ns||"*",i.since&&(a.aflstart=i.since),a.afldir=i.since?"newer":"older",a.aflprop="ids|user|title|action|result|timestamp|hidden|revid|filter|details",a.afllimit="max"),a.list=p.join(a.list);const r={recent:[],pending:[],users:[],watchlist:[],abuselog:[]};if((await this.continuous(a)).responses.forEach(e=>{const t=e.query||{};t.recentchanges&&(r.recent=r.recent.concat(t.recentchanges)),t.oldreviewedpages&&(r.pending=r.pending.concat(t.oldreviewedpages).slice(0,100)),t.logevents&&(r.users=r.users.concat(t.logevents.filter(e=>!e.temp))),t.watchlist&&(r.watchlist=r.watchlist.concat(t.watchlist)),t.abuselog&&(r.abuselog=r.abuselog.concat(t.abuselog))}),r.pending.length>0){const e=new Map,n={};if(await Promise.allSettled(r.pending.map(async t=>{var s,i,a;this.cache.pending.has(t.revid)||this.cache.pending.set(t.revid,await this.post({action:"query",prop:"revisions",titles:t.title,rvstartid:t.revid,rvlimit:1,rvprop:"ids|flags|user|timestamp|comment|parsedcomment|size|tags"}));const r=this.cache.pending.get(t.revid);e.has(t.title)||e.set(t.title,this.post({action:"query",list:"logevents",letype:"stable",leprop:"ids|title|type|user|timestamp|comment|details|parsedcomment",letitle:t.title,lelimit:1})),t.stability=(null===(s=await e.get(t.title))||void 0===s||null===(s=s.query)||void 0===s||null===(s=s.logevents)||void 0===s?void 0:s[0])||{};const o=null===(i=r.query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];n[t.title]={title:t.title,sizediff:t.diff_size,...null===(a=o.revisions)||void 0===a?void 0:a[0],pending:t}})),r.pending=Object.values(n),!0===t.full){const e={};await Promise.allSettled(r.pending.map(async t=>{const n=await this.getRevisionsBetween(t.title,t.pending.stable_revid,t.revid);if(n.length<2)return;const s=n.pop();e[t.title]={count:n.length,users:n.reduce((e,t)=>(t.user in e?e[t.user]++:e[t.user]=1,e),{}),edits:n,revid:t.revid,prior:s.revid,sizediff:t.size-s.size,timestamp:{new:t.timestamp,old:n[n.length-1].timestamp},pending:t.pending}})),r.pending=e}}if(r.abuselog.length>0){const e={};r.abuselog.forEach(t=>{if("edit"!==t.action)return;const n=`${t.user}|${t.title}|${t.timestamp}`;n in e?e[n].push(t):e[n]=[t]});const t=[];await Promise.allSettled(Object.entries(e).map(async([,e])=>{var n,s,i,a,r;const o=e[e.length-1],l=new Set(e.flatMap(e=>e.result.split(","))),d=e.find(e=>""!==e.revid&&void 0!==e.revid),c=e.find(e=>Object.keys(e.details).length);t.push({id:o.id,revision:void 0!==d,private:!c,result:l,action:o.action,revid:null!==(n=null==d?void 0:d.revid)&&void 0!==n?n:null,diff:c.details?{new:c.details.new_wikitext,old:c.details.old_wikitext,size:c.details.edit_delta}:null,timestamp:o.timestamp,comment:null!==(s=null==c||null===(i=c.details)||void 0===i?void 0:i.summary)&&void 0!==s?s:null,user:o.user,editcount:null!==(a=null==c||null===(r=c.details)||void 0===r?void 0:r.user_editcount)&&void 0!==a?a:null,ns:o.ns,title:o.title,entries:e})})),r.abuselog=t}return r}catch(e){return d.error("Feeds error:",e),{recent:[],pending:t.full?{}:[],users:[],watchlist:[],abuselog:[]}}}}var g,h,m;t.MediaWikiAPI=p,g=p,m={},(h=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(h="cache"))in g?Object.defineProperty(g,h,{value:m,enumerable:!0,configurable:!0,writable:!0}):g[h]=m},2486(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.build=async function(){document.head.querySelectorAll("link[rel=stylesheet]").forEach(e=>e.remove());const e=(new DOMParser).parseFromString(s.default,"text/html");document.title=e.title,e.head.querySelectorAll("link[rel=stylesheet]").forEach(e=>{document.head.appendChild(Object.assign(document.createElement("link"),{rel:"stylesheet",href:e.href}))});[i.default,a.default].filter(Boolean).forEach(e=>{const t=document.createElement("style");t.textContent=e,document.head.appendChild(t)});document.body.innerHTML=e.body.innerHTML,await new Promise(requestAnimationFrame)};var s=r(n(5540)),i=r(n(4279)),a=r(n(2459));function r(e){return e&&e.__esModule?e:{default:e}}},4112(e,t){function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function s(e,t){return e.get(a(e,t))}function i(e,t,n){return e.set(a(e,t),n),n}function a(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.MediaWikiOAuth2=void 0;var r=new WeakMap,o=new WeakMap;class l{constructor(e){n(this,r,void 0),n(this,o,0),i(r,this,Date.now()),this.delay=e,this.last=0}get count(){return s(o,this)}per(e=1){return Math.floor(s(o,this)/((Date.now()-s(r,this))/e))||0}call(e,t=!1){var n;i(o,this,(n=s(o,this),n++,n));const a=Date.now(),r=Math.max(0,this.last+this.delay-a);return this.last=a+r,t||0===r?e():new Promise(t=>setTimeout(async()=>t(await e()),r))}}t.MediaWikiOAuth2=class{constructor(e){this.userAgent=e,this.throttle=new l(0),this.api=new mw.Api}getOrigin(e){const t=`${location.protocol}//${location.host}`;try{const n=new URL(e);if(`${n.protocol}//${n.host}`===t)return}catch(e){}return t}async fetch(e,t={},n=null,s="POST",i){return await this.throttle.call(async()=>{const n=this.getOrigin(e);return n&&(e+=(e.includes("?")?"&":"?")+`origin=${encodeURIComponent(n)}`),await this.api.ajax({...t,origin:n},{url:e,method:s,...n?{xhrFields:{withCredentials:!0}}:{}}).catch(e=>{throw console.error(`[WikiSHield] Failed to parse OAuth2 response (rpm: ${this.throttle.per(6e4)}):`,e),e})},i)}}},505(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ORES=void 0;t.ORES=class{static extract(e,t=.5){const n=[{key:"goodfaith",field:"false",bias:t},{key:"damaging",field:"true",bias:1-t}],s={};for(const[t,r]of Object.entries(e)){const e=[];for(const t of n){var i,a;const n=r[t.key];if(!n)continue;let s=null!==(i=null===(a=n.probability)||void 0===a?void 0:a[t.field])&&void 0!==i?i:n[t.field];void 0===s&&void 0!==n.prediction&&(s=+n.prediction),void 0===s||isNaN(s)||e.push(s*(t.bias||0))}s[t]=0===e.length?NaN:e.reduce((e,t)=>e+t,0)/e.length}return s}}},8582(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.__servers__=void 0;t.__servers__=[{name:"English",host:"en.wikipedia.org",language_code:"en",tag:!0,pending_changes:!0},{name:"seperator"},{name:"Test",host:"test2.wikipedia.org",language_code:"en",tag:!1,pending_changes:!0}]},2535(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.API=void 0;var s=n(4551),i=n(8878),a=n(4112);function r(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function o(e,t,n){return e.set(d(e,t),n),n}function l(e,t){return e.get(d(e,t))}function d(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}const c=new Set([]);let u=t.API=void 0;var p,g,h,m;window.isElectron?t.API=(p=new WeakMap,g=new WeakMap,h=new WeakMap,u=class{static chunk(e,t=50){const n=[],s=e.length;for(let i=0;i<s;i+=t)n.push(e.slice(i,i+t));return n}static paramify(e){return Array.isArray(e)||(e=[e]),[...new Set(e)].filter(e=>"string"==typeof e&&e.trim())}get username(){return l(h,this)}get hasPendingChanges(){return c.has(l(g,this))}constructor(e,t,n,s){r(this,p,null),r(this,g,null),r(this,h,null),o(p,this,e),o(g,this,t),o(h,this,n);for(const e of s)c.add(e)}build(e={}){return{assertuser:l(h,this),discussiontoolsautosubscribe:"no",...e}}summary(e,t){const n=" ([[:en:WP:WikiShield|WS]])",i=`${e}${t?`: ${t}`:""}`;return`${(0,s.truncate)(i,473)}${n}`}user(e){return`[[Special:Contribs/${e}|${e}]] ([[User talk:${e}|talk]])`}revision(e){return`[[Special:Diff/${e}|${e}]]`}centralAuthUser(e){return`[[Special:CentralAuth/${e}|${e}]]`}async post(e,t,n){try{return await electron.mwapi("post",e,t,n)}catch(e){var s;if("assertnameduserfailed"===e||null!==(s=e.message)&&void 0!==s&&s.includes("assertnameduserfailed"))return l(p,this).disable("Invalid account","Your account was logged out or changed.");throw e}}async continuous(e,t,n,s){try{let i=null;const a=[];do{const r=await this.post({...e,...i||{}},n,s);if(a.push(r),i=r.continue||null,"function"==typeof t&&!0===await t(r,a)){i=!0;break}}while(i);return{stopped:null!==i,responses:a}}catch(e){return console.error("Continuous error:",e),{stopped:!0,responses:[]}}}async getToken(e="csrf",t,n){return await electron.mwapi("getToken",e,t,n)}async postWithToken(e,t="csrf",n,s){return await electron.mwapi("postWithToken",e,t,n,s)}async account(e,t){return await electron.mwapi("account",e,t)}async getGlobalUserInfo(e,t,n){return await electron.mwapi("getGlobalUserInfo",e,t,n)}async markWatchlistSeen(e,t,n,s){return await electron.mwapi("markWatchlistSeen",e,t,n,s)}async append(e,t,n,s,i,a,r){if("function"==typeof i){const o=await electron.mwapi("append",e,t,n,s,!0,a,r);if(o.needsCheck){const l=await i(o.text);return l.valid?await electron.mwapi("append",e,t,n,s,void 0,a,r):{valid:!1,reason:l.reason||"Append check failed."}}return o}return await electron.mwapi("append",e,t,n,s,void 0,a,r)}async editSection(e,t,n,s,i,a,r,o){if("function"==typeof a){const l=await electron.mwapi("editSection",e,t,n,s,i,!0,r,o);if(l.needsCheck){const d=await a(l.text);return d.valid?await electron.mwapi("editSection",e,t,n,s,i,void 0,r,o):{valid:!1,reason:d.reason||"Edit section check failed."}}return l}return await electron.mwapi("editSection",e,t,n,s,i,void 0,r,o)}async acceptPendingEdit(e,t,n,s){return await electron.mwapi("acceptPendingEdit",e,t,n,s)}async rejectPendingEdit(e,t,n,s,i,a){return await electron.mwapi("rejectPendingEdit",e,t,n,s,i,a)}async rollbackEdit(e,t,n,s,i){return await electron.mwapi("rollbackEdit",e,t,n,s,i)}async undoEdit(e,t,n,s,i){return await electron.mwapi("undoEdit",e,t,n,s,i)}async restoreEdit(e,t,n,s,i){return await electron.mwapi("restoreEdit",e,t,n,s,i)}async thankRevision(e,t,n){return await electron.mwapi("thankRevision",e,t,n)}async watchPage(e,t,n,s){return await electron.mwapi("watchPage",e,t,n,s)}async unwatchPage(e,t,n){return await electron.mwapi("unwatchPage",e,t,n)}async parse(e,t,n=!1,s,i){return await electron.mwapi("parse",e,t,n,s,i)}async getTags(e,t){return await electron.mwapi("getTags",e,t)}async getPagesContent(e,t,n){return await electron.mwapi("getPagesContent",e,t,n)}async getRevisionContent(e,t,n){return await electron.mwapi("getRevisionContent",e,t,n)}async getLatestIds(e,t,n){return await electron.mwapi("getLatestIds",e,t,n)}async getEditCounts(e,t,n){return await electron.mwapi("getEditCounts",e,t,n)}async areUsersBlocked(e,t,n){return await electron.mwapi("areUsersBlocked",e,t,n)}async isUserGloballyLocked(e,t,n){return await electron.mwapi("isUserGloballyLocked",e,t,n)}async getContributions(e,t,n,s){return await electron.mwapi("getContributions",e,t,n,s)}async getBlocks(e,t,n){return await electron.mwapi("getBlocks",e,t,n)}async pagesExist(e,t,n){return await electron.mwapi("pagesExist",e,t,n)}async getPagesDetails(e,t,n){return await electron.mwapi("getPagesDetails",e,t,n)}async countPageReverts(e,t,n,s){return await electron.mwapi("countPageReverts",e,t,n,s)}async getHistory(e,t,n,s){return await electron.mwapi("getHistory",e,t,n,s)}async getORES(e,t,n,s){return await electron.mwapi("getORES",e,t,n,s)}async extractORES(e,t){return await electron.mwapi("extractORES",e,t)}async getDiff(e,t,n,s,i){return await electron.mwapi("getDiff",e,t,n,s,i)}async getRevision(e,t,n,s){return await electron.mwapi("getRevision",e,t,n,s)}async getRevisionsBetween(e,t,n,s,i){return await electron.mwapi("getRevisionsBetween",e,t,n,s,i)}async parseUsers(e,t,n,s){return await electron.mwapi("parseUsers",e,t,n,s)}async parseEdits(e,t,n,s,i){return await electron.mwapi("parseEdits",e,t,n,s,i)}async parseAbuselogs(e,t,n,s){return await electron.mwapi("parseAbuselogs",e,t,n,s)}async getConsecutiveEdits(e,t,n,s,i){return await electron.mwapi("getConsecutiveEdits",e,t,n,s,i)}async getAbuseLogRevid(e,t,n){return await electron.mwapi("getAbuseLogRevid",e,t,n)}async feeds(e,t,n,s,i){return await electron.mwapi("feeds",e,t,n,s,i)}}):t.API=(m=new WeakMap,u=class extends i.MediaWikiAPI{get hasPendingChanges(){return c.has(this.server)}constructor(e,t,n,s){super(e,new a.MediaWikiOAuth2(`WikiShield/${electron.getVersion()} (${t}; ${n})`),t,n),r(this,m,null),o(m,this,e),this.server=t,this.username=n;for(const e of s)c.add(e)}})},691(e,t){function n(e,t,n){s(e,t),t.set(e,n)}function s(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function i(e,t){return e.get(r(e,t))}function a(e,t,n){return e.set(r(e,t),n),n}function r(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Killswitch=void 0;var o=new WeakMap,l=new WeakMap,d=new WeakMap,c=new WeakSet;function u(e){if(i(d,this)[e])for(const n of i(d,this)[e])try{n.callback()}catch(e){}finally{var t;!0===(null===(t=n.options)||void 0===t?void 0:t.once)&&(i(d,this)[e]=i(d,this)[e].filter(e=>e!==n))}return this}t.Killswitch=class{constructor(e){var t,i;s(t=this,i=c),i.add(t),n(this,o,null),n(this,l,null),n(this,d,{okay:[],unsafe:[],update:[],"force-update":[],kill:[]}),a(o,this,e.api)}on(e,t,n={}){return i(d,this)[e]&&i(d,this)[e].push({callback:t,options:n}),this}async check(){try{var e,t,n,s,a,l,d;const m=null!==(e=null===(t=await i(o,this).getPagesContent([p._],!0,"en.wikipedia.org"))||void 0===t?void 0:t[p._])&&void 0!==e?e:"",v=null===(n=JSON.parse(m))||void 0===n?void 0:n.WikiShield;if(!v)throw new Error("No killswitch found");if(v.disabled)return r(c,this,u).call(this,"kill");const f=null!==(s=null===(a=v.reload)||void 0===a?void 0:a.soft)&&void 0!==s?s:0;return(null!==(l=null===(d=v.reload)||void 0===d?void 0:d.hard)&&void 0!==l?l:0)>h._?r(c,this,u).call(this,"force-update"):f>g._?(g._=f,r(c,this,u).call(this,"update")):r(c,this,u).call(this,"okay")}catch(e){return r(c,this,u).call(this,"unsafe")}}monitor(e=1e4){return i(l,this)&&clearInterval(i(l,this)),a(l,this,setInterval(()=>this.check(),+e)),this}};var p={_:"User:LuniZunie/JSON/Killswitch.json"},g={_:11},h={_:1}}},t={};function n(s){var i=t[s];if(void 0!==i)return i.exports;var a=t[s]={exports:{}};return e[s](a,a.exports,n),a.exports}var s=n(8816),i=n(2486);{var a,r;function o(){(0,i.build)().then(s.run).catch(e=>{console.error("Error during build:",e),alert("An error occurred while starting WikiShield. Please check the console for details.")})}switch(null===(a=mw.util.addPortletLink("p-personal",mw.util.getUrl("Wikipedia:WikiShield/run"),"Run WikiShield","pt-wikishield","WikiShield",void 0,"#pt-notifications"))||void 0===a||a.addEventListener("click",e=>{e.preventDefault(),history.pushState({page:"WikiShield"},"",location.href),o()}),addEventListener("popstate",e=>{var t;"WikiShield"===(null===(t=e.state)||void 0===t?void 0:t.page)&&o()}),null===(r=history.state)||void 0===r?void 0:r.page){case"WikiShield":history.replaceState(null,"",location.href);break;case"WikiShield-reload":history.replaceState({page:"WikiShield"},"",location.href),o()}"Wikipedia:WikiShield/run"===mw.config.get("wgRelevantPageName")&&"view"===mw.config.get("wgAction")&&(history.pushState({page:"WikiShield"},"",location.href),o())}}(); aelr09ks5oke7tw8kstmizuwj55617b 613752 613751 2026-05-25T17:04:03Z LuniZunie 25284 function doesnt exist 613752 javascript text/javascript !function(){"use strict";var e={4279(e){e.exports="@import url('https://fonts.googleapis.com/css2?family=Varela+Round&display=swap');\r\n\r\n:root {\r\n\t--max-z-index: 2147483647;\r\n\r\n --body-color: rgba(241, 245, 255, 1);\r\n --body-background: rgba(20, 20, 30, 1);\r\n\r\n font-family: 'Inter', sans-serif;\r\n \tfont-optical-sizing: auto;\r\n -webkit-font-smoothing: antialiased;\r\n\t-moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n* {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n::-webkit-scrollbar {\r\n\twidth: 10px;\r\n\theight: 10px;\r\n}\r\n\r\n::-webkit-scrollbar-track {\r\n\tbackground: transparent;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n\tborder: 2px solid transparent;\r\n border-radius: 10px;\r\n\r\n\t/* Theme dependent */\r\n\tbackground: rgba(255, 255, 255, .1);\r\n\tbackground-clip: content-box;\r\n\r\n\t&:hover {\r\n\t\tborder: 2px solid transparent;\r\n\t\tborder-radius: 10px;\r\n\r\n\t\t/* Theme dependent */\r\n\t\tbackground: rgba(255, 255, 255, .2);\r\n\t\tbackground-clip: content-box;\r\n\t}\r\n}\r\n\r\nhtml, body {\r\n width: 100%;\r\n\theight: 100%;\r\n\r\n\toverflow: hidden;\r\n\r\n /* Theme dependent */\r\n background: linear-gradient(135deg,\r\n\t\trgba(20, 30, 48, 1),\r\n\t\trgba(36, 59, 85, 1)\r\n\t);\r\n}\r\n\r\n@keyframes loading-dots {\r\n\t0%, 100% {\r\n\t\tcontent: '';\r\n\t}\r\n\t25% {\r\n\t\tcontent: '.';\r\n\t}\r\n\t50% {\r\n\t\tcontent: '..';\r\n\t}\r\n\t75% {\r\n\t\tcontent: '...';\r\n\t}\r\n}\r\n\r\n.animate-loading-dots::after {\r\n\tcontent: '';\r\n\r\n\tdisplay: inline-block;\r\n\r\n\tanimation: loading-dots 1.5s steps(3, start) infinite;\r\n}\r\n\r\n.auto-scroll {\r\n white-space: nowrap;\r\n overflow: auto hidden;\r\n\r\n scrollbar-width: none;\r\n -ms-overflow-style: none;\r\n\r\n\t&::-webkit-scrollbar { display: none; }\r\n\r\n & > .auto-scroll-item {\r\n display: inline-block;\r\n\r\n\t\t&:not(:last-child) {\r\n\t\t\tmargin-right: 20px;\r\n\t\t}\r\n }\r\n &:not(:has(> .auto-scroll-item)) {\r\n opacity: 0;\r\n }\r\n}"},5540(e){e.exports='<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <meta http-equiv="Content-Security-Policy">\n\n <title>WikiShield</title>\n\n <link rel="stylesheet" href="https://fonts.cdnfonts.com/css/open-dyslexic">\n <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.0/css/all.min.css">\n\n <link rel="stylesheet" href="../common/style.css">\n <link rel="stylesheet" href="style.css">\n\n <script type="module" src="script.js"><\/script>\n </head>\n <body>\n <div id="loading">\n <img class="icon" src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n </div>\n <div id="initial" class="hidden">\n\t\t\t<canvas id="dots-canvas"></canvas>\n\t\t\t<div id="welcome-container" class="shimmer shimmer-border">\n\t\t\t\t<div class="shield-container">\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="shield-icon">\n\t\t\t\t\t\t<img src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<h1>Welcome to <span id="wikishield-sikiwhield">WikiShield</span></h1>\n\t\t\t\t<div class="about-links">\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="about-link">About</a>\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia talk:WikiShield" target="_blank" class="about-link">Discuss</a>\n\t\t\t\t\t<span class="about-link">v<span class="VERSION"></span></span>\n\t\t\t\t</div>\n\t\t\t\t<div id="rollback-needed" class="hidden">\n\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<p>You can apply for rollback rights <a rel="noopener" class="request-link" href="https://www.wikidata.org/wiki/Q7765871" target="_blank">here</a>.</p>\n\t\t\t\t</div>\n\t\t\t\t<button type="button" id="start-button">\n\t\t\t\t\tStart WikiShield <i class="fas fa-arrow-right"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n <div id="app" class="hidden">\n <div id="container">\n <div id="queue">\n <div id="queue-top">\n <div id="queue-top-left" class="queue-button-cluster" data-zen-show="alerts,messages">\n <span class="fa fa-bell" id="alerts-icon" data-tooltip="Alerts" data-zen-show="alerts">\n <span id="alerts-count" class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n <span class="fa fa-inbox" id="messages-icon" data-tooltip="Messages" data-zen-show="messages">\n <span id="messages-count" class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="DEFCON">\n <div class="dot"></div>\n <span><span class="DEFCON-RPM">0</span> RPM</span>\n </div>\n <div id="queue-top-right" class="queue-button-cluster">\n <span class="fa fa-envelope" id="email-button" data-tooltip="Email Emergency, ArbCom, or Oversight" data-multiple-hrefs="email" href></span>\n <span class="fa fa-gear" id="settings-icon" data-tooltip="Settings"></span>\n </div>\n </div>\n <div id="queue-tabs">\n <div id="queue-tab-recent" class="queue-tab selected" data-tooltip="Recent edits">\n <span class="fas fa-stopwatch">\n <span class="icon-count hidden gray" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-pending" class="queue-tab" data-tooltip="Pending edits">\n <span class="fas fa-flag">\n <span class="icon-count hidden orange" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-users" class="queue-tab" data-tooltip="User creation logs">\n <span class="fas fa-user">\n <span class="icon-count hidden green" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-watchlist" class="queue-tab" data-tooltip="Watchlist edits">\n <span class="fas fa-book-bookmark">\n <span class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-abuselog" class="queue-tab" data-tooltip="Abuse logs">\n <span class="fas fa-filter-circle-xmark">\n <span class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n </div>\n </div>\n <div id="queue-items" class="queue-list">\n <div class="queue-empty">\n No edits in queue.\n </div>\n </div>\n <div class="width-adjust" id="queue-width-adjust"></div>\n <div id="clear-queue">\n <span class="fa fa-trash"></span>\n </div>\n </div>\n <div id="alerts-panel" class="notification-panel">\n <div id="alerts-header" class="notification-header">\n <span>Alerts</span>\n <span id="mark-all-alerts-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="alerts-list" class="notification-list"></div>\n </div>\n <div id="messages-panel" class="notification-panel">\n <div id="messages-header" class="notification-header">\n <span>Messages</span>\n <span id="mark-all-messages-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="messages-list" class="notification-list"></div>\n </div>\n <div id="right-container">\n <div id="right-content">\n <div id="main-container">\n <div id="edit-details">\n <div class="central">Nothing selected</div>\n </div>\n <div id="previous-item-button" class="nav-item-button">\n <i class="fas fa-chevron-left"></i>\n </div>\n <div id="next-item-button" class="nav-item-button">\n <i class="fas fa-chevron-right"></i>\n </div>\n <div id="ai-analysis-container" class="hidden shimmer shimmer-border">\n <div class="header">\n <i class="fas fa-robot"></i>\n <span class="title">AI Analysis</span>\n <span class="assessment"></span>\n <span class="confidence"></span>\n </div>\n <div class="explanation"></div>\n <div class="issues"></div>\n </div>\n <div id="diff-scroll-up" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-up"></i>\n </div>\n <div id="diff-container"></div>\n <div id="diff-scroll-down" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-down"></i>\n </div>\n <div id="pending-changes-container" class="hidden">\n <div class="accept">Accept</div>\n <div class="reject">Reject</div>\n </div>\n <div id="progress-bar-container"></div>\n <div id="bottom-tools" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-item" data-menu="revert" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-undo"></i>\n <span>Revert</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="warn" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-exclamation-triangle"></i>\n <span>Warn</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="user" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-user"></i>\n <span>User</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="page" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-file-lines"></i>\n <span>Page</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="edit" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-pen-to-square"></i>\n <span>Edit</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n </div>\n <div id="copy-link" data-tooltip="Copy link" data-queue-type="edit,logevent,abuselog">\n <div>\n <i class="fas fa-link"></i>\n </div>\n </div>\n </div>\n <div id="right-details">\n <div id="right-top">\n <div class="tabs">\n <div id="latest-edits-tab" class="tab hidden selected" data-tooltip="Latest edit">\n <i class="fas fa-user"></i>\n </div>\n <div id="consecutive-edits-tab" class="tab hidden" data-tooltip="Consecutive edits">\n <i class="fas fa-users"></i>\n </div>\n </div>\n\n <div class="icons"></div>\n </div>\n\n <div id="user-contributions" class="section" data-queue-type="edit,logevent,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-user-contributions" class="fas fa-rotate"></i> Contributions</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View all contributions</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div id="page-history" class="section" data-queue-type="edit,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-page-history" class="fas fa-rotate"></i> Page History</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View full page history</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div class="width-adjust" id="details-width-adjust"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="bottom-tool-menu" id="revert-menu"></div>\n <div class="bottom-tool-menu" id="warn-menu"></div>\n <div class="bottom-tool-menu" id="user-menu">\n <div id="user-open-user-page" class="menu-option">\n <i class="fas fa-user-circle"></i>\n <span>Open user page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-open-user-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open user talk</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-contribs" class="menu-option">\n <i class="fas fa-list"></i>\n <span>View contributions</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-filter-log" class="menu-option">\n <i class="fas fa-filter"></i>\n <span>View filter log</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="user-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist user</span>\n </div>\n <div id="user-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist user</span>\n </div>\n <div id="user-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight user</span>\n </div>\n <div id="user-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight user</span>\n </div>\n <div class="menu-divider"></div>\n <div id="user-welcome" class="menu-option submenu-trigger">\n <i class="fas fa-paper-plane"></i>\n <span>Welcome</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-aiv" class="menu-option submenu-trigger">\n <i class="fas fa-flag"></i>\n <span>Report (AIV)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-uaa" class="menu-option submenu-trigger">\n <i class="fas fa-user-slash"></i>\n <span>Report (UAA)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-request-global-block" class="menu-option submenu-trigger">\n <i class="fas fa-ban"></i>\n <span>Request global block</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-request-global-lock" class="menu-option submenu-trigger">\n <i class="fas fa-lock"></i>\n <span>Request global lock</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>Message user</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="page-menu">\n <div id="page-open-page" class="menu-option">\n <i class="fas fa-file"></i>\n <span>Open page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-open-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open talk page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-view-history" class="menu-option">\n <i class="fas fa-clock-rotate-left"></i>\n <span>View page history</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="page-watch" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>Watch page</span>\n </div>\n <div id="page-unwatch" class="menu-option">\n <i class="fas fa-eye-slash"></i>\n <span>Unwatch page</span>\n </div>\n <div id="page-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist page</span>\n </div>\n <div id="page-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist page</span>\n </div>\n <div id="page-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight page</span>\n </div>\n <div id="page-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight page</span>\n </div>\n <div class="menu-divider"></div>\n <div id="page-request-protection" class="menu-option submenu-trigger">\n <i class="fas fa-shield-halved"></i>\n <span>Request protection</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="page-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>New talk page topic</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="edit-menu">\n <div id="edit-view-revision" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>View revision</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="edit-view-diff" class="menu-option">\n <i class="fas fa-code-compare"></i>\n <span>View diff</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="edit-thank-user" class="menu-option">\n <i class="fas fa-heart"></i>\n <span>Thank user</span>\n </div>\n <div id="edit-rollback" class="menu-option submenu-trigger">\n <i class="fas fa-rotate-left"></i>\n <span>Rollback</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-rollback-goodfaith" class="menu-option submenu-trigger">\n <i class="fas fa-handshake"></i>\n <span>Rollback (good faith)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-undo" class="menu-option submenu-trigger">\n <i class="fas fa-arrow-rotate-left"></i>\n <span>Undo</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n\n <div id="settings-container">\n <div class="settings">\n <div class="settings-left">\n <div class="settings-category">\n <div class="settings-category-header">\n <span>CORE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-general-button">\n <span><i class="fas fa-gear"></i>General</span>\n </div>\n <div class="settings-left-menu-item" id="settings-audio-button">\n <span><i class="fas fa-volume-high"></i>Audio</span>\n </div>\n <div class="settings-left-menu-item" id="settings-controls-button">\n <span><i class="fas fa-keyboard"></i>Controls</span>\n </div>\n <div class="settings-left-menu-item" id="settings-zen-button">\n <span><i class="fas fa-spa"></i>Zen Mode</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>APPEARANCE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-app-button">\n <span><i class="fas fa-palette"></i>App</span>\n </div>\n <div class="settings-left-menu-item" id="settings-queue-button">\n <span><i class="fas fa-list"></i>Queue</span>\n </div>\n <div class="settings-left-menu-item" id="settings-accessibility-button">\n <span><i class="fas fa-universal-access"></i>Accessibility</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>TOOLS</span>\n </div>\n <div class="settings-left-menu-item" id="settings-auto-reporting-button">\n <span><i class="fas fa-flag"></i>Auto Reporting</span>\n </div>\n <div class="settings-left-menu-item" id="settings-gadgets-button">\n <span><i class="fas fa-toolbox"></i>Gadgets</span>\n </div>\n <div class="settings-left-menu-item" id="settings-AI-button">\n <span><i class="fas fa-robot"></i>AI Analysis</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WHITELIST</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-whitelist-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>HIGHLIGHT</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-highlight-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>DATA</span>\n </div>\n <div class="settings-left-menu-item" id="settings-statistics-button">\n <span><i class="fas fa-chart-area"></i>Statistics</span>\n </div>\n <div class="settings-left-menu-item" id="settings-save-button">\n <span><i class="fas fa-floppy-disk"></i>Save</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WIKISHIELD</span>\n </div>\n <div class="settings-left-menu-item" id="settings-changelog-button">\n <span><i class="fas fa-file-alt"></i>Changelog</span>\n </div>\n <div class="settings-left-menu-item" id="settings-about-button">\n <span><i class="fas fa-info"></i>About</span>\n </div>\n </div>\n </div>\n <div class="settings-right">\n <div class="general hidden">\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum edit count</div>\n <div class="settings-section-desc">Edits from users with more than this number of total edits will not be shown unless that user is highlighted.</div>\n <numeric-input id="settings-maximum-edit-count" step="5" min="0" value="50"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum queue size</div>\n <div class="settings-section-desc">Maximum number of edits to keep in the queue for review. Higher values may impact performance.</div>\n <numeric-input id="settings-maximum-queue-size" step="10" min="0" value="100"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Minimum ORES score</div>\n <div class="settings-section-desc">Minimum ORES score required for an edit to appear in the recent changes queue.</div>\n <numeric-input id="settings-minimum-ores-score" step="0.05" min="0" max="1" value="0"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">ORES bias</div>\n <div class="settings-section-desc">\n Select how ORES scores are calculated for edits in the recent changes queue. "Badfaith" is how likely an edit is to be made in bad faith, "Damaging" is how likely an edit is to be damaging.\n </div>\n <div id="settings-ores-bias" class="settings-slider">\n <div class="settings-slider-labels">\n <div class="settings-slider-label-left active">Badfaith<span class="percent">50%</span></div>\n <div class="settings-slider-label-right active">Damaging<span class="percent">50%</span></div>\n </div>\n <div class="settings-slider-track">\n <div class="settings-slider-thumb"></div>\n </div>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Watchlist expiry</div>\n <div class="settings-section-desc">Amount of time to leave warned user\'s talk pages on your watchlist.</div>\n <duration-input id="settings-watchlist-expiry"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Namespaces to monitor</div>\n <div class="settings-section-desc">Select which namespaces WikiShield should monitor for recent changes and pending changes.</div>\n <div id="settings-namespaces-container" class="checkbox-container">\n \x3c!-- Namespace checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="audio hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">ORES</span>\n <span>ORES Alerts</span>\n </div>\n <div class="settings-section compact inline" id="sound-alert-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Sound alerts for high ORES scores</div>\n <div class="settings-section-desc">Play a sound when an edit above the threshold is added to the queue</div>\n </div>\n <toggle-input id="settings-ORES-alert-toggle" value="false"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="sound-alert-ores-score">\n <div class="settings-section-content">\n <div class="settings-section-title">ORES score threshold</div>\n <div class="settings-section-desc">Play a sound alert when an edit with an ORES score above this value is added</div>\n </div>\n <numeric-input id="settings-ORES-alert-threshold" step="0.05" min="0" max="1" value="0.9"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Volume</div>\n <volume-control\n id="settings-master-volume"\n title="Master Volume"\n description="Controls the overall volume of all sounds"\n value="1"\n ></volume-control>\n <div id="settings-sounds-container" class="settings-section">\n \x3c!-- Individual sound settings will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="controls hidden">\n <div class="settings-section">\n <div class="settings-section-title">Keyboard shortcuts</div>\n <div class="settings-section-desc">Customize keyboard shortcuts for various actions in WikiShield.</div>\n <div class="settings-section compact inline" id="repeat-control-scripts">\n <div class="settings-section-content">\n <div class="settings-section-title">Repeat control scripts</div>\n <div class="settings-section-desc">Allow control scripts to be triggered repeatedly when holding down keys</div>\n </div>\n <toggle-input id="repeat-control-scripts-toggle" value="true"></toggle-input>\n </div>\n <button type="button" id="settings-new-control-script" class="add-action-button new-control-script"><span class="fa fa-plus"></span> Add new action</button>\n </div>\n </div>\n <div class="zen hidden">\n <div class="settings-section">\n <div class="settings-section-title">Zen Mode</div>\n <div class="settings-section-desc">Your distraction-free editing experience.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Zen Mode</div>\n <div class="settings-section-desc">Reduce on-screen distractions while reviewing edits.</div>\n </div>\n <toggle-input id="settings-zen-mode" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Customize Zen Mode</div>\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Sound</div>\n <div class="settings-section-desc">Play sound in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-sound" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Music</div>\n <div class="settings-section-desc">Play background music in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-music" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Alerts</div>\n <div class="settings-section-desc">Show alerts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-alerts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Messages</div>\n <div class="settings-section-desc">Show messages in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-messages" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Toasts</div>\n <div class="settings-section-desc">Show toasts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-toasts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Badges</div>\n <div class="settings-section-desc">Show badges in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-badges" value="true"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="app hidden">\n <div class="settings-section" data-electron="false">\n <div class="settings-section-title">Launch behavior</div>\n <div class="settings-section-desc">Choose whether WikiShield should open inthe current tabor a new tab when launched.</div>\n <div id="settings-launch-behavior" class="settings-radio-group">\n <div class="settings-radio-option selected" data-value="current_tab">Open in current tab</div>\n <div class="settings-radio-option" data-value="new_tab">Open in new tab</div>\n </div>\n </div>\n \x3c!-- <div class="settings-section">\n <div class="settings-section-title">App theme</div>\n <div class="settings-section-desc">Choose between light mode, dark mode, or automatic switching based on system settings.</div>\n <div id="settings-app-theme" class="settings-radio-group">\n <div class="settings-radio-option" data-value="light">Light mode</div>\n <div class="settings-radio-option selected" data-value="auto">Auto</div>\n <div class="settings-radio-option" data-value="dark">Dark mode</div>\n </div>\n </div> --\x3e\n <div class="settings-section">\n <div class="settings-section-title">Startup animation</div>\n <div class="settings-section-desc">Enable or disable the startup animation when launching WikiShield.</div>\n <div id="settings-startup-performance" class="settings-radio-group">\n <div class="settings-radio-option" data-value="always_off">Always off</div>\n <div class="settings-radio-option selected" data-value="adaptive">Adaptive (recommended)</div>\n <div class="settings-radio-option" data-value="always_on">Always on</div>\n </div>\n </div>\n </div>\n <div class="queue hidden">\n <div class="settings-section">\n <div class="settings-section-title">Queues</div>\n <div class="settings-section-desc">Enable or disable different edit queues, and customize their order.</div>\n <draggable-order-list id="settings-queues">\n \x3c!-- Queue items will be populated here --\x3e\n </draggable-order-list>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Color palette</div>\n <div class="settings-section-desc">Select the color palette used for highlighting users and pages.</div>\n <div id="settings-palette-selector" class="palette-selector">\n\n </div>\n </div>\n </div>\n <div class="accessibility hidden">\n <div class="settings-section">\n <div class="settings-section-title">Accessibility Options</div>\n <div class="settings-section-desc">Customize accessibility features for better usability.</div>\n <div class="settings-compact-grid">\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">Colorblind Mode</div>\n <div class="settings-section-desc">Add indicators to help distinguish colors for colorblind users.</div>\n <toggle-input id="settings-colorblind-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Dyslexia Friendly Font</div>\n <div class="settings-section-desc">Use a font that is easier to read for users with dyslexia.</div>\n <toggle-input id="settings-dyslexia-font" value="false"></toggle-input>\n </div>\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">High Contrast Mode</div>\n <div class="settings-section-desc">Increase contrast for better visibility.</div>\n <toggle-input id="settings-high-contrast-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Reduce Motion</div>\n <div class="settings-section-desc">Minimize motion effects for users sensitive to motion.</div>\n <toggle-input id="settings-reduce-motion" value="false"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="auto-reporting hidden">\n <div class="settings-section">\n <div class="settings-section-title">Enable Auto Reporting</div>\n <div class="settings-section-desc">Automatically report edits that receive certain warnings.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Auto Reporting</div>\n <div class="settings-section-desc">When enabled, edits that trigger selected warnings will be automatically reported.</div>\n </div>\n <toggle-input id="settings-auto-reporting-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Auto Reporting Warnings</div>\n <div class="settings-section-desc">Select which warnings should trigger automatic reporting.</div>\n <div id="settings-auto-reporting-warnings-container" class="checkbox-container">\n \x3c!-- Warning checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="gadgets hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-title">Gadgets</div>\n <div class="settings-section-desc">Toggle various Wikishield features.</div>\n <div class="settings-section compact inline" id="auto-welcome-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Automatic welcoming of new users</div>\n <div class="settings-section-desc">Automatically welcome new users with empty talk pages when moving past their constructive edits</div>\n </div>\n <toggle-input id="settings-auto-welcome-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="wikipedia-popups-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Popups</div>\n <div class="settings-section-desc">When enabled, links will be opened in a new window. Otherwise, they will be opened in your default browser. (Not supported by Opera or Safari browsers)</div>\n </div>\n <toggle-input id="settings-wikipedia-popups-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="talk-page-thanks-for-temporary-users-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Send talk page thanks for temporary users</div>\n <div class="settings-section-desc">If enabled, when you thank a temporary user with an empty talk page, WikiShield will send them a welcoming thank you message in addition to the standard thank you message.</div>\n </div>\n <toggle-input id="settings-edit-summaries-toggle" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Username Highlighting</div>\n <div class="settings-section compact inline" id="username-highlighting-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable username highlighting</div>\n <div class="settings-section-desc">Highlights usernames in edit summaries, edit diffs, and user creation logs.</div>\n </div>\n <toggle-input id="settings-username-highlighting-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="username-highlighting-mode-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Toggle fuzzy matching mode</div>\n <div class="settings-section-desc">\n When enabled, highlights similar usernames. Not recommended for users with short usernames.<br/>\n <strong>NOTE:</strong> This may cause performance issues for those with long usernames, or users on weaker devices.\n </div>\n </div>\n <toggle-input id="settings-username-highlighting-fuzzy-toggle" value="false"></toggle-input>\n </div>\n </div>\n </div>\n <div class="AI hidden">\n <div class="settings-section">\n <div class="settings-section-title">AI Analysis</div>\n <div class="settings-section-desc">Configure AI-powered analysis features.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Ollama AI Analysis &lpar;<a href="https://ollama.com">ollama.com</a>&rpar;</div>\n <div class="settings-section-desc">Use local AI models with complete privacy.</div>\n </div>\n <toggle-input id="settings-AI-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">Tools</span>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Edit Analysis</div>\n <div class="settings-section-desc">Suggests actions to take on edits.</div>\n </div>\n <toggle-input id="settings-AI-edit-analysis-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Username Analysis</div>\n <div class="settings-section-desc">Flags potentially problematic usernames and prompts you to report them to UAA</div>\n </div>\n <toggle-input id="settings-AI-username-analysis-toggle" value="true"></toggle-input>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-server-url">\n <div class="settings-section-title">Server URL</div>\n <div class="settings-section-desc">The URL of your local Ollama server</div>\n <div class="text-input-container">\n <input title="Ollama URL" type="text" id="ollama-url-input" autoComplete="off">\n <button type="button" id="settings-ollama-test-connection">Test Connection</button>\n </div>\n <div class="settings-section compact connection-status-container">\n <p id="settings-ollama-connection-status"></p>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-model-select">\n <div class="settings-section-title">\n Model Selection\n <button type="button" id="settings-ollama-refresh-models">\n <span class="fa fa-sync"></span> Refresh Models\n </button>\n </div>\n <div class="settings-section-desc">Select which Ollama model to use for edit analysis</div>\n <div class="settings-section compact models-container">\n <p id="settings-ollama-models-status">Click "Refresh Models" to load available models</p>\n <div id="settings-ollama-models"></div>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-setup">\n <div class="settings-section-title">Setup required</div>\n <div class="settings-section-desc">\n <details>\n <summary><strong>Windows (Permanent)</strong></summary>\n <ol class="pad-list">\n <li>Press <code>Win + R</code>, type <code>sysdm.cpl</code>, and press Enter</li>\n <li>Go to the "Advanced" tab and click on "Environment Variables"</li>\n <li>Create a new variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_HOST</code> and the value to <code>http://127.0.0.11434</code>\n <ul class="pad-list">\n <li><strong>NOTE:</strong> You can change the port (11434) if that port is already in use, but make sure to update the "Server URL" setting in WikiShield accordingly</li>\n </ul>\n </li>\n <li>Click "OK" to save the variable</li>\n <li>Create another variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_ORIGINS</code> and the value to <code>https://*.wikipedia.org</code></li>\n <li>Click "OK" to save the variable, you can now close the Environment Variables and System Properties windows</li>\n <li>Restart Ollama</li>\n </ol>\n </details>\n\n <details>\n <summary><strong>Windows (Temporary)</strong></summary>\n <pre>\n$env:OLLAMA_HOST="http://127.0.0.11434"\n$env:OLLAMA_ORIGINS="https://*.wikipedia.org"\nollama serve</pre>\n </details>\n\n <details>\n <summary><strong>macOS / Linux</strong></summary>\n Add the following to <code>~/.bashrc</code> or <code>~/.zshrc</code>:\n <pre>\nexport OLLAMA_HOST="http://127.0.0.11434"\nexport OLLAMA_ORIGINS="https://*.wikipedia.org"</pre>\n Then run:\n <pre>source ~/.bashrc && ollama serve</pre>\n </details>\n </div>\n </div>\n </div>\n\n <div class="whitelist users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted users</div>\n <div class="settings-section-desc">Amount of time before a whitelisted user is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-users-expiry" label="Default expiry for whitelisted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Users</div>\n <div class="settings-section-desc">Manage your list of whitelisted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-users-input" placeholder="Add user to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-whitelist-users-list" class="settings-section list-container">\n \x3c!-- Whitelisted users will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted pages</div>\n <div class="settings-section-desc">Amount of time before a whitelisted page is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-pages-expiry" label="Default expiry for whitelisted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Pages</div>\n <div class="settings-section-desc">Manage your list of whitelisted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-pages-input" placeholder="Add page to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-whitelist-pages-list" class="settings-section list-container">\n \x3c!-- Whitelisted pages will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted tags</div>\n <div class="settings-section-desc">Amount of time before a whitelisted tag is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-tags-expiry" label="Default expiry for whitelisted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Tags</div>\n <div class="settings-section-desc">Manage your list of whitelisted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-tags-input" placeholder="Add tag to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-whitelist-tags-list" class="settings-section list-container">\n \x3c!-- Whitelisted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="highlight users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted users</div>\n <div class="settings-section-desc">Amount of time before a highlighted user is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-users-expiry" label="Default expiry for highlighted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Users</div>\n <div class="settings-section-desc">Manage your list of highlighted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-users-input" placeholder="Add user to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-highlight-users-list" class="settings-section list-container">\n \x3c!-- Highlighted users will be populated here --\x3e\n </div>\n </div>\n <div class="highlight pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted pages</div>\n <div class="settings-section-desc">Amount of time before a highlighted page is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-pages-expiry" label="Default expiry for highlighted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Pages</div>\n <div class="settings-section-desc">Manage your list of highlighted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-pages-input" placeholder="Add page to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-highlight-pages-list" class="settings-section list-container">\n \x3c!-- Highlighted pages will be populated here --\x3e\n </div>\n </div>\n <div class="highlight tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted tags</div>\n <div class="settings-section-desc">Amount of time before a highlighted tag is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-tags-expiry" label="Default expiry for highlighted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Tags</div>\n <div class="settings-section-desc">Manage your list of highlighted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-tags-input" placeholder="Add tag to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-highlight-tags-list" class="settings-section list-container">\n \x3c!-- Highlighted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="statistics hidden">\n <div class="settings-section">\n <div class="settings-section-title">\n Statistics Overview\n <button type="button" id="reset-statistics-button">Reset Statistics</button>\n </div>\n <div class="stats-grid">\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-total-reviewed" class="stat-value"></div>\n <div class="stat-label">Edits Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have thanked <span id="stats-thanks-percentage"></span>% of the edits you reviewed\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-recent-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Recent Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n Recent changes make up <span id="stats-recent-changes-percentage"></span>% of your reviewed edits\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pending-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Pending Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have accepted <span id="stats-pending-changes-accepted"></span> &lpar;\n <span id="stats-pending-changes-accepted-percentage"></span>%\n &rpar; pending changes\n </div>\n <div class="stat-sublabel">\n You have rejected <span id="stats-pending-changes-rejected"></span> &lpar;\n <span id="stats-pending-changes-rejected-percentage"></span>%\n &rpar; pending changes from entering the public eye\n </div>\n <div class="stat-sublabel">\n Out of all the edits you&rsquo;ve reviewed, <span id="stats-pending-changes-percentage"></span>% of them were pending review\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-user-creations-reviewed" class="stat-value"></div>\n <div class="stat-label">User Creations Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-user-creations-percentage"></span>% of your reviews came from user creations\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-watchlist-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Watchlist Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-watchlist-changes-percentage"></span>% of your reviews came from your watchlist\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-abuselog-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Abuse Log Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-abuselog-changes-percentage"></span>% of your reviews came from your abuse log\n </div>\n </div>\n </div>\n </div>\n\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reverts-made" class="stat-value"></div>\n <div class="stat-label">Reverts Made</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reverts-percentage"></span>% of edits that cross your path are reverted by you\n </div>\n <div class="stat-sublabel">\n You assumed good faith <span id="stats-goodfaith-reverts-percentage"></span>% of the time\n </div>\n <div class="stat-sublabel">\n <span id="stats-recent-reverts-percentage"></span>% of your reverts were from recent changes\n </div>\n <div class="stat-sublabel">\n <span id="stats-pending-reverts-percentage"></span>% of your reverts were pending\n </div>\n <div class="stat-sublabel">\n <span id="stats-watchlist-reverts-percentage"></span>% of your reverts were from your watchlist\n </div>\n <div class="stat-sublabel">\n <span id="stats-abuselog-reverts-percentage"></span>% of your reverts were from your abuse log\n </div>\n <div class="stat-sublabel">\n &hellip;and the last <span id="stats-other-reverts-percentage"></span>% weren&rsquo;t even in your queue!\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-users-welcomed" class="stat-value"></div>\n <div class="stat-label">Users Welcomed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-welcomed-message"></span>\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-warnings" class="stat-value"></div>\n <div class="stat-label">Warnings Issued</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-warning-1-percentage"></span>% were level 1\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-2-percentage"></span>% were level 2\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-3-percentage"></span>% were level 3\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4-percentage"></span>% were level 4\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4im-percentage"></span>% were level 4im\n </div>\n <div class="stat-sublabel">\n &hellip;and the rest we were too lazy to track =&rpar;\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reports" class="stat-value"></div>\n <div class="stat-label">Reports Filed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n AIV accounted for <span id="stats-AIV-reports-percentage"></span>% of your reports\n </div>\n <div class="stat-sublabel">\n another <span id="stats-UAA-reports-percentage"></span>% were for UAA\n </div>\n <div class="stat-sublabel">\n <span id="stats-global-block-reports-percentage"></span>% were for global block requests\n </div>\n <div class="stat-sublabel">\n while <span id="stats-global-lock-reports-percentage"></span>% were for global lock requests\n </div>\n <div class="stat-sublabel">\n finally, <span id="stats-RFPP-reports-percentage"></span>% were posted at RFPP\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pages-watched" class="stat-value"></div>\n <div class="stat-label">Pages Watched</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-pages-unwatched"></span> pages were annoying enough to be unwatched\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-whitelisted" class="stat-value"></div>\n <div class="stat-label">Items Whitelisted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-whitelisted"></span> &lpar;\n <span id="stats-users-whitelisted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-whitelisted"></span> &lpar;\n <span id="stats-pages-whitelisted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-whitelisted"></span> &lpar;\n <span id="stats-tags-whitelisted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-highlighted" class="stat-value"></div>\n <div class="stat-label">Items Highlighted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-highlighted"></span> &lpar;\n <span id="stats-users-highlighted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-highlighted"></span> &lpar;\n <span id="stats-pages-highlighted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-highlighted"></span> &lpar;\n <span id="stats-tags-highlighted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-session-time" class="stat-value"></div>\n <div class="stat-label">Session Time</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reports-per-day"></span> reports per day\n </div>\n <div class="stat-sublabel">\n <span id="stats-reverts-per-hour"></span> reverts per hour\n </div>\n <div class="stat-sublabel">\n <span id="stats-reviews-per-minute"></span> reviews per minute\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="save hidden">\n <div class="save settings-section">\n <div class="save-settings-header">\n <div class="settings-section-title">Save Settings</div>\n <div class="settings-section-desc">Manage how and where your WikiShield settings are stored.</div>\n </div>\n\n <div class="save-settings-content">\n <div class="save-settings-card data-management-card">\n <div class="card-header">\n <div class="card-icon">\n <i class="fa fa-database"></i>\n </div>\n <div class="card-header-content">\n <div class="card-title">Data Management</div>\n <div class="card-desc">Import, export, or reset your WikiShield settings. Settings are encoded as base64 for easy sharing.</div>\n </div>\n </div>\n\n <div class="card-body">\n <div class="action-buttons-grid">\n <button type="button" id="settings-export-button" class="action-card export-card">\n <div class="action-card-icon">\n <i class="fa fa-download"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Export Settings</div>\n <div class="action-card-desc">Save your configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-import-button" class="action-card import-card">\n <div class="action-card-icon">\n <i class="fa fa-upload"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Import Settings</div>\n <div class="action-card-desc">Load saved configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-reset-button" class="action-card reset-card">\n <div class="action-card-icon">\n <i class="fa fa-undo"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Reset Settings</div>\n <div class="action-card-desc">Restore to defaults</div>\n </div>\n </button>\n </div>\n\n <div id="settings-save-status" class="status-message hidden"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="changelog hidden">\n <div class="settings-section">\n <div class="changelog-content">\n\n </div>\n </div>\n </div>\n <div class="about hidden">\n <div class="settings-section">\n <div class="about-content">\n <div class="about-version">\n <span class="fa fa-shield-alt"></span>\n <span>WikiShield v<span id="settings-about-version"></span></span>\n </div>\n\n <div class="about-tagline">\n <p>A powerful, real-time patrolling tool for Wikipedia editors</p>\n </div>\n\n <div class="about-links">\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="link-card docs">\n <div class="link-card-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Documentation</div>\n <div class="link-card-desc">Learn how to use WikiShield</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://github.com/LuniZunie/WikiShield-App" target="_blank" class="link-card source">\n <div class="link-card-icon">\n <span class="fa fa-code-branch"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Source Code</div>\n <div class="link-card-desc">View on GitHub</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia_talk:WikiShield" target="_blank" class="link-card feedback">\n <div class="link-card-icon">\n <span class="fa fa-comments"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Feedback</div>\n <div class="link-card-desc">Share your thoughts</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n </div>\n\n <div class="about-footer">\n <div class="footer-divider"></div>\n <div class="about-credits">\n <div>\n <div class="credit-card" data-link="https://about.luni.me">\n <div class="credit-icon">\n <span class="fa fa-code"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">LuniZunie</div>\n <div class="credit-role auto-scroll">Lead Developer</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Ingenuity">\n <div class="credit-icon">\n <span class="fa fa-lightbulb"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Ingenuity</div>\n <div class="credit-role auto-scroll">Original Creator</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Monkeysmashingkeyboards">\n <div class="credit-icon">\n <span class="fa fa-database"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Monkeysmashingkeyboards</div>\n <div class="credit-role auto-scroll">Backend</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:pro-anti-air">\n <div class="credit-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Pro-anti-air</div>\n <div class="credit-role auto-scroll">Documentation</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Chaotic_Enby">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Chaotic Enby</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:HurricaneZeta">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">HurricaneZeta</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="copyright-card" data-link="https://sound-effects.bbcrewind.co.uk">\n <div class="copyright-title auto-scroll">Nature sounds</div>\n <div class="copyright-desc auto-scroll">bbc.co.uk &ndash; &copy; copyright 2026 BBC</div>\n </div>\n <div class="copyright-card" data-link="https://pixabay.com/sound-effects">\n <div class="copyright-title auto-scroll">Sound effects</div>\n <div class="copyright-desc auto-scroll">pixabay.com &ndash; CC0 License</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </body>\n</html>'},2459(e){e.exports="@keyframes startup {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes particles {\n\t0%, 100% {\n\t\ttransform: translate(0, 0) rotate(0deg);\n\t}\n\t33% {\n\t\ttransform: translate(30px, -30px) rotate(120deg);\n\t}\n\t66% {\n\t\ttransform: translate(-20px, 20px) rotate(240deg);\n\t}\n}\n\n@keyframes container-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(30px) scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0) scale(1);\n\t}\n}\n\n@keyframes border-glow {\n\t0%, 100% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 40px rgba(102, 126, 234, .4),\n\t\t\t0 0 80px rgba(240, 147, 251, .3),\n\t\t\tinset 0 0 60px rgba(102, 126, 234, .15),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .2);\n\t}\n\t50% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 60px rgba(240, 147, 251, .6),\n\t\t\t0 0 120px rgba(102, 126, 234, .4),\n\t\t\tinset 0 0 80px rgba(240, 147, 251, .2),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .3);\n\t}\n}\n\n@keyframes shield-entrance {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: scale(0) rotate(-180deg);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: scale(1.15) rotate(10deg);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: scale(1) rotate(0deg);\n\t}\n}\n\n@keyframes shield-float {\n\t0%, 100% {\n\t\ttransform: translate(-50%, -50%) translateY(0px);\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) translateY(-10px);\n\t}\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: translate(-50%, -50%) scale(.8);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t\topacity: 0.8;\n\t}\n\t100% {\n\t\ttransform: translate(-50%, -50%) scale(1.5);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes sparkle {\n\t0%, 100% {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: scale(1.5);\n\t\topacity: 1;\n\t}\n}\n\n@keyframes title-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-20px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes links-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes warning-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes button-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(40px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes fade-in {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n@keyframes fade-out {\n\tfrom {\n\t\topacity: 1;\n\t}\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-in {\n\tfrom {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n}\n@keyframes scale-out {\n\tfrom {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n\tto {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-x {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n}\n\n@keyframes bottom-tool-menu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n@keyframes bottom-tool-submenu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateX(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n}\n\n@keyframes toast-alert-enter {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: translateX(100%) scale(.8);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: translateX(-10px) scale(1.05);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n}\n@keyframes toast-alert-leave {\n\t0% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n\t100% {\n\t\topacity: 0;\n\t\ttransform: translateX(150%) scale(.7);\n\t}\n}\n\n@keyframes music-toast-enter {\n from {\n opacity: 0;\n transform: translateX(150%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes music-toast-leave {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(150%);\n }\n}\n\n@keyframes tooltip-enter {\n from {\n\t\ttransform: scale(.8);\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes star-spin {\n 0% {\n transform: rotate(0deg) scale(1);\n }\n 50% {\n transform: rotate(180deg) scale(1.3);\n }\n 100% {\n transform: rotate(360deg) scale(1);\n }\n}\n\n@keyframes flash-highlight {\n 0%, 100% {\n filter: brightness(1);\n }\n 50% {\n filter: brightness(.5);\n }\n}\n\n@keyframes logo-loader {\n 0%, 100% {\n transform: scale(1);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 10px rgba(102, 126, 234, .4));\n }\n 50% {\n transform: scale(1.5);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 20px rgba(102, 126, 234, .6));\n }\n}\n\n@keyframes refresh-rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse-DEFCON {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.15);\n }\n 100% {\n transform: scale(1);\n }\n}\n\nbody {\n --transparency: 1;\n\n font-size: clamp(14px, 3vw, 16px);\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n background: rgba(20, 20, 30, 1);\n\n &.dyslexia-font {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n\n *:not(.fa):not(.fas):not(.far):not(.fal):not(.fab) {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n }\n }\n\n &.reduce-motion * {\n animation-duration: 0.001s !important;\n transition-duration: 0.001s !important;\n }\n\n & a {\n text-decoration: none;\n\n &:active {\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n }\n }\n\n & > #popup-blocker {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 1);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease;\n }\n\n & > #loading {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 2);\n\n opacity: 1;\n\n transition: opacity .5s ease;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n & > .icon {\n width: 100vmin;\n }\n }\n\n & > .icon {\n aspect-ratio: 1 / 1;\n width: 12.5vmin;\n\n animation: logo-loader 2s ease-in-out infinite;\n\n transition: width .5s cubic-bezier(0.6, -0.28, 0.735, 0.045);\n }\n }\n\n & > #initial {\n display: flex;\n align-items: center;\n\t justify-content: center;\n\n width: 100%;\n height: 100%;\n\n position: relative;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n display: none;\n }\n\n &:before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 0;\n background:\n radial-gradient(circle at 20% 50%, rgba(102, 126, 234, .08) 0%, transparent 50%),\n radial-gradient(circle at 80% 80%, rgba(118, 75, 162, .06) 0%, transparent 50%);\n pointer-events: none;\n }\n\n &:not(.hidden) {\n animation: startup 1.2s ease-out;\n\n & > #welcome-container {\n animation: container-fade-in 1.2s ease-out;\n\n & > .shield-container {\n animation: shield-entrance 1.5s ease 2s forwards;\n }\n\n & > h1 {\n animation: title-fade-in 0.8s ease-out 0.5s both;\n }\n\n & > .about-links {\n animation: link-slide-in 0.8s ease-out 0.7s both;\n }\n\n & > #rollback-needed {\n animation: warning-fade-in 1s ease-out 0.7s both;\n }\n\n & > button {\n animation: button-slide-in 2s ease-out 1s both;\n }\n }\n }\n\n & > #dots-canvas {\n width: 100%;\n height: 100%;\n\n position: absolute;\n z-index: 0;\n left: 0;\n top: 0;\n }\n\n & > #welcome-container {\n padding: 48px;\n\n border-radius: 16px;\n\n max-width: 480px;\n\n position: relative;\n z-index: 2;\n\n text-align: center;\n\n overflow: hidden;\n\n /* Theme dependent */\n border: 1px solid rgba(143, 163, 255, .15);\n box-shadow:\n 0 12px 40px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & * {\n position: relative;\n z-index: 1;\n }\n\n & > .shield-container {\n width: 100px;\n height: 100px;\n\n position: relative;\n\n margin: 0 auto 24px;\n\n opacity: 0;\n\n & > .glow-ring {\n width: 240px;\n height: 240px;\n\n position: absolute;\n left: 50%;\n top: 50%;\n\n border: 2px solid;\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: pulse 2.5s ease-in-out infinite;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n &:nth-child(2) {\n animation-delay: 0.4s;\n border-color: rgba(118, 75, 162, .25);\n }\n &:nth-child(3) {\n animation-delay: 0.8s;\n border-color: rgba(143, 163, 255, .2);\n }\n }\n\n & > .sparkle {\n width: 5px;\n height: 5px;\n\n position: absolute;\n\n border-radius: 50%;\n\n animation: sparkle 2s ease-in-out infinite;\n\n &:nth-child(4) {\n top: 15%;\n left: 25%;\n\n animation-delay: 0s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .6);\n box-shadow: 0 0 8px rgba(143, 163, 255, .6);\n }\n &:nth-child(5) {\n top: 25%;\n left: 18%;\n\n animation-delay: 0.4s;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .6);\n box-shadow: 0 0 8px rgba(102, 126, 234, .6);\n }\n &:nth-child(6) {\n bottom: 20%;\n\t left: 30%;\n\n animation-delay: 0.8s;\n\n /* Theme dependent */\n background: rgba(118, 75, 162, .5);\n box-shadow: 0 0 8px rgba(118, 75, 162, .5);\n }\n &:nth-child(7) {\n bottom: 25%;\n right: 25%;\n\n animation-delay: 1.2s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .5);\n box-shadow: 0 0 8px rgba(143, 163, 255, .5);\n }\n }\n\n & > .shield-icon {\n width: 100px;\n\n position: absolute;\n z-index: 2;\n left: 50%;\n top: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: shield-float 3s ease-in-out infinite;\n\n /* Theme dependent */\n filter: drop-shadow(0 0 8px rgba(102, 126, 234, .3));\n\n & > img {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 2.2em;\n font-weight: 700;\n line-height: 1.2;\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n }\n\n & > .subtitle {\n margin: 0 0 24px 0;\n\n font-size: 0.95em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 0.8);\n }\n\n & > .about-links {\n display: flex;\n justify-content: center;\n gap: 12px;\n flex-wrap: wrap;\n\n margin: 24px 0;\n\n & > .about-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n padding: 8px 14px;\n\n border: 1px solid;\n border-radius: 8px;\n\n font-size: 0.85em;\n font-weight: 500;\n text-decoration: none;\n\n transition: background .2s ease,\n transform .2s ease,\n color .2s ease,\n border-color .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 0.9);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .2);\n }\n }\n }\n\n & > #rollback-needed {\n margin: 20px 0;\n padding: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(247, 76, 60, .3);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n\t\t inset 0 1px 0 rgba(255, 255, 255, .05);\n background: rgba(247, 76, 60, .08);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n display: none;\n }\n\n & p {\n margin: 6px 0;\n\n font-weight: 400;\n font-size: 0.9em;\n\n /* Theme dependent */\n color: rgba(247, 76, 60, 0.95);\n }\n & a {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n & > button {\n cursor: pointer;\n\n width: 100%;\n\n padding: 12px 24px;\n\n border: 2px solid transparent;\n border-radius: 10px;\n\n position: relative;\n\n font-size: 1em;\n font-weight: 700;\n color: rgba(143, 163, 255, 1);\n letter-spacing: 0.5px;\n\n overflow: hidden;\n\n opacity: 1;\n\n transition: all .25s ease;\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.8), rgba(118, 75, 162, 0.8)) border-box;\n box-shadow:\n 0 0 10px rgba(102, 126, 234, .6),\n 0 0 20px rgba(118, 75, 162, .3),\n inset 0 0 10px rgba(102, 126, 234, .1);\n\n &.hidden {\n display: none;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(160, 180, 255, 1);\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 75, 162, 1)) border-box;\n box-shadow:\n 0 0 15px rgba(102, 126, 234, .8),\n 0 0 30px rgba(118, 75, 162, .5),\n inset 0 0 15px rgba(102, 126, 234, .2);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.7), rgba(118, 75, 162, 0.7)) border-box;\n box-shadow:\n 0 0 8px rgba(102, 126, 234, .5),\n 0 0 16px rgba(118, 75, 162, .3),\n inset 0 0 8px rgba(102, 126, 234, .1);\n }\n\n &::before {\n content: \"\";\n\n width: 100%;\n height: 100%;\n\n position: absolute;\n left: -100%;\n top: 0;\n\n transition: left .4s ease;\n\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1),\n transparent\n );\n }\n\n & > i {\n margin-right: 6px;\n font-size: 14px;\n transition: transform 0.3s ease;\n }\n\n &:hover > i {\n transform: translateX(2px);\n }\n }\n }\n }\n\n & > #app {\n width: 100%;\n height: 100%;\n\n line-height: 1.5;\n color: var(--body-color);\n\n overflow: hidden;\n\n background: var(--body-background);\n\n &.hidden {\n display: none;\n }\n\n & > #container {\n display: flex;\n width: 100%;\n height: 100%;\n\n margin: 0;\n\n overflow: hidden;\n\n & > #queue {\n width: 15vw;\n height: 100%;\n\n position: relative;\n\n border-right: 1px solid;\n\n /* Theme dependent */\n border-right-color: rgba(58, 61, 74, 1);\n\n & > #queue-top {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 69px;\n\n position: relative;\n z-index: 2;\n\n border-bottom: 2px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 8px;\n\n padding: 10px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-button-cluster {\n display: flex;\n align-items: center;\n gap: 20px;\n\n padding: 10px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n font-size: 1.2em;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .fa {\n position: relative;\n }\n\n & > span {\n cursor: pointer;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > #DEFCON {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n padding: 4px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .dot {\n flex: 0 0 auto;\n\n width: 10px;\n height: 10px;\n\n border-radius: 50%;\n\n animation: pulse-DEFCON 2s ease-in-out infinite;\n\n /* Theme dependent */\n background: rgba(100, 100, 100, 1);\n box-shadow: 0 0 0 4px rgba(100, 100, 100, .15);\n\n &.DEFCON-1 {\n background: rgba(255, 75, 75, 1);\n box-shadow: 0 0 0 4px rgba(255, 75, 75, .3);\n }\n &.DEFCON-2 {\n background: rgba(255, 165, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 165, 0, .3);\n }\n &.DEFCON-3 {\n background: rgba(255, 255, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 255, 0, .3);\n }\n &.DEFCON-4 {\n background: rgba(75, 255, 75, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 75, .3);\n }\n &.DEFCON-5 {\n background: rgba(75, 255, 255, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 255, .3);\n }\n }\n\n & > span {\n overflow: auto hidden;\n\n white-space: nowrap;\n font-size: 13px;\n font-weight: 500;\n }\n }\n }\n\n & > #queue-tabs {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-around;\n gap: 8px;\n\n position: relative;\n z-index: 2;\n\n border-radius: 0 0 12px 12px;\n padding: 10px 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: transparent;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-tab {\n cursor: pointer;\n\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n\n position: relative;\n\n border-radius: 50%;\n padding: 8px 14px;\n\n font-size: 1.4em;\n\n transition: transform .18s ease,\n color .18s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .85);\n\n &::after {\n content: \"\";\n\n height: 3px;\n\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n\n border-radius: 2px;\n\n transform: scaleX(0);\n\n transition: transform .22s cubic-bezier(.2, .9, .27, 1);\n\n /* Theme dependent */\n opacity: .95;\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, 1),\n rgba(118, 75, 162, 1)\n );\n }\n\n &:hover, &:focus-visible {\n transform: translateY(-2px);\n }\n\n &:not(.selected).mentions-me::after {\n animation: scale-x 1s ease-in-out infinite;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(244, 196, 32, 1),\n rgba(255, 107, 107, 1)\n );\n }\n\n &.selected {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n &::after {\n transform: scaleX(1);\n }\n }\n\n &.hidden {\n display: none;\n }\n\n & > .fas {\n position: relative;\n }\n }\n }\n\n & > .queue-list {\n height: calc(100% - 60px);\n\n position: relative;\n top: -60px;\n\n padding-top: 60px;\n padding-bottom: 10px;\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n right: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > #clear-queue {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-container {\n display: flex;\n flex-wrap: wrap;\n width: calc(100% - 15vw);\n\n & > #right-content {\n display: flex;\n width: 100%;\n height: 100%;\n\n & > #main-container {\n display: flex;\n flex-direction: column;\n gap: 0px;\n width: calc(100% - 15vw);\n height: 100%;\n\n padding-top: 69px;\n\n position: relative;\n\n & > #edit-details {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 4px;\n\n width: calc(100% - 20vmin);\n height: 69px;\n\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-top: none;\n border-radius: 8px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease;\n\n /* Theme dependent */\n background: rgba(30, 34, 45, 1);\n border-color: rgba(143, 163, 255, .2);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n inset 0 1px 0px rgba(255, 255, 255, .05);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .central {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n flex: 1;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: 1em;\n\n & > .page-title {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(119, 166, 215, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n\n & > a {\n color: inherit;\n\n white-space: nowrap;\n text-overflow: ellipsis;\n\n overflow: hidden;\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > a {\n color: inherit;\n }\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: calc(1rem + 4px);\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n\n & > .subheader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: .9em;\n\n & > .item-comment {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n &.none {\n opacity: .6;\n }\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n white-space: nowrap;\n\n overflow: auto hidden;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: .85rem;\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .nav-item-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 41px;\n height: 41px;\n\n position: absolute;\n top: 14px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: 0;\n }\n\n &#previous-item-button {\n left: calc(5vmin - calc(41px / 2));\n }\n &#next-item-button {\n right: calc(5vmin - calc(41px / 2));\n }\n\n & > i {\n font-size: 16px;\n }\n }\n\n & > #ai-analysis-container {\n flex-shrink: 0;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 12px;\n margin-bottom: 0;\n padding: 10px;\n\n overflow: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .2);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n align-items: center;\n gap: 6px;\n\n margin-bottom: 8px;\n\n & > .fa {\n font-size: 1.1em;\n }\n\n & > .title {\n font-size: .95em;\n letter-spacing: .3px;\n }\n\n & > .assessment {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .8em;\n font-weight: 700;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.review {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.suspicious {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.bad {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n &.error {\n /* Theme dependent */\n background: rgba(158, 158, 158, .25);\n }\n }\n\n & > .confidence {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .75em;\n font-weight: 600;\n }\n }\n\n & > .explanation {\n border-left: 3px solid;\n\n border-radius: 4px;\n margin-bottom: 6px;\n padding: 6px 8px;\n\n font-size: .8em;\n line-height: 1.3;\n\n /* Theme dependent */\n border-left-color: rgba(143, 163, 255, .4);\n }\n\n & > .issues {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n & > .issue {\n border-radius: 6px;\n padding: 4px 10px;\n\n font-size: .75em;\n font-weight: 600;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.medium {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.high {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.critical {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n }\n }\n }\n\n & > .notice {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 8px;\n\n border-left: 4px solid;\n border-radius: 4px;\n\n margin: 10px;\n padding: 8px 12px;\n\n font-size: .9em;\n\n &.edit-war {\n /* Theme dependent */\n color: rgba(120, 27, 20, 1);\n border-left-color: rgba(247, 50, 20, 1);\n background: rgba(255, 205, 199, 1);\n }\n\n &.outdated {\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-left-color: rgba(255, 193, 7, 1);\n background: rgba(255, 243, 205, 1);\n\n &.pending {\n /* Theme dependent */\n color: rgba(12, 84, 96, 1);\n border-left-color: rgba(23, 162, 184, 1);\n background: rgba(209, 236, 241, 1);\n }\n }\n\n & > .text {\n flex: 1;\n }\n\n & > .button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .85em;\n font-weight: 600;\n white-space: nowrap;\n text-decoration: none;\n\n transition: color .2s ease,\n border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-color: rgba(255, 193, 7, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .1);\n\n background: rgba(255, 235, 159, .45);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > i {\n font-size: 14px;\n\n transition: transform .3s ease;\n }\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n color: rgba(80, 60, 0, 1);\n border-color: rgba(255, 193, 7, .6);\n box-shadow: 0 4px 16px rgba(255, 193, 7, .25);\n\n background: rgba(255, 235, 159, .65);\n\n & > i {\n transform: translateX(3px);\n\n &.restore {\n transform: rotateZ(180deg);\n }\n }\n }\n }\n }\n\n & > .diff-scroll-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n opacity: 1;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > i {\n font-size: 16px;\n }\n\n &#diff-scroll-up {\n top: 77px;\n }\n &#diff-scroll-down {\n bottom: 8px;\n }\n }\n\n & > #diff-container {\n flex: 1;\n\n padding: 12px;\n\n scroll-behavior: smooth;\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(20, 22, 28, .3),\n transparent\n );\n\n & > .loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n & > .loading-spinner {\n margin-bottom: 24px;\n\n font-size: 56px;\n\n animation: logo-loader 2s ease-in-out infinite;\n }\n\n & > .loading-text {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n text-align: center;\n font-weight: 500;\n letter-spacing: .3px;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 1);\n }\n }\n\n & > table {\n width: 100%;\n\n border: 1px solid;\n border-collapse: separate;\n border-spacing: 0;\n\n border-radius: 14px;\n margin-bottom: 24px;\n\n overflow: hidden;\n\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: .8em;\n line-height: 1.6;\n vertical-align: baseline;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .1),\n inset 0 -1px 0px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(143, 163, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(35, 40, 52, .5),\n rgba(30, 35, 48, .4)\n );\n -webkit-backdrop-filter: blur(16px) saturate(110%);\n backdrop-filter: blur(16px) saturate(110%);\n\n & > tbody {\n .mw-diff-movedpara-left, .mw-diff-movedpara-right {\n text-decoration: none;\n }\n\n & > tr {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease;\n\n &:hover {\n & > td {\n /* Theme dependent */\n background: rgba(143, 163, 255, .12);\n }\n }\n\n &:not(.diff-addedline, .diff-deletedline) {\n & > td {\n /* Theme dependent */\n background: rgba(255, 255, 255, .02);\n }\n }\n\n .flash-highlight {\n animation: flash-highlight 1s ease-out infinite;\n }\n\n & > td {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease,\n color .25s ease;\n\n &:not(.diff-marker) {\n width: 50%;\n\n padding: 10px 14px;\n\n transition: background .25s ease;\n\n /* Theme dependent */\n color: rgba(200, 210, 230, 1);\n }\n\n &.diff-lineno {\n -webkit-user-select: none;\n user-select: none;\n\n border-bottom: 1px solid;\n\n padding: 10px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-align: center;\n letter-spacing: .6px;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .12),\n rgba(158, 115, 212, .08)\n );\n }\n\n &.diff-marker {\n -webkit-user-select: none;\n user-select: none;\n\n width: 40px;\n\n border-right: 1px solid;\n\n padding: 10px 8px;\n\n font-weight: 700;\n text-align: center;\n\n /* Theme dependent */\n border-right-color: rgba(143, 163, 255, .15);\n\n color: rgba(160, 170, 200, .9);\n\n background: linear-gradient(90deg,\n rgba(40, 45, 60, .3),\n rgba(35, 40, 52, .2)\n );\n\n &::before {\n content: attr(data-marker);\n }\n }\n\n &.diff-empty {\n /* Theme dependent */\n background: rgba(20, 25, 35, .3);\n }\n\n &:is(.diff-addedline, .diff-deletedline) {\n position: relative;\n\n border-left: 4px solid;\n\n transition: background .25s ease,\n border-left-color .25s ease,\n box-shadow .25s ease;\n\n &.diff-addedline {\n /* Theme dependent */\n border-left-color: rgba(76, 175, 80, .9);\n\n background: rgba(76, 175, 80, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(129, 199, 132, 1);\n background: rgba(129, 199, 132, .18);\n box-shadow: inset 0 0 12px rgba(76, 175, 80, .15);\n }\n }\n &.diff-deletedline {\n /* Theme dependent */\n border-left-color: rgba(244, 67, 54, .9);\n\n background: rgba(244, 67, 54, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(255, 112, 97, 1);\n background: rgba(255, 112, 97, .18);\n box-shadow: inset 0 0 12px rgba(244, 67, 54, .15);\n }\n }\n }\n\n & > div {\n & > :is(ins, del) {\n border-radius: 6px;\n padding: 2px 6px;\n\n font-weight: 600;\n text-decoration: none;\n\n transition: background .25s ease,\n transform .15s ease;\n }\n\n & > ins {\n /* Theme dependent */\n background: rgba(130, 169, 26, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(139, 195, 74, .6);\n\n transform: scale(1.08);\n }\n }\n & > del {\n /* Theme dependent */\n background: rgba(244, 67, 54, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 112, 97, .6);\n\n transform: scale(1.08);\n }\n }\n }\n\n a {\n text-decoration: none;\n\n /* Theme dependent */\n color: rgba(107, 163, 216, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n text-decoration: underline;\n }\n }\n }\n }\n }\n }\n }\n\n & > #pending-changes-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n\n position: fixed;\n left: 50%;\n bottom: 63px;\n z-index: 2;\n\n transform: translateX(-50%);\n\n &.hidden {\n display: none;\n }\n\n & > :is(.accept, .reject) {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n\n border-radius: 10px 10px 0 0;\n padding: 8px 12px;\n\n font-size: .95em;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease,\n border-color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.accept {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .14);\n box-shadow: 0 10px 26px rgba(46, 125, 50, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(46, 125, 50, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(46, 125, 50, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n &.reject {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .14);\n box-shadow: 0 10px 26px rgba(155, 40, 34, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(155, 40, 34, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(155, 40, 34, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n }\n }\n\n & > #progress-bar-container {\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-direction: column;\n\n position: absolute;\n top: 0px;\n bottom: 56px;\n right: 0px;\n\n padding: 0;\n\n overflow: hidden;\n\n & > .progress-bar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 180px;\n height: 32px;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 16px;\n margin-bottom: 10px;\n margin-right: 10px;\n\n overflow: hidden;\n\n font-size: .85em;\n font-weight: 400;\n\n opacity: 1;\n\n transition: width .3s ease,\n opacity .3s ease,\n border-color .3s ease,\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .1),\n rgba(158, 115, 212, .1)\n );\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.error {\n /* Theme dependent */\n border-color: rgba(239, 68, 68, .8);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .1),\n rgba(220, 38, 38, .1)\n );\n\n & > .progress-bar-overlay {\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .6),\n rgba(220, 38, 38, .6)\n );\n }\n }\n\n & > .progress-bar-overlay {\n width: 0;\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 16px;\n\n transition: width .4s cubic-bezier(.4, 0, .2, 1),\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .6),\n rgba(158, 115, 212, .6)\n );\n }\n\n & > .progress-bar-text {\n max-width: 100%;\n\n position: relative;\n\n padding: 0 12px;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .2);\n\n color: rgba(255, 255, 255, 1);\n }\n }\n }\n\n & > #bottom-tools {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n\n max-width: calc(100% - 20vmin);\n width: fit-content;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 8px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-radius: 16px;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .bottom-tool-item {\n position: relative;\n\n white-space: nowrap;\n\n transition: opacity .2s ease;\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n\n & > .bottom-tool-trigger {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease;\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.active {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n\n & > .bottom-tool-chevron {\n transform: rotate(180deg);\n }\n }\n\n & > .bottom-tool-chevron {\n font-size: .75em;\n\n transition: transform .2s ease;\n }\n }\n }\n\n & > .bottom-tool-action {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n }\n }\n\n & > #copy-link {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-details {\n width: 15vw;\n\n position: relative;\n\n border-left: 1px solid;\n\n /* Theme dependent */\n border-left-color: rgba(54, 62, 81, 1);\n\n & > #right-top {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n align-content: center;\n justify-content: center;\n\n width: 100%;\n height: 69px;\n\n border-bottom: 2px solid;\n border-left: 1px solid;\n border-bottom-left-radius: 8px;\n\n padding: 8px 15px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .tabs {\n display: flex;\n justify-content: center;\n width: 100%;\n\n & > .tab {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 2px solid;\n\n padding: 10px;\n\n opacity: .75;\n\n transition: background .35s cubic-bezier(.4, 0, .2, 1),\n opacity .35s cubic-bezier(.4, 0, .2, 1),\n box-shadow .35s cubic-bezier(.4, 0, .2, 1),\n border-color .35s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n &:hover, &:focus-visible {\n opacity: 1;\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 75, 162, .25)\n );\n }\n\n &.hidden {\n display: none;\n }\n\n &:first-child {\n border-radius: 10px 0 0 10px;\n }\n &:last-child {\n border-radius: 0 10px 10px 0;\n }\n }\n }\n\n & > .icons {\n display: flex;\n justify-content: center;\n width: 100%;\n\n font-size: 1.4em;\n\n & > .hidden {\n display: none;\n }\n }\n }\n\n & > .section {\n display: flex;\n flex-direction: column;\n height: calc(50% - calc(69px / 2) - 15px);\n\n margin: 10px 10px 0 10px;\n\n border: 1px solid;\n border-radius: 16px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n background: rgba(30, 35, 45, .8);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n\n padding: 14px 14px 12px;\n\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n background: rgba(30, 35, 45, .8);\n\n & > .title {\n font-weight: 600;\n font-size: .85em;\n text-transform: uppercase;\n letter-spacing: .07em;\n white-space: nowrap;\n\n & > i {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n\n margin-right: 4px;\n\n font-size: .9em;\n\n transition: transform .5s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n transform: rotate(180deg);\n }\n }\n }\n\n & > .pills {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n\n & > .pill {\n border: 1px solid;\n border-radius: 10px;\n padding: 4px 8px;\n\n font-size: .75em;\n font-weight: 500;\n\n white-space: nowrap;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(224, 228, 240, 1);\n background: rgba(140, 132, 255, .1);\n\n &.uw-1 {\n /* Theme dependent */\n border-color: rgba(107, 163, 216, .8);\n background: rgba(107, 163, 216, .1);\n color: rgba(107, 163, 216, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .8);\n background: rgba(143, 163, 255, .15);\n color: rgba(143, 163, 255, 1);\n }\n }\n &.uw-2 {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .8);\n background: rgba(255, 193, 7, .1);\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n color: rgba(255, 193, 7, 1);\n }\n }\n &.uw-3 {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, .8);\n background: rgba(255, 87, 34, .1);\n color: rgba(255, 87, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n background: rgba(255, 87, 34, .15);\n color: rgba(255, 87, 34, 1);\n }\n }\n &.uw-4 {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .8);\n background: rgba(244, 67, 54, .1);\n color: rgba(244, 67, 54, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, 1);\n background: rgba(244, 67, 54, .15);\n color: rgba(244, 67, 54, 1);\n }\n }\n &.uw-4im {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, .8);\n background: rgba(178, 34, 34, .1);\n color: rgba(178, 34, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, 1);\n background: rgba(178, 34, 34, .15);\n color: rgba(178, 34, 34, 1);\n }\n }\n\n &.ub {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, .8);\n background: rgba(255, 99, 132, .1);\n color: rgba(255, 99, 132, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, 1);\n background: rgba(255, 99, 132, .15);\n color: rgba(255, 99, 132, 1);\n }\n }\n }\n }\n }\n\n & > .queue-list {\n flex: 1;\n height: 100%;\n\n padding: 4px;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .3);\n }\n\n & > .footer {\n cursor: pointer;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n\n padding: 10px 14px;\n\n border-top: 1px solid;\n\n font-size: .85em;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(30, 35, 45, .8);\n border-top-color: rgba(143, 163, 255, .2);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n & > i {\n transform: translateX(3px);\n }\n }\n\n & > i {\n transition: transform .2s ease;\n }\n }\n }\n\n &:has(#user-contributions.hidden) {\n & > #page-history {\n height: calc(100% - 89px);\n }\n }\n &:has(#page-history.hidden) {\n & > #user-contributions {\n height: calc(100% - 89px);\n }\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n left: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > .height-adjust {\n touch-action: none;\n cursor: row-resize;\n\n height: 10px;\n width: 100%;\n\n position: absolute;\n left: 0;\n top: calc(50% - 5px);\n z-index: 3;\n }\n }\n }\n }\n }\n\n & > .bottom-tool-menu {\n display: none;\n max-width: calc(100vw - 40px);\n min-width: 200px;\n\n position: absolute;\n left: 0;\n bottom: calc(100% + 8px);\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n overflow-y: visible;\n\n animation: bottom-tool-menu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n }\n\n & > .menu-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border-radius: 8px;\n padding: 10px 12px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.hidden {\n display: none;\n }\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n\n & > i:first-child {\n opacity: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n opacity: 1;\n }\n }\n\n & > i:first-child {\n width: 18px;\n\n font-size: 1.1em;\n text-align: center;\n\n opacity: .8;\n\n transition: opacity .2s ease;\n }\n\n & > span {\n flex: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n margin-left: auto;\n\n font-size: .85em;\n\n opacity: .5;\n\n transition: opacity .2s ease;\n }\n\n & > .submenu {\n cursor: default;\n\n display: none;\n min-width: 240px;\n\n position: absolute;\n left: calc(100% + 4px);\n top: -6px;\n z-index: 4;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n color: var(--body-color);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n }\n\n & > .bottom-subcontent-title {\n border-bottom: 1px solid;\n\n margin-bottom: 12px;\n padding-bottom: 8px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n }\n\n & > .bottom-subcontent-input-title {\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > :is(select, input[type=\"text\"]) {\n width: 100%;\n\n font-size: .9em;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n\n & > .bottom-subcontent-button {\n --background: 123, 143, 245;\n\n display: block;\n width: 100%;\n\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n font-weight: 600;\n }\n }\n }\n\n &:is(#revert-menu, #warn-menu) {\n max-height: calc(100vh - 120px);\n\n overflow: hidden auto;\n\n & > .warning-menu {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 280px;\n\n position: relative;\n\n border-radius: 12px;\n padding: 8px;\n\n & > .warning-menu-no-items {\n text-align: center;\n padding: 20px;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n }\n\n & > .favorites-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 4px;\n\n & > .favorites-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .9);\n\n & > .icon {\n font-size: 1.1em;\n }\n }\n\n & > .favorites-container {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n }\n\n & > .favorites-separator {\n height: 1px;\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n }\n\n & > .favorites-section:not(:has(.warning-menu-item)) {\n display: none;\n\n & ~ .favorites-separator {\n display: none;\n }\n }\n\n & > .menu-option {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n color: rgba(224, 228, 240, 1);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .12);\n\n & > .icon {\n opacity: 1;\n transform: scale(1.1);\n }\n\n & > .submenu-arrow {\n opacity: 1;\n transform: translateX(2px);\n }\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .15);\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n opacity: .85;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > span:not(.icon):not(.submenu-arrow) {\n flex: 1;\n\n font-weight: 500;\n }\n\n & > .submenu-arrow {\n flex-shrink: 0;\n\n font-size: .8em;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n }\n }\n }\n\n & > .warning-submenu {\n display: none;\n max-width: calc(100vw - 60px);\n min-width: 420px;\n max-height: calc(100vh - 120px);\n\n position: absolute;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n overflow-y: auto;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(30, 33, 42, .98);\n -webkit-backdrop-filter: blur(25px);\n backdrop-filter: blur(25px);\n\n &.show {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n }\n\n .warning-menu-item {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n background: rgba(102, 126, 234, .12);\n }\n\n &.favorite-item {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n\n &.dragging {\n opacity: 0.5;\n transform: scale(0.95);\n }\n }\n\n & > .favorite-star {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border-radius: 4px;\n\n font-size: 1.2em;\n line-height: 1;\n\n transition: transform .2s cubic-bezier(.4, 0, .2, 1),\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .4);\n\n &:hover {\n transform: scale(1.2);\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .8);\n }\n\n &.favorited {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 152, 0, 1);\n }\n }\n\n &.spin {\n animation: star-spin 0.5s cubic-bezier(.4, 0, .2, 1);\n }\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > .warning-menu-title {\n flex: 1;\n\n font-size: .92em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 228, 240, 1);\n }\n\n & > .fa-circle-question {\n flex-shrink: 0;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .6);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .warning-menu-buttons {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n\n margin-left: 8px;\n }\n\n & > .warning-menu-buttons > .warning-menu-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 7px 14px;\n\n font-size: .82em;\n font-weight: 500;\n text-transform: capitalize;\n\n transition: border-color .2s ease,\n background .2s ease,\n color .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, .95);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .22);\n }\n\n &:active {\n transform: translateY(0);\n }\n\n &.warning-menu-no-warn-button {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .2);\n color: rgba(255, 193, 7, .95);\n background: rgba(255, 152, 0, .1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .4);\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 152, 0, .22);\n }\n }\n }\n }\n\n & > .levels-menu {\n display: none;\n min-width: 0px;\n\n position: fixed;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(28, 30, 38, .98);\n -webkit-backdrop-filter: blur(24px);\n backdrop-filter: blur(24px);\n\n &.show {\n display: flex;\n gap: 6px;\n }\n\n & > .levels-menu-item {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .95em;\n font-weight: 600;\n text-align: center;\n white-space: nowrap;\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n background: rgba(255, 255, 255, .05);\n border: 1px solid rgba(255, 255, 255, .1);\n\n &:hover {\n transform: translateY(-2px);\n background: rgba(255, 255, 255, .08);\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n\n &:active {\n transform: translateY(0);\n }\n }\n }\n\n .queue-list {\n overflow: hidden auto;\n\n &:is(#user-contributions-content, #page-history-content) {\n & > .queue-item {\n margin: 4px 0;\n }\n }\n\n & > .queue-empty {\n text-align: center;\n padding: 40px 20px;\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n }\n\n & > .historical-bar {\n height: 4px;\n width: 100%;\n\n position: relative;\n\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n\n & > .label {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n font-size: 1em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n\n & > .queue-item {\n cursor: pointer;\n\n display: flex;\n\n position: relative;\n\n border: 1px solid;\n border-radius: .75rem;\n\n margin: 4px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .4);\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n &:hover, &:focus-within {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 12px oklch(0 0 0 / 0.3);\n\n background: rgba(40, 43, 52, .6);\n }\n\n &.current {\n /* Theme dependent */\n border-color: linear-gradient(90deg,\n rgba(40, 43, 52, .4),\n rgba(40, 43, 82, .6)\n );\n box-shadow: 0 0 0 1px rgba(60, 63, 122, 1) inset;\n\n background: rgba(40, 43, 82, .6);\n\n & > .item-body {\n & > .item-tags {\n & > .tag {\n /* Theme dependent */\n color: rgba(145, 145, 165, 1);\n background: rgba(60, 63, 122, .4);\n border-color: rgba(60, 63, 122, .6);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .4);\n border-color: rgba(255, 193, 7, .6);\n }\n }\n }\n }\n }\n\n &.mentions-me {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 1) inset;\n\n background: rgba(40, 43, 52, .6);\n }\n\n & > .item-color {\n --ores-color: rgba(128, 128, 128, 1);\n\n flex-shrink: 0;\n width: 4px;\n\n position: relative;\n\n opacity: .85;\n\n /* Theme dependent */\n background: var(--ores-color);\n }\n\n & > .item-body {\n --ores-color: rgba(128, 128, 128, 1);\n --diff-color: rgba(128, 128, 128, 1);\n\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: .5rem;\n\n min-width: 0;\n\n padding: .75rem 1rem;\n\n & > .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: .75rem;\n\n & > .page-title {\n display: flex;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n font-size: clamp(.825rem, .85rem + .35vw, .95rem);\n font-weight: 600;\n\n word-wrap: break-word;\n word-break: break-word;\n\n line-height: 1.35;\n\n /* Theme dependent */\n color: rgba(205, 204, 202, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n }\n\n & > .timestamp {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 4px;\n\n min-width: 3ex;\n\n padding-top: 1px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n width: 100%;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 500;\n\n hyphens: auto;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n }\n\n & > .chips {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-grow: 1;\n gap: 4px;\n\n & > .ores-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--ores-color);\n background: color-mix(in srgb, var(--ores-color) 15%, transparent);\n }\n\n & > .diff-chips {\n display: flex;\n align-items: center;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: var(--diff-color);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .item-comment {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n overflow: hidden;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n font-style: italic;\n white-space: nowrap;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .item-tags {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .5rem;\n\n & > .tag {\n display: flex;\n align-items: center;\n gap: 2px;\n\n padding: 1px .5rem;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .7rem;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(135, 135, 135, 1);\n background: rgba(45, 44, 51, 1);\n border-color: rgba(38, 37, 35, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border-color: rgba(255, 193, 7, .4);\n }\n }\n }\n }\n\n & > .remove-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n\n position: absolute;\n right: 0px;\n bottom: 0px;\n\n border-top-left-radius: 8px;\n\n line-height: 1;\n\n transition: color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n background: rgba(255, 255, 255, 0);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 70, 0, 1);\n background: rgba(255, 70, 0, .15);\n }\n }\n }\n }\n\n .tooltip {\n min-width: 0;\n max-height: 80vh;\n\n position: fixed;\n left: 0;\n top: 0;\n z-index: calc(var(--max-z-index) - 3);\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 4px 6px;\n\n overflow-wrap: break-word;\n overflow: hidden auto;\n\n font-size: .95em;\n line-height: 1.45;\n word-wrap: break-word;\n white-space: normal;\n\n animation: tooltip-enter .1s ease-out forwards;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n box-shadow: 0 10px 30px rgba(6, 12, 24, .6),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n color: rgba(234, 240, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .03),\n rgba(255, 255, 255, .01)\n );\n -webkit-backdrop-filter: blur(14px) brightness(.7);\n backdrop-filter: blur(14px) brightness(.7);\n\n &:not(.buttons) {\n pointer-events: none;\n\n max-width: 460px;\n }\n\n &.buttons {\n display: flex;\n flex-direction: row;\n gap: 8px;\n\n z-index: calc(var(--max-z-index) - 2);\n\n white-space: nowrap;\n\n & > .button {\n cursor: pointer;\n\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 4px 8px;\n\n font-size: .95em;\n font-weight: 500;\n letter-spacing: .3px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .05);\n\n color: rgba(240, 245, 255, .92);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .08),\n rgba(255, 255, 255, .02)\n );\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .14),\n rgba(255, 255, 255, .06)\n );\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 1px 4px rgba(0, 0, 0, .3),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .tooltip-title {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-bottom: 1px solid;\n\n border-radius: 6px;\n margin-bottom: 12px;\n padding: 8px 10px;\n\n font-size: 1.04em;\n font-weight: 700;\n letter-spacing: .25px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .05);\n\n color: rgba(255, 255, 255, .92);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(0, 0, 0, .04)\n );\n -webkit-backdrop-filter: blur(6px);\n backdrop-filter: blur(6px);\n }\n\n & > .tooltip-item {\n display: flex;\n flex-direction: column;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 10px;\n margin: 10px 0;\n padding: 10px 12px;\n\n overflow: hidden;\n overflow-wrap: anywhere;\n\n word-wrap: break-word;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .075),\n rgba(0, 0, 0, .25)\n );\n\n &:is(.user-warnings, .user-blocks) {\n & > .tooltip-item-level {\n display: block;\n width: 100%;\n\n border-bottom: 1px solid;\n\n border-radius: 6px 6px 0 0;\n padding: 6px 10px;\n\n font-size: .95em;\n font-weight: 700;\n letter-spacing: .3px;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 120, .25);\n\n color: rgba(255, 255, 120, .95);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 120 .22),\n rgba(255, 255, 120, .08)\n );\n }\n\n & > .tooltip-item-details {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n\n & > :is(.tooltip-item-user, .tooltip-item-time) {\n font-size: .82em;\n font-weight: 400;\n\n opacity: .8;\n\n &.tooltip-item-user {\n /* Theme dependent */\n color: rgba(150, 210, 255, .9);\n }\n &.tooltip-item-time {\n /* Theme dependent */\n color: rgba(220, 225, 235, .9);\n\n & > span:not(:first-of-type) {\n margin-left: 1ex;\n }\n }\n }\n }\n }\n\n & > .tooltip-more {\n border-top: 1px solid;\n\n border-radius: 8px;\n margin-top: 14px;\n padding-top: 10px;\n\n font-size: .92em;\n font-style: italic;\n text-align: center;\n\n opacity: .95;\n\n /* Theme dependent */\n border-top-color: rgba(255, 255, 255, .04);\n\n color: rgba(240, 240, 255, .75);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .015),\n rgba(0, 0, 0, .03)\n );\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n }\n }\n }\n\n .confirmation-modal-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 6);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease-out;\n\n &.closing {\n animation: fade-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal {\n max-width: 500px;\n min-width: 400px;\n\n border: 1px solid;\n\n border-radius: 16px;\n\n word-wrap: break-word;\n\n animation: scale-in .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .7),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: rgba(41, 47, 60, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.closing {\n animation: scale-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal-header {\n border-bottom: 1px solid;\n\n padding: 20px 24px;\n\n /* Theme dependent */\n border-bottom-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-title {\n font-size: 1.2em;\n font-weight: 700;\n }\n }\n\n & > .confirmation-modal-body {\n max-height: 70vh;\n\n padding: 24px;\n\n line-height: 1.5;\n\n overflow: hidden auto;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n\n & > .confirmation-modal-username {\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(91, 154, 255, 1);\n }\n\n & > .confirmation-modal-input {\n width: 100%;\n\n border: 1px solid;\n border-radius: 4px;\n\n margin-top: 10px;\n padding: 8px;\n\n /* Theme dependent */\n color: white;\n border-color: rgba(255, 255, 255, .2);\n background: rgba(0, 0, 0, .3);\n }\n }\n\n & > .confirmation-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n\n border-top: 1px solid;\n\n padding: 16px 24px;\n\n /* Theme dependent */\n border-top-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-footer-right {\n display: flex;\n gap: 12px;\n }\n\n &.confirmation-modal-footer-vertical {\n flex-direction: column;\n align-items: stretch;\n\n & > .confirmation-modal-button {\n width: 100%;\n }\n }\n }\n\n .confirmation-modal-button {\n font-size: .95em;\n font-weight: 500;\n }\n }\n }\n\n .notification-panel {\n pointer-events: none;\n\n display: flex;\n flex-direction: column;\n width: 480px;\n max-height: 600px;\n\n position: absolute;\n left: 15px;\n top: 55px;\n z-index: calc(var(--max-z-index) - 9);\n\n border: 1px solid;\n border-radius: 18px;\n\n overflow: hidden;\n\n opacity: 0;\n\n transform: translateY(-20px) scale(.95);\n\n transition: opacity .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 20px 60px rgba(0, 0, 0, .8),\n 0 0 0 1px rgba(255, 255, 255, .08),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n\n background: rgba(25, 27, 36, .96);\n -webkit-backdrop-filter: blur(25px) brightness(0.95);\n backdrop-filter: blur(25px) brightness(0.95);\n\n a {\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(160, 195, 255, 1);\n }\n\n &:visited {\n /* Theme dependent */\n color: rgba(150, 185, 255, 1);\n }\n }\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n\n & > .notification-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border-bottom: 1px solid;\n\n padding: 18px 22px;\n\n font-size: 1.12em;\n font-weight: 700;\n letter-spacing: 0.3px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .08);\n\n color: rgba(245, 245, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(120, 145, 255, .12),\n rgba(140, 100, 200, .08)\n );\n\n & > .mark-all-read {\n cursor: pointer;\n\n font-size: 0.78em;\n font-weight: 500;\n letter-spacing: 0.2px;\n\n padding: 6px 12px;\n border-radius: 6px;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n background: rgba(120, 170, 255, .08);\n\n &:hover {\n /* Theme dependent */\n background: rgba(120, 170, 255, .15);\n color: rgba(160, 200, 255, 1);\n }\n\n &:active {\n opacity: .85;\n }\n }\n }\n\n & > .notification-list {\n max-height: 520px;\n\n overflow: hidden auto;\n\n padding: 8px;\n\n & > .notifications-empty {\n padding: 40px 20px;\n\n text-align: center;\n\n font-size: 0.95em;\n\n /* Theme dependent */\n color: rgba(120, 125, 145, 1);\n\n & strong {\n /* Theme dependent */\n color: rgba(150, 155, 175, 1);\n }\n }\n\n & > .notification {\n cursor: pointer;\n\n display: flex;\n align-items: flex-start;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 18px;\n margin-bottom: 8px;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(50, 55, 75, .4),\n rgba(40, 45, 65, .3)\n );\n\n &:hover {\n opacity: 1;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .3);\n box-shadow: 0 8px 24px rgba(120, 170, 255, .15),\n inset 0 1px 0 rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(80, 100, 160, .15),\n rgba(70, 85, 145, .1)\n );\n\n transform: translateY(-2px);\n }\n\n &.unread {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .5);\n box-shadow: 0 0 20px rgba(120, 170, 255, .2),\n inset 0 1px 0 rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(120, 170, 255, .1),\n rgba(100, 145, 255, .05)\n );\n }\n\n &.read {\n opacity: .72;\n\n border-color: rgba(255, 255, 255, .04);\n }\n\n & > .notification-icon {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n\n border-radius: 10px;\n\n overflow: hidden;\n\n background: rgba(60, 75, 120, .5);\n\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n & > .notification-content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 5px;\n\n & > .notification-header {\n margin: 0;\n\n font-size: .95rem;\n font-weight: 600;\n letter-spacing: 0.2px;\n\n /* Theme dependent */\n color: rgba(235, 240, 255, 1);\n }\n\n & > .notification-body {\n font-size: .82rem;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 180, 205, 1);\n }\n\n & > .notification-links {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n\n margin-top: 6px;\n\n & > a {\n border: none;\n\n padding: 4px 8px;\n border-radius: 5px;\n\n font-size: .8rem;\n font-weight: 500;\n text-decoration: none;\n\n background: rgba(120, 170, 255, .12);\n opacity: 1;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n color: rgba(140, 185, 255, 1);\n\n &:hover {\n opacity: 1;\n\n background: rgba(120, 170, 255, .22);\n\n /* Theme dependent */\n color: rgba(180, 210, 255, 1);\n }\n\n &:active {\n opacity: .85;\n\n transform: scale(0.98);\n }\n }\n }\n }\n\n & > .notification-right {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n gap: 10px;\n\n & > .notification-unread-indicator {\n cursor: pointer;\n\n width: 12px;\n height: 12px;\n\n border-radius: 50%;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n background: rgba(120, 170, 255, 1);\n box-shadow: 0 0 8px rgba(120, 170, 255, .5);\n\n &:hover, &:focus {\n transform: scale(1.35);\n\n /* Theme dependent */\n box-shadow: 0 0 16px rgba(120, 170, 255, .8);\n }\n }\n\n & > .notification-timestamp {\n font-size: .72rem;\n font-weight: 500;\n\n opacity: .8;\n\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(140, 150, 175, 1);\n }\n }\n }\n }\n }\n\n .icon-count {\n --color: 255, 255, 255;\n --background: 255, 255, 255;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n\n position: absolute;\n right: -11px;\n top: -11px;\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 50%;\n padding: 0 8px;\n\n font-family: sans-serif;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n\n transition: transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(var(--background), .3);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(var(--background), .15);\n\n color: rgba(--color, 1);\n text-shadow: 0 1px 0 rgba(0, 0, 0, .35);\n\n background: linear-gradient(135deg,\n rgba(var(--background), .7),\n rgba(var(--background), .5)\n );\n -webkit-backdrop-filter: blur(6px) brightness(0%);\n backdrop-filter: blur(6px) brightness(0%);\n\n &.red {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 255, 60, 60;\n }\n &.green {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 205, 80;\n }\n &.blue {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 120, 255;\n }\n &.yellow {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 215, 60;\n }\n &.orange {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 165, 60;\n }\n &:is(.gray, .grey) {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 150, 150, 150;\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n transform: scale(0);\n }\n }\n\n .toast-alert {\n display: flex;\n align-items: center;\n gap: 14px;\n max-width: 500px;\n min-width: 320px;\n\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: calc(var(--max-z-index) - 4);\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 20px;\n\n opacity: 0;\n\n transform: translateX(100%) scale(.8);\n\n animation: toast-alert-enter .5s cubic-bezier(.68, -.55, .265, 1.55);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 12px 40px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(25px) saturate(180%);\n backdrop-filter: blur(25px) saturate(180%);\n\n &.success {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(76, 175, 80, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .25)\n );\n }\n &.warning {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(255, 152, 0, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 152, 0, .25),\n rgba(245, 124, 0, .25)\n );\n }\n &.error {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(244, 67, 54, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .25)\n );\n }\n &.dev {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(156, 39, 176, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(156, 39, 176, .25),\n rgba(123, 31, 162, .25)\n );\n }\n\n &.show {\n opacity: 1;\n\n transform: translateX(0) scale(1);\n }\n\n &.hidden {\n animation: toast-alert-leave .4s cubic-bezier(.6, -.28, .735, .045) forwards;\n }\n\n & > .toast-icon {\n flex-shrink: 0;\n\n font-size: 1.8em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .3));\n }\n\n & > .toast-content {\n flex: 1;\n\n & > .toast-title {\n margin-bottom: 4px;\n\n font-size: 1.05em;\n font-weight: 700;\n letter-spacing: .3px;\n }\n\n & > .toast-message {\n font-size: .9em;\n line-height: 1.4;\n\n opacity: .95;\n }\n }\n\n & > .toast-close {\n cursor: pointer;\n\n flex-shrink: 0;\n\n border-radius: 6px;\n padding: 4px;\n\n font-size: 1.3em;\n\n background: transparent;\n opacity: .8;\n\n transition: opacity .2s ease,\n transform .2s ease,\n background .2s ease;\n\n &:hover {\n opacity: 1;\n\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n }\n }\n\n .minor-indicator {\n border: 1px solid;\n\n border-radius: 4px;\n margin-right: 4px;\n padding: 0 4px;\n\n font-size: .9em;\n font-weight: 700;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(153, 153, 153, 1);\n\n background: rgba(60, 64, 76, .9);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n .menu-divider {\n height: 1px;\n\n margin: 6px 8px;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n\n .profanity {\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n margin: 20px;\n padding: 20px;\n\n border-radius: 12px;\n border: 1px solid;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .8);\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .3);\n\n & > .profanity-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n\n padding-bottom: 16px;\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n\n & > .profanity-score {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n & > .score-label {\n font-size: .85em;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n }\n\n & > .score-value {\n font-size: 2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(255, 200, 100, 1);\n }\n }\n\n & > .profanity-risk {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 16px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n background: rgba(60, 64, 76, .6);\n\n &.risk-high {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n background: rgba(211, 47, 47, .2);\n border: 1px solid rgba(211, 47, 47, .4);\n }\n\n &.risk-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border: 1px solid rgba(255, 193, 7, .3);\n }\n\n &.risk-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n background: rgba(66, 165, 245, .15);\n border: 1px solid rgba(66, 165, 245, .3);\n }\n }\n }\n\n & > .profanity-matches-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .profanity-matches-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n & > .profanity-match {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n border-radius: 8px;\n padding: 12px 14px;\n border-left: 3px solid;\n\n transition: background .2s ease,\n border-color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n background: rgba(45, 50, 62, .7);\n border-left-color: rgba(255, 150, 150, .5);\n\n &:hover {\n transform: translateX(4px);\n\n /* Theme dependent */\n background: rgba(50, 56, 70, .85);\n border-left-color: rgba(255, 150, 150, .8);\n }\n\n & > .match-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: .95em;\n\n & > .match-text {\n font-family: 'Courier New', monospace;\n font-weight: 600;\n\n border-radius: 4px;\n padding: 4px 8px;\n\n /* Theme dependent */\n color: rgba(255, 180, 180, 1);\n background: rgba(211, 47, 47, .2);\n }\n\n & > .match-arrow {\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .match-name {\n font-family: 'Courier New', monospace;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n }\n\n & > .match-details {\n display: flex;\n gap: 16px;\n\n & > .match-stat {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n & > .stat-label {\n font-size: .75em;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .stat-value {\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n &.severity-critical {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n }\n &.severity-high {\n /* Theme dependent */\n color: rgba(255, 150, 100, 1);\n }\n\n &.severity-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n &.severity-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n }\n }\n }\n }\n\n & > .match-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n margin-top: 6px;\n padding: 10px 12px;\n border-radius: 6px;\n\n font-size: .85em;\n line-height: 1.5;\n\n /* Theme dependent */\n background: rgba(30, 33, 43, .6);\n border: 1px solid rgba(100, 150, 255, .2);\n\n & > .fa {\n margin-top: 2px;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(100, 150, 255, .8);\n }\n\n & > .note-text {\n flex: 1;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n }\n }\n }\n\n & > .profanity-no-matches {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n padding: 20px;\n\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(100, 200, 100, 1);\n }\n }\n\n & > #settings-container {\n z-index: calc(var(--max-z-index) - 7);\n\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n\n opacity: 0;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n\n & > .settings {\n transform: scale(1);\n }\n }\n\n & > .settings {\n display: flex;\n max-width: 1100px;\n width: 90vw;\n\n border: 1px solid;\n\n border-radius: 20px;\n\n overflow: hidden;\n\n transform: scale(.75);\n\n transition: transform .1s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(30, 33, 42, .95);\n -webkit-backdrop-filter: blur(30px);\n backdrop-filter: blur(30px);\n\n & > div {\n height: 80vh;\n\n &.settings-left {\n width: 250px;\n\n border-right: 1px solid;\n\n padding: 20px 0;\n\n overflow-y: auto;\n\n /* Theme dependent */\n border-right-color: rgba(255, 255, 255, .1);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(255, 255, 255, .05)\n );\n\n & > .settings-category {\n &:not(:last-child) {\n margin-bottom: 20px;\n }\n\n & > .settings-category-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n margin-bottom: 4px;\n padding: 12px 20px;\n\n font-size: .7em;\n font-weight: 800;\n letter-spacing: 1.5px;\n text-transform: uppercase;\n }\n\n & > .settings-left-menu-compact {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n padding: 0 12px;\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 10px;\n padding: 12px;\n\n font-size: 1.2em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:first-child {\n margin-left: 12px;\n }\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n }\n }\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n border-radius: 10px;\n margin: 2px 12px;\n padding: 12px 20px;\n\n font-size: .95em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n & > span > i {\n height: 1em;\n aspect-ratio: 1 / 1;\n\n margin-right: 12px;\n\n text-align: center;\n }\n }\n }\n }\n\n &.settings-right {\n flex: 1;\n\n padding: 20px 30px;\n\n overflow-y: auto;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .5);\n\n & > .hidden {\n display: none;\n }\n\n a {\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n color: rgba(176, 192, 255, 1);\n }\n }\n\n pre, code {\n border-radius: 4px;\n padding: 2px 4px;\n\n font-size: .95em;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n\n .settings-compact-grid {\n & > .compact {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n & > .numeric-input-container {\n & > .numeric-input {\n width: calc(100% - 70px);\n }\n }\n\n & > select {\n width: 100%;\n }\n }\n }\n\n .settings-section, .settings-toggles-section {\n display: block;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 25px;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n\n background: rgba(35, 38, 48, .8);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n .settings-section-title {\n margin-bottom: 5px;\n\n font-size: 1em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n &.collapse-title {\n margin-bottom: 0;\n }\n }\n\n .settings-section-desc {\n margin-bottom: 0;\n\n font-size: .85em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .pad-list {\n margin: 8px 0;\n padding-left: 20px;\n }\n\n &:not(:last-child) {\n margin-bottom: 30px;\n }\n\n &.compact {\n margin-bottom: 0;\n padding: 18px;\n\n & > .settings-section-title {\n font-size: 1.05em;\n\n &.collapse-title {\n margin-bottom: 15px;\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 12px;\n\n font-size: .85em;\n }\n }\n\n &.inline {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .6);\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .settings-section-content {\n flex: 1;\n }\n }\n\n &.collapsed {\n & > .collapse-title::after {\n transform: rotate(-180deg);\n }\n }\n\n & > .collapse-title {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n &::after{\n content: \"\\f077\";\n\n float: right;\n\n font-family: \"Font Awesome 6 Free\";\n font-weight: 900;\n\n transition: transform .2s ease;\n }\n }\n\n & > .collapsible-content {\n padding: initial;\n\n overflow: hidden;\n\n transition: padding .2s ease;\n\n &.collapsed {\n padding: 0;\n }\n }\n\n & > .settings-section-title {\n margin-bottom: 15px;\n\n font-size: 1.4em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 8px;\n }\n }\n\n & > .settings-section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n\n margin-bottom: 15px;\n\n font-size: 1.2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 0;\n }\n\n & > .settings-section-header-icon {\n font-size: 1.3em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .2));\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 20px;\n\n font-size: .95em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .checkbox-container {\n display: flex;\n flex-wrap: wrap;\n\n & > div {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 200px;\n\n margin-bottom: 8px;\n\n &:hover {\n & > .checkbox-box {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .checkbox-box {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: block;\n\n position: relative;\n\n border-radius: 5px;\n\n font-size: .95em;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(213, 213, 213, 1);\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n position: absolute;\n width: 0;\n height: 0;\n\n border-radius: 5px;\n\n opacity: 0;\n\n &:checked ~ .checkmark {\n /* Theme dependent */\n background: linear-gradient(45deg,\n rgba(100, 61, 219, 1),\n rgba(217, 21, 239, 1)\n );\n\n &::after {\n opacity: 1;\n }\n }\n }\n\n & > .checkmark {\n width: 1.3em;\n height: 1.3em;\n\n position: relative;\n left: 0;\n top: 0;\n\n border-radius: 5px;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(204, 204, 204, 1);\n\n &::after {\n content: \"\";\n\n width: .25em;\n height: .5em;\n\n position: absolute;\n left: .45em;\n top: .25em;\n\n border-width: 0 .15em .15em 0;\n border-style: solid;\n\n opacity: 0;\n\n transform: rotate(45deg);\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, 1);\n }\n }\n }\n }\n }\n\n .numeric-input-container {\n display: flex;\n\n & > .numeric-input-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n width: 35px;\n height: 35px;\n\n border: 1px solid;\n\n border-radius: 8px;\n\n font-size: 1.3em;\n\n transition: background .2s ease,\n border-color .2s ease,\n color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .8);\n\n &:hover {\n transform: scale(1.05);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n }\n\n & > .numeric-input {\n width: 100px;\n\n border-radius: 8px;\n margin: 0 5px;\n padding: 6px 12px;\n\n font-size: 1.1em;\n }\n }\n\n .volume-control {\n display: block;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 20px 0;\n padding: 20px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .volume-control-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n\n margin-bottom: 16px;\n\n & > .volume-control-info {\n flex: 1;\n\n & > .volume-control-title {\n margin-bottom: 6px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .volume-control-desc {\n font-size: .9em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .volume-control-preview {\n --background: 123, 143, 245;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 18px;\n\n font-size: .9em;\n font-weight: 500;\n }\n }\n\n & > .volume-control-slider-container {\n display: flex;\n align-items: center;\n gap: 16px;\n\n & > .volume-control-slider {\n flex: 1;\n height: 6px;\n\n outline: none;\n\n border-radius: 3px;\n\n -webkit-appearance: none;\n appearance: none;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n\n &::-webkit-slider-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n\n &::-moz-range-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border: none;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n }\n\n & > .volume-control-input {\n width: 70px;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-size: .95em;\n text-align: center;\n }\n }\n }\n\n .settings-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 60px;\n height: 32px;\n\n position: relative;\n\n &:hover {\n & > .toggle-switch {\n transform: scale(1.02);\n }\n }\n\n &.active {\n & > .toggle-switch {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n & > .toggle-slider {\n left: 30px;\n\n /* Theme dependent */\n box-shadow: 0 4px 10px rgba(0, 0, 0, .3),\n 0 2px 4px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .toggle-switch {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n border: 2px solid;\n\n border-radius: 16px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n\n & > .toggle-slider {\n width: 24px;\n height: 24px;\n\n position: absolute;\n left: 2px;\n top: 2px;\n\n border-radius: 50%;\n\n transition: left .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n 0 1px 2px rgba(0, 0, 0, .15);\n\n background: rgba(255, 255, 255, 1);\n }\n }\n }\n\n .settings-radio-group {\n display: flex;\n flex-direction: row;\n gap: 12px;\n\n border-radius: 100vh;\n padding: 8px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-radio-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n flex: 1;\n\n text-align: center;\n\n border-radius: 100vh;\n padding: 10px 16px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 1);\n }\n\n &.selected {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n color: rgba(224, 224, 224, 1);\n }\n }\n }\n\n .settings-slider {\n display: flex;\n flex-direction: column;\n gap: 14px;\n\n border-radius: 14px;\n padding: 16px 20px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-slider-labels {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n & > .settings-slider-labels > .settings-slider-label-left,\n & > .settings-slider-labels > .settings-slider-label-right {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &.active {\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .percent {\n font-size: .85em;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n }\n\n & > .settings-slider-labels > .settings-slider-label-right {\n text-align: right;\n }\n\n & > .settings-slider-track {\n cursor: pointer;\n\n height: 8px;\n\n position: relative;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n &::before {\n content: '';\n\n width: var(--fill, 50%);\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .6),\n rgba(118, 75, 162, .6)\n );\n }\n\n & > .settings-slider-thumb {\n cursor: grab;\n\n width: 22px;\n height: 22px;\n\n position: absolute;\n top: 50%;\n\n border: 2px solid;\n\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n transition: transform .15s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .4),\n 0 0 12px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: translate(-50%, -50%) scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 12px rgba(0, 0, 0, .5),\n 0 0 20px rgba(102, 126, 234, .5);\n }\n\n &:active, &.dragging {\n cursor: grabbing;\n\n transform: translate(-50%, -50%) scale(1.2);\n\n /* Theme dependent */\n box-shadow: 0 4px 16px rgba(0, 0, 0, .5),\n 0 0 24px rgba(102, 126, 234, .6);\n }\n }\n }\n }\n\n .palette-selector {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n\n margin-top: 20px;\n\n & > .palette-option {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 12px;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 20px rgba(20, 20, 30, .4);\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4);\n }\n\n & > .palette-name {\n pointer-events: none;\n\n font-size: .9em;\n font-weight: 600;\n text-align: center;\n }\n\n & > .palette-preview {\n pointer-events: none;\n\n display: flex;\n gap: 4px;\n height: 40px;\n\n border-radius: 8px;\n margin-bottom: 12px;\n\n overflow: hidden;\n\n & > canvas {\n flex: 1;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .tracklist {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n\n & > .track {\n position: relative;\n\n border-radius: 8px;\n\n overflow: hidden;\n\n & > .thumbnail {\n display: block;\n width: 100%;\n aspect-ratio: 1 / 1;\n\n overflow: hidden;\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n\n overflow: hidden;\n }\n }\n\n & > .info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n\n padding: 10px 12px;\n\n /* Theme dependent */\n background: linear-gradient(180deg,\n rgba(0, 0, 0, 0),\n rgba(0, 0, 0, .35),\n rgba(0, 0, 0, .65)\n );\n\n & > .title {\n font-size: .95em;\n font-weight: 600;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n\n color: rgba(255, 255, 255, 1);\n }\n\n & > :is(.artist, .length) {\n font-size: .8em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n }\n }\n\n & > .preview-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0;\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n top: 8px;\n\n border-radius: 50%;\n padding: 0;\n }\n }\n }\n\n .control-container {\n border: 1px solid;\n\n border-radius: 12px;\n margin-bottom: 15px;\n padding: 18px 22px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .control-container-title {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.margin-top {\n margin-top: 10px;\n }\n }\n\n & > .control-keys {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n & > div {\n display: flex;\n align-items: center;\n width: max-content;\n\n border: 1px solid;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-weight: 500;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .3);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .9);\n\n &:not(.key-select):hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(60, 64, 78, .95);\n }\n\n &.key-select {\n border: 2px dashed;\n\n font-style: italic;\n\n /* Theme dependent */\n border-color: rgba(192, 192, 192, .6);\n box-shadow: 0 0 10px rgba(192, 192, 192, .4);\n\n background: rgba(192, 192, 192, .1);\n }\n\n &.duplicate {\n border: 2px dashed;\n\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n box-shadow: 0 0 10px rgba(255, 87, 34, .5);\n\n background: rgba(255, 87, 34, .1);\n }\n\n & > .key-elem-title {\n margin-right: 10px;\n }\n\n &.add, & > .remove {\n cursor: pointer;\n }\n }\n }\n\n & > .control-actions {\n .control-action {\n border-left: 2px solid;\n\n margin-top: 12px;\n padding-left: 16px;\n\n /* Theme dependent */\n border-left-color: rgba(102, 126, 234, .5);\n\n & > .control-action-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n margin-bottom: 8px;\n\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n span {\n margin-right: 5px;\n }\n\n & > .control-action-title-left {\n white-space: nowrap;\n\n overflow-x: auto;\n\n & > span {\n width: 17px;\n }\n\n & > select {\n border-radius: 6px;\n margin: 0 5px;\n padding: 6px 10px;\n }\n\n & > .params {\n font-size: .85em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n & > .condition-parameter {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n margin: 0 4px;\n\n & > select,\n & > input:not([type=checkbox]) {\n border-radius: 6px;\n padding: 6px 10px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n }\n }\n }\n\n & > .control-action-title-right {\n display: flex;\n\n & > span {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display:flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n\n border-radius: 5px;\n margin-right: 0;\n\n font-size: 1.2em;\n\n transition: background .1s ease;\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n }\n }\n }\n\n & > .action-parameter {\n border: 1px solid;\n\n border-radius: 8px;\n margin-top: 10px;\n padding: 12px 14px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .3);\n\n & > .parameter-title {\n margin-bottom: 8px;\n\n font-size: .9em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n\n & > select,\n & > input:not([type=checkbox]),\n & > duration-input {\n width: 100%;\n\n border-radius: 6px;\n padding: 8px 12px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 20px;\n height: 20px;\n }\n }\n }\n\n & > .control-bottom-container {\n display: flex;\n justify-content: space-between;\n\n margin-top: 10px;\n\n & > div {\n display: flex;\n\n & > .add-action-button {\n width: max-content;\n\n border-radius: 8px;\n padding: 8px 16px;\n\n font-weight: 500;\n }\n }\n }\n }\n }\n\n .text-input-container {\n display: flex;\n gap: 12px;\n\n border-style: 2px dashed;\n\n border-radius: 12px;\n margin-top: 18px;\n padding: 16px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .35);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 0.15),\n rgba(118, 75, 162, 0.15)\n );\n\n & > input[type=\"text\"] {\n flex: 1;\n\n border-style: dashed;\n\n border-radius: 10px;\n padding: 10px 16px;\n\n font-size: .95em;\n\n &:focus {\n border-style: solid;\n }\n }\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n\n margin-top: 20px;\n\n & > .stat-card {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n width: 100%;\n height: 150px;\n\n background-color: transparent;\n\n perspective: 1000px;\n\n transition: transform .3s ease;\n\n &:hover, &:active {\n transform: scale(1.05);\n\n & > .inside {\n transform: rotateY(180deg);\n\n &::before {\n opacity: 1;\n }\n }\n }\n\n & > .inside {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n transform-style: preserve-3d;\n\n transition: transform 0.8s linear(\n 0, 0.005, 0.02 2.2%, 0.046 4.5%, 0.182 11.5%,\n 0.318 16.3%, 0.459 20.6%, 0.601 24.6%, 0.738 28.6%,\n 0.863 32.7%, 0.954 37%, 1.015 41.8%, 1.049 47.4%,\n 1.059, 1.047 57.3%, 1.03 63.5%, 1.012 70.9%,\n 1.002 79.5%, 1\n );\n\n &::before {\n inset: -2px;\n\n border-radius: 14px;\n padding: 2px;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n }\n\n & > :is(.front, .back) {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n position: absolute;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n text-align: center;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .25);\n\n &.front {\n justify-content: center;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .15),\n rgba(118, 75, 162, .15)\n );\n }\n &.back {\n transform: rotateY(180deg);\n\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(118, 75, 162, .15),\n rgba(102, 126, 234, .15)\n );\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 4px;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .4);\n }\n &::-webkit-scrollbar-track {\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n }\n\n & > .stat-value {\n margin-bottom: 8px;\n\n font-size: 2.2em;\n font-weight: 700;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n /* Theme independent */\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .stat-label {\n margin-bottom: 4px;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .stat-sublabel {\n font-size: .8em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n &:not(:last-child) {\n margin-bottom: 8px;\n }\n }\n }\n }\n }\n }\n\n .changelog-content {\n & > .changelog-header {\n border-bottom: 2px solid;\n\n padding-bottom: 24px;\n margin-bottom: 8px;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n & > h1 {\n margin: 0 0 10px 0;\n\n font-size: 2.5em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n\n & > i {\n margin-right: 12px;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > .changelog-subtitle {\n margin: 0 0 20px 0;\n\n font-size: 1.1em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .9);\n }\n\n & > .changelog-nav {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n gap: 8px;\n\n & > .changelog-nav-item {\n cursor: pointer;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 6px 16px;\n\n font-size: .85em;\n font-weight: 600;\n text-decoration: none;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(200, 200, 200, .9);\n background: rgba(102, 126, 234, .08);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n color: rgba(255, 255, 255, 1);\n background: rgba(102, 126, 234, .2);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .3),\n rgba(118, 168, 255, .3)\n );\n box-shadow: 0 0 12px rgba(102, 126, 234, .3);\n }\n }\n }\n }\n\n & > .changelog-divider {\n height: 2px;\n\n margin: 48px auto 8px;\n\n border-radius: 1px;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(102, 126, 234, .4) 20%,\n rgba(118, 168, 255, .4) 50%,\n rgba(102, 126, 234, .4) 80%,\n transparent\n );\n }\n\n & > .changelog-version {\n margin-top: 32px;\n padding: 24px;\n\n border: 1px solid;\n border-radius: 16px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(30, 33, 42, .4);\n\n & > .changelog-version-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n\n border-bottom: 1px solid;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n & > .version-badge-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n margin-bottom: 12px;\n\n & > .version-badge {\n display: inline-block;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 4px 16px;\n\n font-size: .8em;\n font-weight: 700;\n font-family: 'Courier New', monospace;\n letter-spacing: .5px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(118, 168, 255, 1);\n background: rgba(102, 126, 234, .12);\n }\n\n & > .version-tag {\n display: inline-block;\n\n border-radius: 20px;\n padding: 4px 12px;\n\n font-size: .7em;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 1px;\n\n &.latest {\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .4);\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 1.6em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .changelog-version-subtitle {\n margin: 0;\n\n font-size: .9em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .7);\n\n & > i {\n margin-right: 4px;\n }\n }\n }\n\n & > .changelog-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: 24px;\n\n margin: 0 auto;\n padding: 0;\n\n & > .card {\n position: relative;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n overflow: hidden;\n\n transition: border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n background: rgba(40, 43, 52, .6);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &::before {\n content: '';\n\n height: 3px;\n\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n }\n\n &:hover {\n transform: translateY(-4px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5),\n 0 0 0 1px rgba(102, 126, 234, .2);\n\n background: rgba(40, 43, 52, .85);\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n transform: scale(1.1) rotate(5deg);\n }\n }\n\n &.featured {\n grid-column: 1 / -1;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: linear-gradient(135deg,\n rgba(40, 43, 52, .8),\n rgba(50, 53, 62, .8)\n );\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 168, 255, .25)\n );\n }\n }\n\n & > .card-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n\n border-radius: 12px;\n margin-bottom: 16px;\n\n transition: transform .3s ease;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n\n & > i {\n font-size: 24px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 168, 255, 1)\n );\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > h2 {\n margin: 0 0 12px 0;\n\n font-size: 1.35em;\n font-weight: 700;\n letter-spacing: -0.02em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .95);\n }\n\n & > p {\n margin: 0 0 16px 0;\n\n font-size: .95em;\n line-height: 1.6em;\n\n /* Theme dependent */\n color: rgba(118, 168, 255, .9);\n }\n\n & > ul {\n margin: 0;\n padding-left: 24px;\n\n font-size: .9em;\n line-height: 1.7em;\n\n /* Theme dependent */\n color: rgba(229, 229, 229, .9);\n\n & > li {\n margin-bottom: 8px;\n padding-left: 4px;\n\n &::marker {\n /* Theme dependent */\n color: rgba(102, 126, 234, .8);\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n & > strong {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n }\n\n & > code {\n border-radius: 4px;\n padding: 2px 6px;\n\n font-family: 'Courier New', monospace;\n font-size: .9em;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n color: rgba(118, 168, 255, 1);\n }\n\n & > ul {\n margin-top: 6px;\n padding-left: 20px;\n\n & > li {\n font-size: .95em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .85);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .about-content {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 0;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .25);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(30, 33, 42, .95),\n rgba(25, 28, 36, .9)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & > .about-version {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n\n padding: 32px;\n\n font-size: 1.3em;\n font-weight: 700;\n letter-spacing: .5px;\n\n /* Theme dependent */\n box-shadow: 0 4px 20px rgba(143, 163, 255, .25),\n inset 0 1px 0 rgba(255, 255, 255, .15),\n inset 0 -1px 0 rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .25),\n rgba(118, 75, 162, .2)\n );\n\n & > .fa {\n font-size: 1.5em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n filter: drop-shadow(0 2px 8px rgba(143, 163, 255, .6));\n }\n }\n\n & > .about-tagline {\n padding: 24px 32px;\n\n text-align: center;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 255, .08);\n\n & > p {\n margin: 0;\n\n font-size: 1.05em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(180, 185, 200, 1);\n }\n }\n\n & > .about-links {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n padding: 16px;\n\n & > .link-card {\n display: flex;\n align-items: center;\n gap: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n margin-bottom: 12px;\n padding: 16px 20px;\n\n text-decoration: none;\n\n transition:\n border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease,\n border-left-color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n border-left: 3px solid rgba(143, 163, 255, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .6) 40%\n );\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &:hover {\n transform: translateX(6px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .5);\n border-left-color: rgba(143, 163, 255, .8);\n box-shadow: 0 6px 24px rgba(143, 163, 255, .2),\n 0 2px 12px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .15),\n rgba(118, 75, 162, .08) 50%\n );\n\n & > .link-card-icon {\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .25);\n }\n\n & > .link-card-arrow {\n transform: translateX(4px);\n\n opacity: 1;\n }\n }\n\n & > .link-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n\n border-radius: 10px;\n\n font-size: 1.3em;\n\n transition:\n transform .3s ease,\n background .3s ease;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .15);\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .link-card-content {\n flex: 1;\n text-align: left;\n\n & > .link-card-title {\n margin-bottom: 4px;\n\n font-size: 1em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .link-card-desc {\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n & > .link-card-arrow {\n font-size: 1.2em;\n\n opacity: .5;\n\n transition:\n transform .3s ease,\n opacity .3s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .about-footer {\n padding: 0;\n\n & > .footer-divider {\n height: 1px;\n\n margin: 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(143, 163, 255, .3) 20%,\n rgba(143, 163, 255, .3) 80%,\n transparent\n );\n }\n\n & > .about-credits {\n padding: 24px;\n\n & > div {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(max(280px, calc(50% - 6px)), 1fr));\n gap: 12px;\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .credit-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n border-radius: 14px;\n padding: 14px 16px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n border-top: 2px solid rgba(143, 163, 255, .18);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .4) 30%\n );\n\n &:hover {\n transform: translateY(-3px) scale(1.01);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n border-top-color: rgba(143, 163, 255, .5);\n box-shadow: 0 6px 20px rgba(143, 163, 255, .18),\n 0 2px 8px rgba(0, 0, 0, .25);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .1),\n rgba(40, 43, 52, .6) 40%\n );\n }\n\n & > .credit-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n\n border-radius: 50%;\n\n font-size: 1.1em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .15)\n );\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .credit-info {\n flex: 1;\n min-width: 0;\n text-align: left;\n\n & > .credit-name {\n position: relative;\n overflow: hidden;\n\n margin-bottom: 2px;\n\n font-size: .95em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n & > span {\n display: inline-block;\n white-space: nowrap;\n }\n }\n\n & > .credit-role {\n font-size: .8em;\n line-height: 1.4;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n &:hover {\n & > .credit-info {\n & > .credit-name > span {\n animation: scroll-text 3s linear infinite;\n }\n }\n }\n }\n\n & > .copyright-card {\n cursor: pointer;\n\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n text-align: center;\n overflow: hidden;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: rgba(35, 38, 46, .3);\n\n & > .copyright-title {\n margin-bottom: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > .copyright-desc {\n font-size: .75em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(140, 140, 140, 1);\n }\n }\n }\n }\n }\n }\n\n &#ollama-server-url {\n & > .connection-status-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n &:has(#settings-ollama-connection-status:empty) {\n display: none;\n }\n\n &.testing {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.connected {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .7);\n box-shadow: 0 2px 8px rgba(76, 175, 80, .4);\n\n background: rgba(76, 175, 80, .1);\n }\n &.failed {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > #settings-connection-status {\n font-size: .9em;\n }\n }\n }\n\n &#ollama-model-select {\n .models-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n text-align: center;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n &.searching {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .7);\n box-shadow: 0 2px 8px rgba(143, 163, 255, .4);\n\n background: rgba(143, 163, 255, .1);\n }\n &.none {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.error {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > p {\n font-size: .9em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n & > #settings-ollama-models {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 8px;\n\n &:not(:empty) {\n margin-top: 8px;\n }\n\n & > .model {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 12px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(50, 54, 66, .9);\n }\n\n &.selected {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 0 15px rgba(143, 163, 255, .5);\n\n background: rgba(143, 163, 255, .1);\n\n & > .model-top {\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .model-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n\n & > .fa {\n /* Theme dependent */\n color: rgba(128, 128, 128, .5);\n }\n\n & > .model-name {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .pseudo-indicator {\n pointer-events: none;\n\n opacity: 0;\n }\n }\n\n & > .model-bottom {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n }\n }\n }\n\n &#ollama-setup {\n & > .settings-section-title {\n /* Theme dependent */\n color: rgba(255, 54, 34, 1);\n }\n & > .settings-section-desc {\n border-left: 4px solid;\n\n border-radius: 6px;\n padding: 10px;\n\n /* Theme dependent */\n border-left-color: rgba(255, 193, 7, 1);\n\n background: rgba(255, 193, 7, .125);\n\n color: rgba(225, 225, 225, 1);\n }\n }\n\n &.save {\n & > .save-settings-header {\n margin-bottom: 16px;\n }\n\n & > .save-settings-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .save-settings-card {\n border: 1px solid;\n border-radius: 12px;\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .5);\n box-shadow: 0 2px 12px rgba(0, 0, 0, .2);\n\n transition: border-color .3s ease, box-shadow .3s ease;\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n }\n\n & > .card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(50, 54, 66, .6),\n rgba(40, 43, 52, .6)\n );\n border-bottom: 1px solid rgba(255, 255, 255, .06);\n\n & > .card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 10px;\n\n font-size: 1.25em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(143, 163, 255, .15);\n }\n\n & > .card-header-content {\n flex: 1;\n\n & > .card-title {\n font-size: 1.1em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(232, 232, 232, 1);\n }\n\n & > .card-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n }\n }\n\n & > .card-toggle {\n flex-shrink: 0;\n }\n }\n\n & > .card-body {\n padding: 12px;\n\n & > .action-buttons-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n\n & > .action-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(46, 52, 66, .6);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .25);\n background: rgba(56, 62, 76, .7);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n }\n\n & > .action-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 8px;\n\n font-size: 1.15em;\n flex-shrink: 0;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n\n & > .action-card-content {\n flex: 1;\n\n & > .action-card-title {\n font-size: .95em;\n font-weight: 600;\n margin-bottom: 1px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .action-card-desc {\n font-size: .85em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n &.export-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .2),\n rgba(56, 142, 60, .2)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.import-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .5);\n background: rgba(76, 175, 80, .1);\n\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .3),\n rgba(56, 142, 60, .3)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n }\n\n &.reset-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .2),\n rgba(183, 28, 28, .2)\n );\n color: rgba(211, 47, 47, 1);\n }\n }\n }\n }\n\n & > .status-message {\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n animation: scale-in .3s ease;\n\n &.hidden {\n display: none;\n }\n\n & > .status-content {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n & > .status-icon {\n font-size: 1.25em;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n & > .status-text {\n flex: 1;\n\n & > .status-title {\n font-size: .95em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(240, 240, 240, 1);\n }\n\n & > .status-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(210, 210, 210, 1);\n }\n }\n }\n\n &.success {\n /* Theme dependent */\n border: 1px solid rgba(76, 175, 80, .4);\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .15),\n rgba(56, 142, 60, .1)\n );\n box-shadow: 0 4px 16px rgba(76, 175, 80, .2);\n\n & > .status-content > .status-icon {\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.error {\n /* Theme dependent */\n border: 1px solid rgba(211, 47, 47, .4);\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .15),\n rgba(183, 28, 28, .1)\n );\n box-shadow: 0 4px 16px rgba(211, 47, 47, .2);\n\n & > .status-content > .status-icon {\n color: rgba(211, 47, 47, 1);\n }\n }\n\n &.info {\n /* Theme dependent */\n border: 1px solid rgba(255, 193, 7, .4);\n background: linear-gradient(135deg,\n rgba(255, 193, 7, .15),\n rgba(255, 152, 0, .1)\n );\n box-shadow: 0 4px 16px rgba(255, 193, 7, .2);\n\n & > .status-content > .status-icon {\n color: rgba(255, 193, 7, 1);\n }\n }\n }\n\n & > .import-textarea {\n width: 100%;\n min-height: 140px;\n\n border: 2px solid;\n\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n font-family: 'Courier New', Consolas, monospace;\n font-size: .88em;\n line-height: 1.6;\n\n resize: vertical;\n\n animation: scale-in .3s ease;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n background: rgba(20, 23, 32, .8);\n color: rgba(220, 220, 220, 1);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3);\n\n &:focus {\n outline: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .6);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3),\n 0 0 0 3px rgba(143, 163, 255, .15);\n }\n\n &.hidden {\n display: none;\n }\n\n &::placeholder {\n /* Theme dependent */\n color: rgba(130, 130, 130, 1);\n }\n }\n }\n }\n }\n }\n\n .list-container {\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border: 1px solid;\n\n border-radius: 8px;\n margin-bottom: 8px;\n padding: 8px;\n padding-left: 15px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n &.empty {\n padding: 20px;\n\n text-align: center;\n\n opacity: .6;\n }\n\n & > div {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n a > {\n font-weight: 600;\n word-break: break-all;\n }\n\n & > span {\n font-size: .85em;\n\n opacity: .7;\n }\n\n & > .add-action-button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n\n border-radius: 6px;\n\n font-size: 1em;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n\n &.remove-button {\n /* Theme dependent */\n background: rgba(211, 47, 47, .1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(211, 47, 47, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(211, 47, 47, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n }\n }\n }\n }\n }\n\n .settings-compact-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 18px;\n\n margin-bottom: 25px;\n }\n\n .draggable-order-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n\n &.is-dragging .draggable-order-item {\n pointer-events: none;\n\n &:hover {\n transform: none;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: none;\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n opacity: .5;\n\n color: inherit;\n }\n }\n }\n\n & > .draggable-order-item-wrapper {\n position: relative;\n\n transition: transform .2s cubic-bezier(0.2, 0, 0, 1);\n\n &.dragging {\n z-index: 4;\n\n &::after {\n content: '';\n\n width: 100%;\n height: 100%;\n\n border: 2px dashed;\n\n border-radius: 10px;\n\n position: absolute;\n top: 0;\n left: 0;\n\n pointer-events: none;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4),\n inset 0 0 20px rgba(102, 126, 234, .15);\n\n background: rgba(102, 126, 234, .1);\n }\n\n & > .draggable-order-item {\n visibility: hidden;\n }\n }\n }\n\n .draggable-order-item {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 10px;\n padding: 14px 18px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n content: '\\f0c9';\n\n font-family: 'Font Awesome 6 Free';\n font-size: .9em;\n font-weight: 900;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n color .2s ease;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 6px 24px rgba(0, 0, 0, .4);\n\n background: rgba(50, 54, 66, .9);\n\n &::before {\n opacity: .8;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n &:active {\n cursor: grabbing;\n\n transform: scale(1.02);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n box-shadow: 0 8px 32px rgba(102, 126, 234, .3);\n\n background: rgba(60, 65, 80, .95);\n }\n\n &.disabled {\n opacity: .5;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .05);\n\n background: rgba(30, 32, 38, .6);\n\n & > .draggable-order-item-name {\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .draggable-order-item-toggle {\n /* Theme dependent */\n background: rgba(80, 80, 80, .5);\n\n &::before {\n transform: translateX(0);\n\n /* Theme dependent */\n background: rgba(120, 120, 120, 1);\n }\n }\n\n &:hover {\n opacity: .7;\n\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n }\n }\n\n & > .draggable-order-item-name {\n flex: 1;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(230, 230, 230, 1);\n }\n\n & > .draggable-order-item-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 44px;\n height: 24px;\n\n border-radius: 100vh;\n\n position: relative;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 75, 162, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .3);\n\n &::before {\n content: '';\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n position: absolute;\n top: 3px;\n left: 3px;\n\n transform: translateX(20px);\n\n transition: transform .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, .2);\n }\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5);\n }\n }\n }\n }\n }\n }\n }\n }\n\n select, input:not([type=range]), textarea, button {\n border: 1px solid transparent;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-family: inherit;\n font-size: inherit;\n color: var(--color, inherit);\n\n transition: border .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 8px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .3), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .9);\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .4), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), 1);\n }\n &:not(input, textarea):active {\n /* Theme dependent */\n box-shadow: 0 1px 4px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .2), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .95);\n }\n\n &[type=number] {\n -moz-appearance: textfield;\n appearance: textfield;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n appearance: none;\n\n margin: 0;\n }\n }\n }\n\n button {\n cursor: pointer !important;\n\n &:hover {\n transform: translateY(-2px);\n }\n &:active {\n transform: translateY(0);\n }\n }\n\n duration-input {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n font-family: inherit;\n font-size: .9em;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n background: rgba(40, 43, 52, .7);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n background: rgba(40, 43, 52, .85);\n }\n\n & > .infinity-label {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 10px 14px;\n\n font-weight: 500;\n font-size: .95em;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(220, 220, 220, 1);\n background: rgba(35, 38, 48, .6);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2);\n\n &::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n\n position: absolute;\n top: 50%;\n right: 12px;\n\n font-size: 13px;\n line-height: 1;\n\n opacity: 0;\n transform: translateY(-50%) scale(0);\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n & > span {\n flex: 1;\n letter-spacing: .3px;\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(45, 48, 58, .8);\n box-shadow: 0 3px 10px rgba(0, 0, 0, .3);\n }\n\n &.selected {\n border-color: rgba(102, 126, 234, .5);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .2) 0%,\n rgba(118, 75, 162, .2) 100%\n );\n box-shadow: 0 3px 12px rgba(102, 126, 234, .25),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n &::after {\n opacity: 1;\n transform: translateY(-50%) scale(1);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .6);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25) 0%,\n rgba(118, 75, 162, .25) 100%\n );\n box-shadow: 0 4px 16px rgba(102, 126, 234, .35),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n }\n }\n }\n\n & > .duration-inputs {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n\n opacity: 1;\n transform: scale(1);\n\n transition: opacity .2s ease,\n transform .2s cubic-bezier(.4, 0, .2, 1);\n\n & > label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n\n & > span {\n font-size: .75em;\n font-weight: 600;\n letter-spacing: .5px;\n text-align: center;\n text-transform: uppercase;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .85);\n }\n\n & > input {\n cursor: text;\n\n width: 100%;\n\n border: 1px solid;\n border-radius: 6px;\n padding: 8px 10px;\n\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: .95em;\n font-weight: 500;\n text-align: center;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(230, 230, 230, 1);\n background: rgba(30, 33, 42, .9);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n\n &::placeholder {\n color: rgba(150, 154, 170, .6);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(35, 38, 48, 1);\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &:focus {\n outline: none;\n border-color: rgba(102, 126, 234, .6);\n background: rgba(40, 43, 52, 1);\n box-shadow: 0 0 0 2px rgba(102, 126, 234, .2),\n 0 2px 10px rgba(102, 126, 234, .15),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n }\n }\n\n &:has(.infinity-label.selected) > .duration-inputs {\n opacity: .4;\n transform: scale(.98);\n pointer-events: none;\n }\n }\n\n #reset-statistics-button {\n float: right;\n\n font-size: 1rem;\n\n /* Theme dependent */\n --background: 211, 51, 51;\n }\n\n #settings-ollama-refresh-models {\n float: right;\n\n font-size: 1rem;\n }\n }\n\n .ws-username-highlight {\n position: relative;\n\n &::before {\n content: \"\";\n\n pointer-events: none;\n\n position: absolute;\n inset: 0;\n\n border-radius: 10px;\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n }\n }\n}"},4192(e,t){function n(){return crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}Object.defineProperty(t,"__esModule",{value:!0}),t.generateRandomUUID=function(){return 0===s.length?n():s.pop()};const s=[];"function"==typeof requestIdleCallback&&requestIdleCallback(function e(){s.length<256&&s.push(n()),requestIdleCallback(e)})},4041(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.CreateDOMElement=function(e,t={}){const n=document.createElement(e);"id"in t&&(n.id=t.id);"class"in t&&(n.className=t.class);"text"in t&&(n.textContent=t.text);"html"in t&&(n.innerHTML=t.html);"content"in t&&n.append(t.content);"value"in t&&(n.value=t.value);if("attributes"in t)for(const[e,s]of Object.entries(t.attributes||{}))n.setAttribute(e,s);if("dataset"in t)for(const[e,s]of Object.entries(t.dataset||{}))n.dataset[e]=s;if("style"in t)for(const[e,s]of Object.entries(t.style||{}))n.style.setProperty(e,s);return n}},5643(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.fullTrim=void 0;t.fullTrim=e=>{const t=e.split("\n"),n=t.length;let s=!0,i=1/0,a=[],r=[];for(let e=0;e<n;e++){const n=t[e];if(""===n.trim()){if(s)continue;a.push("")}else{s?s=!1:(r=r.concat(a),a=[]);const e=n.match(/^(\s*)/)[0].length;i=Math.min(i,e),r.push(n)}}const o=r.length;if(0===o)return"";const l=[];for(let e=0;e<o;e++){const t=r[e].trimEnd();""===t?l.push(""):l.push(t.slice(i))}return l.join("\n")}},2852(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Memory=void 0;t.Memory=class{constructor(e={}){this.order=[],this.store=new Map,this.timeouts=new Map,"timeout"in e&&(this.timeout=e.timeout),"size"in e&&(this.maxSize=e.size)}clear(){this.order=[],this.store.clear(),this.timeouts.clear()}has(e){return this.store.has(e)}get(e){return this.store.get(e)}set(e,t){const n=this.order.indexOf(e);-1!==n&&this.order.splice(n,1),this.order.push(e),this.store.set(e,t),this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e)),void 0!==this.timeout&&this.timeouts.set(e,setTimeout(()=>{this.delete(e)},this.timeout)),void 0!==this.maxSize&&this.store.size>this.maxSize&&this.delete(this.order.shift())}add(e){this.store.has(e)||this.set(e,!0)}delete(e){const t=this.order.indexOf(e);-1!==t&&this.order.splice(t,1),this.store.delete(e),clearTimeout(this.timeouts.get(e)),this.timeouts.delete(e)}size(){return this.store.size}}},2595(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Stack=void 0;t.Stack=class{constructor(e=50){this.items=[],this.maxSize=e}push(e){this.items.push(e),this.items.length>this.maxSize&&this.items.shift()}pop(){return this.items.pop()}unshift(e){this.items.unshift(e),this.items.length>this.maxSize&&this.items.pop()}shift(){return this.items.shift()}peek(){return this.items[this.items.length-1]}clear(){this.items=[]}get length(){return this.items.length}set length(e){this.items.length=Math.min(e,this.maxSize)}}},6873(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Trie=void 0;var s=n(4192);function i(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function a(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var r=new WeakSet;function o(e){var t;this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e)),this.timeouts.delete(e);const n=this.order[e];delete this.order[e];const s=[{children:this.store}];let i=this.store;for(const e of n){const t=i.get(e);s.push(t),i=t.children}const a=s.pop();if(a.defined=!1,delete a.value,!((null===(t=a.children)||void 0===t?void 0:t.size)>0))for(let e=s.length-1;e>=0;e--){const t=s[e],i=n.pop();if(t.children.delete(i),t.children.size>0||t.defined)break;t.terminal=!0,delete t.children}}t.Trie=class{constructor(e={}){i(this,r),this.order={},this.store=new Map,this.timeouts=new Map,"timeout"in e&&(this.timeout=e.timeout),"size"in e&&(this.maxSize=e.size)}clear(){this.order={},this.store.clear(),this.timeouts.clear()}has(...e){var t;const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return!1;const e=s.get(t);if(e.terminal)return!1;s=e.children}return!0===(null===(t=s.get(n))||void 0===t?void 0:t.defined)}get(...e){var t;const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.value}set(...e){var t;const n=e.pop();let i=((e,t)=>{const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.UUID})(e);delete this.order[i],void 0===i&&(i=(0,s.generateRandomUUID)());const l=e.pop();let d=this.store;for(const t of e)if(d.has(t)){var c;const e=d.get(t);e.terminal=!1,null!==(c=e.children)&&void 0!==c||(e.children=new Map),d=e.children}else{const e={defined:!1,terminal:!1,children:new Map};d.set(t,e),d=e.children}const u=null!==(t=d.get(l))&&void 0!==t?t:{terminal:!0};u.UUID=i,u.defined=!0,u.value=n,d.set(l,u),this.order[i]=e.concat([l]),this.timeouts.has(i)&&clearTimeout(this.timeouts.get(i)),void 0!==this.timeout&&this.timeouts.set(i,setTimeout(()=>{a(r,this,o).call(this,i)},this.timeout)),void 0!==this.maxSize&&Object.keys(this.order).length>this.maxSize&&a(r,this,o).call(this,this.order.shift())}add(e){this.store.has(e)||this.set(e,!0)}delete(...e){const t=((e,t)=>{const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.UUID})(e);void 0!==t&&a(r,this,o).call(this,t)}size(){return Object.keys(this.order).length}}},4551(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.truncate=function(e,t){return e.length>t?`${e.substring(0,t-3).trimEnd()}...`:e}},1289(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.convertToUTCString=void 0;t.convertToUTCString=e=>`${e.getUTCFullYear().toString().padStart(4,"0")}-${(e.getUTCMonth()+1).toString().padStart(2,"0")}-${e.getUTCDate().toString().padStart(2,"0")}T${e.getUTCHours().toString().padStart(2,"0")}:${e.getUTCMinutes().toString().padStart(2,"0")}:${e.getUTCSeconds().toString().padStart(2,"0")}`},8678(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Ollama=t.AI=void 0;var s=n(4018),i=n(5643);function a(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o=new WeakSet;class l{static registerProvider(e,t){l.providers[e]=t}setup(e,t){if(this.analysis[e].has(t.id)){const n=this.analysis[e].get(t.id);return n.count++,n.request}const n=new AbortController,s=this.fetch(e,t,n.signal);return this.analysis[e].set(t.id,{request:s,abortController:n,count:1}),s.finally(()=>{this.analysis[e].delete(t.id)}),s}async fetch(e,t,n){return{error:"No service has been selected"}}constructor(e,t){a(this,o),r(this,"analysis",{edit:new Map,username:new Map}),r(this,"cache",{username:new Set}),r(this,"analyze",{edit:e=>this.setup("edit",e),username:e=>this.cache.username.has(e.user.name)?Promise.resolve({flag:!1,confidence:1,issues:[],explanation:"Username previously analyzed."}):(this.cache.username.add(e.user.name),this.setup("username",e))}),r(this,"cancel",{all:(e=!0)=>{if(!0===e)for(const e of Object.keys(this.analysis))for(const n of null===(t=this.analysis[e])||void 0===t?void 0:t.keys()){var t;this.cancel[e](n)}else for(const t of null===(n=this.analysis[e])||void 0===n?void 0:n.keys()){var n;this.cancel[e](t)}},edit:e=>{const t=this.analysis.edit.get(e);t&&(t.count--,t.count<=0&&(t.abortController.abort("Edit analysis canceled by user"),this.analysis.edit.delete(e)))},username:e=>{const t=this.analysis.username.get(e);t&&(t.count--,t.count<=0&&(t.abortController.abort("Username analysis canceled by user"),this.analysis.username.delete(e)))}}),r(this,"prompt",{edit:async e=>{var t,n;const a=function(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}(o,this,d).call(this,e.diff),r=null!==(t=s.namespaces.find(t=>t.id===e.ns))&&void 0!==t?t:s.namespaces[0];let l="registered";e.user.temp?l="temporary (unregistered)":e.user.ip&&(l="IP (unregistered)");const c=e.page.categories.join(", ")||"(none)",u=e.page.categories.some(e=>/living people/i.test(e));return(0,i.fullTrim)(`\nYou are an automated Wikipedia item reviewer. Analyze the following item and determine whether the CHANGES INTRODUCED violate Wikipedia policy.\n\nCRITICAL: You are evaluating what this item CHANGED, not the page content before it. The diff shows removed lines (prefixed "-") and added lines (prefixed "+"). Only ADDED content can be a new violation. Removing bad content is a GOOD item. Adding references, citations, and sources is GOOD — it improves verifiability, not the opposite.\n\nitem CONTEXT:\n- Page: "${e.page.title}" (${r.name} namespace)\n- Categories: ${c}${u?"\n- ⚠ BLP: This page is about a living person. Unsourced negative claims are a serious concern.":""}\n- User: "${e.user.name}" (${l}, warning level: ${e.user.warning}/4)\n- ORES vandalism probability: ${(100*e.ores).toFixed(0)}%\n- Size change: ${e.sizediff>0?"+":""}${e.sizediff} bytes\n- Flagged minor: ${e.minor?"yes":"no"}\n- Summary: ${e.comment||"(empty)"}\n- Tags: ${(null===(n=e.tags)||void 0===n?void 0:n.join(", "))||"(none)"}\n\nWHAT TO CHECK:\n1. VANDALISM: Does the item add nonsense, profanity as attacks, hoaxes, blanking, or deliberate misinformation? (WP:VANDALISM)\n2. NPOV: Does the item add clearly biased or one-sided language that is not presented neutrally? (WP:NPOV)\n3. VERIFIABILITY: Does the item add claims that are extraordinary or contentious WITHOUT any sourcing? Note: adding "<ref>" tags, URLs, or citation templates is adding sources — this is the OPPOSITE of a verifiability problem. (WP:V)\n4. ORIGINAL RESEARCH: Does the item add novel analysis, synthesis, or unpublished interpretation not attributable to any source? Simply adding text IS NOT original research if it restates commonly known facts or is sourced. Adding citations is NEVER original research. (WP:NOR)\n5. BLP: If this is a BLP article, does the item add unsourced or poorly-sourced negative material about the subject? (WP:BLP)\n\nWHAT IS NOT A VIOLATION:\n- Adding references, citations, "<ref>" tags, or URLs (this IMPROVES the article)\n- Removing vandalism or bad content\n- Fixing grammar, spelling, formatting, or wikilinks\n- Content about controversial topics written in a neutral, encyclopedic tone\n- Wikipedia is NOT censored — explicit content on appropriate pages is allowed (WP:NOTCENSORED)\n- Absent or auto-generated item summaries (e.g. "/* Section name */") are normal, not violations\n- ORES scores and warning levels are hints — do NOT treat them as evidence by themselves\n\nASSESSMENT SCALE:\n- "Good": No policy issues. Normal constructive item.\n- "Review": Minor concerns; a human should glance at it.\n- "Suspicious": Likely problematic; warrants close scrutiny.\n- "Bad": Clear policy violation.\n\nWhen in doubt between two ratings, choose the LESS severe one. Most items on Wikipedia are constructive — reflect that in your assessments.\n\nFor issues, use short policy codes (e.g. "WP:VANDALISM", "WP:NPOV", "WP:BLP"). Keep your explanation to 1-3 sentences.\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: <b>Clear vandalism</b> — added <code>lol hacked</code> which violates <i>WP:VANDALISM</i>.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n\nDIFF:\n${a}\n`)},username:async e=>{var t;return(0,i.fullTrim)(`\nYou are an automated Wikipedia username policy reviewer. Determine whether the username below violates Wikipedia's username policy.\n\nUSERNAME: ${e.user.name}\nPAGE CONTEXT: ${(null===(t=e.page)||void 0===t?void 0:t.title)||"(unknown)"}\n\nThe page context is provided ONLY to check for potential conflict-of-interest (e.g. a user named "AcmeCorp" iteming the Acme Corporation article). A controversial page topic does NOT make the username problematic.\n\nVIOLATION CATEGORIES (flag ONLY if the username clearly and unambiguously fits one):\n\n1. Offensive — The name is unambiguously profane, threatening, sexually explicit, or promotes vandalism. Merely edgy, weird, or humorous names do NOT qualify. (WP:U#OFFENSIVE)\n2. Disruptive — The name clearly declares intent to disrupt or vandalize (e.g. "I Will Vandalize"). (WP:U#DISRUPTIVE)\n3. Libelous — The name makes a clearly false or disparaging claim about a specific real person, or reveals private personal information. (WP:U#LIBEL)\n4. Misleading — The name impersonates a specific real person, or falsely claims special permissions by including terms like "admin", "sysop", "bureaucrat", "checkuser". (WP:U#MISLEADING)\n5. Promotional — The name is a URL or email address whose clear purpose is advertising or revenue. Containing a brand name alone is NOT enough. (WP:U#PROMO)\n6. Shared — The name unambiguously represents a company, organization, or role rather than an individual (e.g. "XYZ Foundation", "Secretary of ABC"). Names like "JohnAtAcme" or "AcmeFan123" are fine — they clearly identify an individual. (WP:U#SHARED)\n\nDECISION RULES:\n- Flag ONLY clear, unambiguous violations. Borderline = no flag.\n- Numbers at the end of a username (e.g. "itemor2847", "WikiFan99") are completely normal and NOT a violation of any kind.\n- Creative, odd, humorous, or meaningless usernames are NOT violations.\n- Containing a real word that could be offensive in some context is NOT enough — the name must be clearly and intentionally offensive.\n- When in doubt: do NOT flag. Set flag to false.\n- If not flagging, set explanation to "No violation."\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: Username contains <code>sysop</code> which falsely implies <i>WP:U#MISLEADING</i> permissions.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n`)}}),this.ws=e,this.settings=e.store.settings.AI,this.config=t}async test(){return!1}async models(){return[]}}function d(e){var t;const n=document.createElement("div");n.innerHTML=e;const s=[];for(const e of n.querySelectorAll("tr")){const t=e.querySelector(".diff-deletedline"),n=e.querySelector(".diff-addedline"),i=e.querySelector(".diff-context");t&&s.push(`- ${t.textContent.trim()}`),n?s.push(`+ ${n.textContent.trim()}`):i&&s.push(` ${i.textContent.trim()}`)}return s.length>0?s.join("\n"):(null===(t=n.textContent)||void 0===t?void 0:t.trim())||""}t.AI=l,r(l,"providers",{});const c={type:"object",properties:{issues:{type:"array",items:{type:"object",properties:{policy:{type:"string"},severity:{type:"string",enum:["Low","Medium","High","Critical"]}},required:["policy","severity"]}},explanation:{type:"string"},assessment:{type:"string",enum:["Good","Review","Suspicious","Bad"]},confidence:{type:"number",minimum:0,maximum:1}},required:["assessment","confidence","issues","explanation"]},u={type:"object",properties:{issues:{type:"array",items:{type:"object",properties:{policy:{type:"string",enum:["Offensive","Disruptive","Libelous","Misleading","Promotional","Shared"]},severity:{type:"string",enum:["Low","Medium","High","Critical"]}},required:["policy","severity"]}},explanation:{type:"string"},flag:{type:"boolean"},confidence:{type:"number",minimum:0,maximum:1}},required:["flag","confidence","issues","explanation"]};class p extends l{async test(){try{return(await fetch(`${this.config.server}/api/version`,{method:"GET"})).ok}catch(e){return!1}}async models(){try{const e=await fetch(`${this.config.server}/api/tags`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);return(await e.json()).models||[]}catch(e){throw e}}async fetch(e,t,n=null){try{const s=this.prompt[e](t),i={method:"POST",headers:{"Content-Type":"application/json"}},a={model:this.config.model,prompt:await s,stream:!1,options:{temperature:.1,top_p:.9,num_predict:1024},format:"edit"===e?c:u};let r;i.body=JSON.stringify(a),n&&(i.signal=n);try{if(r=await fetch(`${this.config.server}/api/generate`,i),!r.ok)throw new Error(`Ollama API error: ${r.status} ${r.statusText}`);const e=await r.json();if(!e.response)throw new Error("Empty response from Ollama");return JSON.parse(e.response)}catch(e){return{error:e.message||"Ollama request failed"}}}catch(e){return{error:e.message||"Ollama request failed"}}}}t.Ollama=p,l.registerProvider("Ollama",p)},8169(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.AudioManager=void 0;var s=n(4192),i=n(1258);const a={startup:{type:"sound",title:"Startup Sound",description:"Sound played when WikiShield starts up.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/startup.wav"},music:{type:"category",title:"Music",description:"Background music tracks.",volume:1,properties:{zen_mode:{type:"sound",title:"Zen Mode",description:"Background audio played in Zen mode.",volume:1,data:"custom://zen_mode",preview:!1}}},ui:{type:"category",title:"User Interface Sounds",description:"Sounds used for user interface interactions.",volume:1,properties:{click:{type:"sound",title:"Click Sound",description:"Sound played when clicking on interface elements.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/click.wav"}}},queue:{type:"category",title:"Queue Sounds",description:"Sounds played for queue events.",volume:1,properties:{ores:{type:"sound",title:"ORES Alert",description:"Sound played due to a high ORES score.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/ores.wav"},mention:{type:"sound",title:"Mention Alert",description:"Sound played when your username is mentioned in an edit.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/mention.wav"}}},notification:{type:"category",title:"Notification Sounds",description:"Sounds played for various notifications.",volume:1,properties:{alert:{type:"sound",title:"Alert Sound",description:"Sound played for alerts.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/alert.wav"},message:{type:"sound",title:"Message Sound",description:"Sound played for messages.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/message.wav"},toast:{type:"sound",title:"Toast Sound",description:"Sound played for toast notifications.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/toast.wav"}}},action:{type:"category",title:"Action Sounds",description:"Sounds played for various user actions.",volume:1,properties:{default:{type:"sound",title:"Default Action Sound",description:"Sound played for default actions.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/action.wav"},failed:{type:"sound",title:"Failed Action Sound",description:"Sound played when an action fails.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/failed.wav"},report:{type:"sound",title:"Report Action Sound",description:"Sound played for report actions.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/report.wav"}}}};t.AudioManager=class{constructor(e){this.ws=e,this.audio=a,this.soundEffects=new Map,this.previews=new Map,this.previewing=!1}async init(){this.zengine=new i.Zengine,this.zengine.debug=this.ws.__DEV__,await this.zengine.init(),this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"])}async playSound(e,t,n=!1,i){if(!n){const e=this.ws.store.settings.zen_mode;if(e.enabled&&!e.sound.enabled)return}const a=this.getSound(e);if(!a||!a.data)return;const r=this.getVolume(e),o=new Audio(a.data);o.volume=!n&&this.previewing?0:r,"mediaSession"in navigator&&(navigator.mediaSession.setActionHandler("play",()=>{}),navigator.mediaSession.setActionHandler("pause",()=>{}),navigator.mediaSession.setActionHandler("previoustrack",()=>{}),navigator.mediaSession.setActionHandler("nexttrack",()=>{}));const l=(0,s.generateRandomUUID)();n&&(this.muteId=l,this.previewing=!0,this.stopPreviews(),this._muteAll(),this.previews.set(o,e)),this.soundEffects.set(o,e);const d=new Promise((e,t)=>{o.resolve=e,o.reject=t});o.onended=()=>{o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))},o.onerror=()=>{o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))};let c=!1;return o.onplay=()=>{c||(c=!0,i&&i())},null==t||t.addEventListener("abort",()=>{o.pause(),o.src="",o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))}),o.play(),d}async previewSound(e){const t=this.getSound(e);if(!t||!t.data)return;this._muteAll();const n=new Audio(t.data);n.volume=this.getVolume(e),this.previews.set(n,e);const s=()=>{this.previews.delete(n),0===this.previews.size&&this._unmuteAll()};n.onended=s,n.onerror=s,await n.play()}stopPreviews(){for(const e of this.previews.keys())e.resolve(),e.pause(),e.onended=null,e.onerror=null,e.src="";this.previews.clear(),this._unmuteAll()}onvolumechanged(){if(this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"]),this.previewing)for(const[e,t]of this.previews.entries()){const n=this.getVolume(t);e.volume=n}else for(const[e,t]of this.soundEffects.entries()){const n=this.getVolume(t);e.volume=n}}_muteAll(){for(const e of this.soundEffects.keys())e.volume=0}_unmuteAll(){for(const[e,t]of this.soundEffects.entries())e.volume=this.getVolume(t)}getSound(e){let t={type:"category",properties:this.audio};for(const n of e){if("category"!==t.type)return null;if(t=t.properties[n],!t)return null}return t}getVolume(e){const t=this.ws.store.settings.audio.volume;let n=t.master,s={type:"category",properties:this.audio};const i=["master"];for(const a of e){if(i.push(a),"category"!==s.type)return n;if(s=s.properties[a],!s)break;const e=t[i.join(".")];void 0!==e&&(n*=e)}return n}}},1258(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Zengine=void 0;class n{constructor(){this.audioContext=null,this.masterGain=null,this.isPlaying=!1,this.debug=!1,this.layers={bass:{oscillators:[],gains:[],compressor:null},pad:{oscillators:[],gains:[],filter:null,reverb:null}},this.nextChordTimeout=null,this.baseFrequency=65.41,this.currentKey=0,this.chordLibrary={maj7:{bass:[0],pad:[0,7,11,16,19],tension:.1},min7:{bass:[0],pad:[0,7,10,15,19],tension:.15},maj9:{bass:[0],pad:[0,7,11,14,19],tension:.12},min9:{bass:[0],pad:[0,7,10,14,19],tension:.18},sus2:{bass:[0],pad:[0,7,12,14,19],tension:.25},sus4:{bass:[0],pad:[0,7,12,17,19],tension:.28},add9:{bass:[0],pad:[0,7,14,16,21],tension:.15},madd9:{bass:[0],pad:[0,7,14,15,21],tension:.2},openvoice:{bass:[0],pad:[0,7,12,19,24],tension:.08},"6add9":{bass:[0],pad:[0,7,9,14,19],tension:.18}},this.chordCompatibility={maj7:["maj9","min7","sus2","add9","openvoice","6add9"],min7:["maj7","min9","sus4","madd9","openvoice"],maj9:["maj7","add9","sus2","6add9","openvoice"],min9:["min7","madd9","sus2","maj9"],sus2:["maj7","maj9","add9","openvoice","sus4"],sus4:["maj7","sus2","min7","openvoice"],add9:["maj9","sus2","maj7","openvoice","6add9"],madd9:["min9","min7","add9","sus2"],openvoice:["sus2","maj7","add9","maj9"],"6add9":["maj7","maj9","add9","sus2"]},this.currentChordName="maj7",this.currentTension=.1}init(){this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGain=this.audioContext.createGain(),this.masterGain.connect(this.audioContext.destination),this.masterGain.gain.value=.2,this.setupLayerEffects())}async start(){this.isPlaying||(this.init(),"suspended"===this.audioContext.state&&await this.audioContext.resume(),this.isPlaying=!0,this.currentKey=Math.floor(12*Math.random()),this.playNextChord())}setupLayerEffects(){const e=this.audioContext.createDynamicsCompressor();e.threshold.value=-30,e.knee.value=40,e.ratio.value=12,e.attack.value=.003,e.release.value=.25,e.connect(this.masterGain),this.layers.bass.compressor=e;const t=this.audioContext.createBiquadFilter();t.type="lowpass",t.frequency.value=1200,t.Q.value=.5;const n=this.audioContext.createDelay(2);n.delayTime.value=.4;const s=this.audioContext.createGain();s.gain.value=.3,t.connect(n),n.connect(s),s.connect(t),t.connect(this.masterGain),this.layers.pad.filter=t,this.layers.pad.reverb={delay:n,gain:s}}playNextChord(){if(!this.isPlaying)return;const e=this.chooseNextChord(),t=this.currentChordName;if(this.currentChordName=e,this.currentTension=this.chordLibrary[e].tension,this.debug&&console.log("[MusicEngine] Chord changed",{from:t,to:e,tension:this.currentTension,key:this.currentKey,timestamp:this.audioContext.currentTime}),Math.random()<.08){const e=this.currentKey;this.currentKey=(this.currentKey+[2,5,7][Math.floor(3*Math.random())])%12,this.debug&&console.log("[MusicEngine] Key changed",{from:e,to:this.currentKey})}this.transitionToChord(e);const n=12e3+1e4*Math.random();this.nextChordTimeout=setTimeout(()=>this.playNextChord(),n)}chooseNextChord(){const e=this.chordCompatibility[this.currentChordName]||Object.keys(this.chordLibrary),t=e.map(e=>({name:e,weight:this.chordLibrary[e].tension<.2?2:1})),n=t.reduce((e,t)=>e+t.weight,0);let s=Math.random()*n;for(const e of t)if(s-=e.weight,s<=0)return e.name;return e[0]}transitionToChord(e){const t=this.chordLibrary[e];if(!t)return;const n=6+3*Math.random();["bass","pad"].forEach(e=>this.createLayer(e,t[e],n))}createLayer(e,t,n){if(null==t||!t.length)return;const s=this.audioContext.currentTime,i=this.layers[e];if(i.gains&&i.gains.length>0){const e=[...i.oscillators],t=[...i.gains];t.forEach(e=>{try{e.gain.cancelScheduledValues(s),e.gain.setValueAtTime(e.gain.value,s),e.gain.linearRampToValueAtTime(0,s+n)}catch(e){}}),setTimeout(()=>{e.forEach(e=>{try{e.stop(),e.disconnect()}catch(e){}}),t.forEach(e=>{try{e.disconnect()}catch(e){}})},1e3*n+100)}const a=[],r=[],o=[];t.forEach((t,l)=>{const d=this.baseFrequency*Math.pow(2,(this.currentKey+t)/12);o.push(d);const c=this.audioContext.createOscillator();c.type="bass"===e?"sine":"triangle",c.frequency.value=d,c.detune.value=6*(Math.random()-.5);const u=this.audioContext.createGain();u.gain.value=0,c.connect(u),"bass"===e&&i.compressor?u.connect(i.compressor):i.filter&&u.connect(i.filter),c.start(s),a.push(c),r.push(u);const p="bass"===e?.15:.08-.01*l;u.gain.setValueAtTime(0,s),u.gain.linearRampToValueAtTime(p,s+n)}),this.debug&&console.log("[MusicEngine] Layer created",{layer:e,frequencies:o,volumes:r.map(e=>e.gain.value),fadeDuration:n}),i.oscillators=a,i.gains=r}stop(){this.isPlaying=!1,this.nextChordTimeout&&clearTimeout(this.nextChordTimeout),this.debug&&console.log("[MusicEngine] Stopping music engine",{timestamp:this.audioContext.currentTime});const e=this.audioContext.currentTime;if(Object.values(this.layers).forEach(t=>{t.gains&&t.gains.forEach(t=>{try{t.gain.setValueAtTime(t.gain.value,e),t.gain.linearRampToValueAtTime(0,e+.5)}catch(e){}}),t.oscillators&&setTimeout(()=>{t.oscillators.forEach(e=>{try{e.stop(),e.disconnect()}catch(e){}}),t.oscillators=[],t.gains&&(t.gains.forEach(e=>{try{e.disconnect()}catch(e){}}),t.gains=[])},550)}),this.masterGain)try{this.masterGain.gain.setValueAtTime(this.masterGain.gain.value,e),this.masterGain.gain.linearRampToValueAtTime(0,e+.5)}catch(e){}}setMasterVolume(e){if(this.masterGain){const t=this.masterGain.gain.value;this.masterGain.gain.value=e,this.debug&&console.log("[MusicEngine] Master volume changed",{from:t,to:e})}}}t.Zengine=class{constructor(){this.audioContext=null,this.sounds=[],this.activeSounds=new Map,this.masterGainNode=null,this.isRunning=!1,this.currentEnvironment=null,this.eventLoopInterval=null,this.activityLevel=4,this.musicEngine=null,this.debug=!1}async init(){this.musicEngine=new n,this.musicEngine.init(),this.musicEngine.debug=this.debug;const e=await fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/bbc-sounds.json"),t=await e.json();return this.sounds=this.categorizeSounds(t),this.debug&&console.log("[Zengine] Initialized",{soundCount:this.sounds.length,categories:[...new Set(this.sounds.map(e=>e.category))]}),this.sounds.length}categorizeSounds(e){return e.map(e=>{var t;const n=(e.tags||[]).map(e=>e.toLowerCase()),s=(e.description||"").toLowerCase(),i=parseFloat((null===(t=e.technicalMetadata)||void 0===t?void 0:t.duration)||e.duration)||0,a=this.detectCategory(n,s),r=i>60?"ambient":i>15?"feature":"event";return{id:e.id,duration:i,description:e.description,category:a,role:r}})}detectCategory(e,t){const n=[...e,t].join(" ");return/rain|drizzle/i.test(n)?"rain":/ocean|sea|wave/i.test(n)?"ocean":/stream|river|water/i.test(n)?"water-flow":/wind|breeze/i.test(n)?"wind":/bird/i.test(n)?"bird":/cricket|insect/i.test(n)?"insect":"other"}generateEnvironment(){const e=[{name:"Gentle Rain",requiredAmbient:["rain"],commonCategories:["bird"],weather:"rain"},{name:"Ocean Shore",requiredAmbient:["ocean"],commonCategories:["bird","wind"],weather:"clear"},{name:"Forest Stream",requiredAmbient:["water-flow"],commonCategories:["bird","insect"],weather:"clear"}],t=e[Math.floor(Math.random()*e.length)];return this.debug&&console.log("[Zengine] Environment generated",{name:t.name,weather:t.weather,ambientRequirements:t.requiredAmbient,commonSounds:t.commonCategories}),t}getEnvironmentSounds(e){return{ambient:this.sounds.filter(t=>"ambient"===t.role&&e.requiredAmbient.includes(t.category)),events:this.sounds.filter(t=>"event"===t.role&&e.commonCategories.includes(t.category))}}async start(){this.isRunning||(0===this.sounds.length&&await this.init(),this.musicEngine.isPlaying||await this.musicEngine.start(),this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGainNode=this.audioContext.createGain(),this.masterGainNode.connect(this.audioContext.destination),this.masterGainNode.gain.value=.3),"suspended"===this.audioContext.state&&await this.audioContext.resume(),this.isRunning=!0,this.currentEnvironment=this.generateEnvironment(),this.debug&&console.log("[Zengine] Engine started",{environment:this.currentEnvironment.name,audioContextState:this.audioContext.state}),await this.startAmbientLayers(),this.startEventLoop())}async startAmbientLayers(){const e=this.getEnvironmentSounds(this.currentEnvironment),t=Math.min(e.ambient.length,2);for(let n=0;n<t;n++){const t=e.ambient[Math.floor(Math.random()*e.ambient.length)];this.activeSounds.has(t.id)||await this.playSound(t,"ambient",.35+.1*Math.random())}}startEventLoop(){this.eventLoopInterval=setInterval(()=>this.processEvents(),3e3),this.debug&&console.log("[Zengine] Event loop started")}async processEvents(){if(!this.isRunning)return;const e=this.getEnvironmentSounds(this.currentEnvironment);if(Array.from(this.activeSounds.values()).filter(e=>"ambient"!==e.role).length<this.activityLevel&&e.events.length>0&&Math.random()<.5){const t=e.events[Math.floor(Math.random()*e.events.length)];await this.playSound(t,"event",.12+.08*Math.random())}}async playSound(e,t,n){if(!this.activeSounds.has(e.id))try{const s=e.url||`https://sound-effects-media.bbcrewind.co.uk/mp3/${e.id}.mp3`,i=new Audio;i.crossOrigin="anonymous",i.src=s,i.preload="auto";const a=this.audioContext.createMediaElementSource(i),r=this.audioContext.createGain();r.gain.value=n,a.connect(r),r.connect(this.masterGainNode),this.activeSounds.set(e.id,{sound:e,audio:i,source:a,gainNode:r,role:t,volume:n}),this.debug&&console.log("[Zengine] Sound started playing",{soundId:e.id,description:e.description,role:t,volume:n,category:e.category,duration:e.duration,activeCount:this.activeSounds.size}),i.addEventListener("ended",()=>{this.removeSound(e.id),"ambient"===t&&this.isRunning&&setTimeout(()=>this.playSound(e,t,n),1e3)}),i.addEventListener("error",()=>this.removeSound(e.id)),await i.play()}catch(t){console.error("[Zengine] Sound error:",e.id,t)}}removeSound(e){const t=this.activeSounds.get(e);if(t){try{t.audio.pause(),t.gainNode.disconnect(),t.source.disconnect()}catch(e){}this.debug&&console.log("[Zengine] Sound removed",{soundId:e,description:t.sound.description,activeCount:this.activeSounds.size-1}),this.activeSounds.delete(e)}}stop(){this.musicEngine.isPlaying&&this.musicEngine.stop(),this.isRunning=!1,this.eventLoopInterval&&(clearInterval(this.eventLoopInterval),this.eventLoopInterval=null),this.debug&&console.log("[Zengine] Engine stopping",{activeSounds:this.activeSounds.size}),this.activeSounds.forEach((e,t)=>{try{e.audio.pause(),e.audio.currentTime=0}catch(e){}const n=this.audioContext.currentTime;e.gainNode.gain.cancelScheduledValues(n),e.gainNode.gain.setValueAtTime(e.gainNode.gain.value,n),e.gainNode.gain.linearRampToValueAtTime(0,n+.5),setTimeout(()=>this.removeSound(t),500)}),this.audioContext&&"running"===this.audioContext.state&&this.audioContext.suspend(),this.debug&&console.log("[Zengine] Engine stopped")}setMasterVolume(e){if(this.masterGainNode){const t=this.masterGainNode.gain.value;this.masterGainNode.gain.value=e,this.debug&&console.log("[Zengine] Master volume changed",{from:t,to:e,musicEngineVolume:.25*e})}this.musicEngine.setMasterVolume(.25*e)}}},870(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.conditions=void 0;var s=n(372);t.conditions={true:{title:"True",check:(e,t,n)=>!0},false:{title:"False",check:(e,t,n)=>!1},"account-admin":{title:"You are an admin",check:(e,t,n)=>!0===e.groups.sysop},"item-selected":{title:"An item is selected",check:(e,t,n)=>null!==t},"edit-selected":{title:"An edit is selected",check:(e,t,n)=>"edit"===s.Queue.groups[null==t?void 0:t.type]},"logevent-selected":{title:"A logentry is selected",check:(e,t,n)=>"logevent"===s.Queue.groups[null==t?void 0:t.type]},revertable:{title:"Current item is revertable",check:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"===s.Queue.groups[i]}},pending:{title:"Current item is pending review",check:(e,t,n)=>!!e.queue.pending.has(t.id)},"user-registered":{title:"Selected user is registered",check:(e,t,n)=>!1===t.user.anon},"user-ip":{title:"Selected user is an IP address",check:(e,t,n)=>!0===t.user.ip},"user-temp":{title:"Selected user is a temporary account",check:(e,t,n)=>!0===t.user.temp},"user-empty-talk":{title:"Selected user's talk page is empty",check:(e,t,n)=>void 0===t.user.talk},"user-blocked":{title:"Selected user is blocked",check:(e,t,n)=>!0===t.user.blocked},"user-edit-count":{title:"Selected user's edit count is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"count",title:"Edit count",type:"number",default:0}],check:(e,t,n)=>{const s=-1===t.user.editcount?1/0:t.user.editcount||0,i=Number(n.count);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"user-final-warning":{title:"Selected user at final warning level",check:(e,t,n)=>"4"===t.user.warning||"4im"===t.user.warning},"user-has-warnings":{title:"Selected user has no warnings",check:(e,t,n)=>"0"!==t.user.warning},"edit-pending":{title:"Edit is pending",check:(e,t,n)=>e.queue.pending.has(null==t?void 0:t.id)},"edit-minor":{title:"Edit is marked as minor",check:(e,t,n)=>!0===t.minor},"edit-size":{title:"Edit size is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"size",title:"Size",type:"number",default:0}],check:(e,t,n)=>{const s=t.sizediff||0,i=Number(n.size);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"abs-edit-size":{title:"Absolute edit size is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"size",title:"Size",type:"number",min:0,default:0}],check:(e,t,n)=>{const s=Math.abs(t.sizediff||0),i=Number(n.size);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"edit-ores-score":{title:"Edit ORES score is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"score",title:"Score",type:"number",min:0,max:1,default:0}],check:(e,t,n)=>{const s=t.ores_score||0,i=Number(n.score);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"user-highlighted":{title:"Selected user is highlighted",check:(e,t,n)=>e.store.highlight.users.has(t.user.name)},"user-whitelisted":{title:"Selected user is whitelisted",check:(e,t,n)=>e.store.whitelist.users.has(t.user.name)},"page-highlighted":{title:"Selected page is highlighted",check:(e,t,n)=>e.store.highlight.pages.has(t.page.title)},"page-whitelisted":{title:"Selected page is whitelisted",check:(e,t,n)=>e.store.whitelist.pages.has(t.page.title)},"page-watched":{title:"Selected page is watched",check:(e,t,n)=>!0===t.page.watched},"tag-highlighted":{title:"Selected edit has a highlighted tag",check:(e,t,n)=>{for(const n of t.tags)if(e.store.highlight.tags.has(n))return!0;return!1}},"tag-whitelisted":{title:"Selected edit has a whitelisted tag",check:(e,t,n)=>{for(const n of t.tags)if(e.store.whitelist.tags.has(n))return!0;return!1}},"in-recent-queue":{title:"In recent changes queue",check:(e,t,n)=>"recent"===e.queue.current.type},"in-pending-queue":{title:"In pending changes queue",check:(e,t,n)=>"pending"===e.queue.current.type},"in-user-queue":{title:"In user creations queue",check:(e,t,n)=>"users"===e.queue.current.type},"in-watchlist-queue":{title:"In watchlist queue",check:(e,t,n)=>"watchlist"===e.queue.current.type}}},9808(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.validateShortcut=t.controls=t.buildShortcut=void 0;const n=t.controls=new Set(["!","@","#","$","%","^","&","*","(",")","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","-","=","[","]","\\",";","'",",",".","/","_","+","{","}","|",":",'"',"<",">","?"," ","arrowleft","arrowup","arrowdown","arrowright"]);t.buildShortcut=e=>{const t=[];["ctrl","shift","alt"].forEach(n=>{e[`${n}Key`]&&t.push(n)});const s=e.key.toLowerCase();return n.has(s)&&t.push(s),t.join("+")};t.validateShortcut=e=>{const t=e.toLowerCase().split("+");if(0===t.length)return!1;const s=new Set;for(const e of t){if(s.has(e))return!1;if(s.add(e),"ctrl"!==e&&"shift"!==e&&"alt"!==e&&!n.has(e))return!1}return t.some(e=>"ctrl"!==e&&"shift"!==e&&"alt"!==e)}},985(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.events=void 0;var s=n(372),i=n(7054),a=n(955),r=n(863),o=n(5643);t.events={"next-item":{title:"Go to next item",icon:"fas fa-arrow-right",script:(e,t,n)=>(e.queue.next(),{valid:!0})},"previous-item":{title:"Go to previous item",icon:"fas fa-arrow-left",script:(e,t,n)=>(e.queue.previous(),{valid:!0})},"clear-queue":{title:"Clear queue",icon:"fas fa-trash-can",valid:(e,t,n)=>"pending"===e.queue.current.type?{valid:!1,reason:"Pending edits queue cannot be cleared."}:{valid:!0},script:(e,t,n)=>(e.queue.clear(e.queue.current.type),{valid:!0})},"next-queue":{title:"Go to next queue",icon:"fas fa-forward",script:(e,t,n)=>{const i=s.Queue.types.map(t=>({name:t,...e.store.settings.queue[t]}));i.sort((e,t)=>e.order-t.order);const a=i.findIndex(t=>t.name===e.queue.current.type);return e.queue.switch(i[(a+1)%i.length].name),{valid:!0}}},"previous-queue":{title:"Go to previous queue",icon:"fas fa-forward",script:(e,t,n)=>{const i=s.Queue.types.map(t=>({name:t,...e.store.settings.queue[t]}));i.sort((e,t)=>e.order-t.order);const a=i.findIndex(t=>t.name===e.queue.current.type);return e.queue.switch(i[(a-1+i.length)%i.length].name),{valid:!0}}},"accept-pending-edit":{title:"Accept pending edit",icon:"fas fa-check",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Accepting pending edit",valid:(e,t,n)=>e.rights.review?e.queue.pending.has(t.id)?{valid:!0}:{valid:!1,reason:"Pending edit can only be accepted when a pending edit is selected."}:{valid:!1,reason:"You do not have permission to review pending changes."},script:async(e,t,n)=>{const s=e.queue.pending.get(t.id);if(!s)return{valid:!1,reason:"Pending edit not found."};const i=`${s.count||""} pending revision${1===s.count?"":"s"}`,a=Object.entries(s.users||{}).map(t=>[e.api.user(t[0]),t[1]]);a.sort((e,t)=>t[1]-e[1]);const r=Math.max(a.reduce((e,t)=>{const n=t[0].length;return e[0]+n<=250?[e[0]+n,e[1]+1]:e},[0,0])[1],1);let o="";const l=a.length;if(l>r){const e=a.slice(0,r).map(e=>e[0]),t=l-e.length;o=`${e.join(", ")}, and ${t} other${1===t?"":"s"}`}else o=(e=>{switch(e.length){case 0:case 1:return e[0]||"";case 2:return`${e[0]} and ${e[1]}`;default:return`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`}})(a.map(e=>e[0]));return await e.api.acceptPendingEdit(t.pending.revid,e.api.summary(`Accepted ${i} by ${o}`,n.summary))},successful:(e,t,n)=>{e.store.statistics.pending_changes_reviewed.accepted++}},"reject-pending-edit":{title:"Reject pending edit",icon:"fas fa-xmark",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Rejecting pending edit",valid:(e,t,n)=>e.rights.review?e.queue.pending.has(t.id)?{valid:!0}:{valid:!1,reason:"Pending edit can only be rejected when a pending edit is selected."}:{valid:!1,reason:"You do not have permission to review pending changes."},script:async(e,t,n)=>{const s=e.queue.pending.get(t.id);if(!s)return{valid:!1,reason:"Pending edit not found."};const i=`${s.count||""} pending revision${1===s.count?"":"s"}`,a=Object.entries(s.users||{}).map(t=>[e.api.user(t[0]),t[1]]);a.sort((e,t)=>t[1]-e[1]);const r=Math.max(a.reduce((e,t)=>{const n=t[0].length;return e[0]+n<=250?[e[0]+n,e[1]+1]:e},[0,0])[1],1);let o="";const l=a.length;if(l>r){const e=a.slice(0,r).map(e=>e[0]),t=l-e.length;o=`${e.join(", ")}, and ${t} other${1===t?"":"s"}`}else o=(e=>{switch(e.length){case 0:case 1:return e[0]||"";case 2:return`${e[0]} and ${e[1]}`;default:return`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`}})(a.map(e=>e[0]));return await e.api.rejectPendingEdit(t.id,s.prior,t.page.title,e.api.summary(`Rejected ${i} by ${o} to [[Special:Diff/${s.prior}|last stable revision]]`,n.summary))},successful:(e,t,n)=>{e.store.statistics.pending_changes_reviewed.rejected++}},revert:{title:"Revert and auto warn/report",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]}],progress:"Reverting edit",valid:(e,t,n)=>{let i=t.type;if("abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i])return{valid:!1,reason:"Edit can only be reverted when an edit is selected."};return"summary"in(0,a.getWarningFromLookup)(n.warning)?{valid:!0}:{valid:!1,reason:"Selected warning template does not support reverting."}},script:async(e,t,n)=>{var r;const l=(0,a.getWarningFromLookup)(n.warning);if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Reverting yourself","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to revert their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to revert the edit on it?`)||null!==(r=t.tags)&&void 0!==r&&r.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to revert it?"))return{valid:!1,reason:"Revert cancelled by user."};const d=await(async()=>await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted edits by ${e.api.user(t.user.name)}`,l.summary)))();if(!d.valid)return d;switch(e.store.statistics.reverts_made.total++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}let c;const u=await(async()=>{const n=`User talk:${t.user.name}`,i=e.util.monthSectionName(),a=(await e.api.getPagesContent([n]))[n]||"",r=e.util.getPageSections(a);let o="new";const d=r.length;for(let e=0;e<d;e++)r[e].title===i&&(o=e+1);let u;c=e.queue.getWarningLevel(a),u="string"==typeof l.auto?l.auto:"function"==typeof l.auto?l.auto(t,c):l.auto[c];const p=l.templates.find(e=>e.name===u.toString());if(!p)return{valid:!0};let g="Message about ";"edit"===s.Queue.groups[t.type]?g+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?g+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:g+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:g+=`[[${t.page.title}]]`;let h="";h="new"===o?`{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)`:`${r[o-1].heading}\n${r[o-1].content}\n\n{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)`;const m=await e.api.editSection(n,o,i,h,e.api.summary(g,`${l.name} (${p.name})`));if(m.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(u)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,u),e.store.statistics.warnings_issued.total++,u){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return m})();if(!u.valid)return u;if(("4"===c||"4im"===c)&&l.reportable&&e.store.settings.auto_report.enabled&&e.store.settings.auto_report.for.has(n.warning)){if(!(await(async()=>await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}}))()).valid)return{valid:!0};e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}return{valid:!0}}},"warn-and-report":{title:"Auto warn/report",icon:"fas fa-exclamation-triangle",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]}],progress:"Warning user",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be warned when an item is selected."},script:async(e,t,n)=>{var r;const l=(0,a.getWarningFromLookup)(n.warning);if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Warning yourself","You are about to warn yourself. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to warn them?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`)||null!==(r=t.tags)&&void 0!==r&&r.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?"))return{valid:!1,reason:"Warn cancelled by user."};let d;const c=await(async()=>{const n=`User talk:${t.user.name}`,i=e.util.monthSectionName(),a=(await e.api.getPagesContent([n]))[n]||"",r=e.util.getPageSections(a);let o="new";const c=r.length;for(let e=0;e<c;e++)r[e].title===i&&(o=e+1);let u;d=e.queue.getWarningLevel(a),u="string"==typeof l.auto?l.auto:"function"==typeof l.auto?l.auto(t,d):l.auto[d];const p=l.templates.find(e=>e.name===u.toString());if(!p)return{valid:!0};let g="Message about ";"edit"===s.Queue.groups[t.type]?g+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?g+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:g+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:g+=`[[${t.page.title}]]`;let h="";h="new"===o?`{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)`:`${r[o-1].heading}\n${r[o-1].content}\n\n{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)`;const m=await e.api.editSection(n,o,i,h,e.api.summary(g,`${l.name} (${p.name})`));if(m.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(u)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,u),e.store.statistics.warnings_issued.total++,u){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return m})();if(!c.valid)return c;if(("4"===d||"4im"===d)&&l.reportable&&e.store.settings.auto_report.enabled&&e.store.settings.auto_report.for.has(n.warning)){if(!(await(async()=>await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}}))()).valid)return{valid:!0};e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}return{valid:!0}}},"warn-user":{title:"Warn user",icon:"fas fa-exclamation-triangle",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]},{dependencies:["warning"],id:"level",title:"Warning level",type:"choice",options:e=>["auto",...a.warningsLookup[e.warning].templates.filter(e=>void 0===e.generic).map(e=>e.name)],default:"auto"}],continuity:!0,progress:"Issuing warning to user",valid:(e,t,n)=>{var s;return t?"auto"!==n.level&&null===(null===(s=(0,a.getWarningFromLookup)(n.warning))||void 0===s?void 0:s.templates[n.level])?{valid:!1,reason:"Selected warning template does not support automatic level selection."}:{valid:!0}:{valid:!1,reason:"User can only be warned when an item is selected."}},script:async(e,t,n)=>{var i;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Warning yourself","You are about to warn yourself. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to warn them?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`)||null!==(i=t.tags)&&void 0!==i&&i.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?"))return{valid:!1,reason:"Warning cancelled by user."};const r=(0,a.getWarningFromLookup)(n.warning),o=`User talk:${t.user.name}`,l=e.util.monthSectionName(),d=(await e.api.getPagesContent([o]))[o]||"",c=e.util.getPageSections(d);let u="new";const p=c.length;for(let e=0;e<p;e++)c[e].title===l&&(u=e+1);let g;g="auto"===n.level?"string"==typeof r.auto?r.auto:"function"==typeof r.auto?r.auto(t,e.queue.getWarningLevel(d)):r.auto[e.queue.getWarningLevel(d)]:n.level;const h=r.templates.find(e=>e.name===g.toString());if(!h)return"auto"!==n.level?{valid:!1,reason:"Selected warning template does not support the specified level."}:{valid:!0};let m="Message about ";"edit"===s.Queue.groups[t.type]?m+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?m+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:m+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:m+=`[[${t.page.title}]]`;let v="";v="new"===u?`{{subst:${h.template}|${t.page.title}|${h.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)`:`${c[u-1].heading}\n${c[u-1].content}\n\n{{subst:${h.template}|${t.page.title}|${h.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)`;const f=await e.api.editSection(o,u,l,v,e.api.summary(m,`${r.name} (${h.name})`));if(f.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(g)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,g),e.store.statistics.warnings_issued.total++,g){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return f}},"rollback-edit":{title:"Rollback edit",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Rolling back edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be rolled back when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Rollbacking own edit","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to rollback it?"))return{valid:!1,reason:"Rollback cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted edits${i}`,n.summary))},successful:(e,t,n)=>{switch(e.store.statistics.reverts_made.total++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}}},"rollback-goodfaith-edit":{title:"Rollback good faith edit",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Rolling back good faith edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be rolled back when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Rollbacking own edit","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to rollback it?"))return{valid:!1,reason:"Rollback cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted [[Wp:AGF|Good faith]] edits${i}`,n.summary))},successful:(e,t,n)=>{switch(e.store.statistics.reverts_made.total++,e.store.statistics.reverts_made.good_faith++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}}},"undo-edit":{title:"Undo edit",icon:"fas fa-undo",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Undoing edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be undone when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Undoing own edit","You are about to undo your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to undo their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to undo the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to undo it?"))return{valid:!1,reason:"Undo cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.undoEdit(t.page.title,t.id,e.api.summary(`Undid revision ${e.api.revision(t.id)}${i}`,n.summary))}},"restore-edit":{title:"Restore edit",icon:"fas fa-redo",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Restoring edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be restored when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>await e.api.restoreEdit(t.page.title,t.id,e.api.summary(`Restored revision ${e.api.revision(t.id)} by ${e.api.user(t.user.name)}`,n.summary))},"send-message-to-user-talk":{title:"Send message to user talk page",icon:"fas fa-comment",parameters:(e,t)=>[{id:"heading",title:"Section heading",type:"text"},{id:"message",title:"Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC))",type:"text"}],progress:"Sending message to user talk page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Message can only be sent when an item is selected."},script:async(e,t,n)=>await e.api.editSection(`User talk:${t.user.name}`,"new",n.heading,n.message,e.api.summary(`Message from ${e.api.username}: ${n.heading}`))},"send-message-to-page-talk":{title:"Send message to page talk page",icon:"fas fa-comment",parameters:(e,t)=>[{id:"heading",title:"Section heading",type:"text"},{id:"message",title:"Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC))",type:"text"}],progress:"Sending message to page talk page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Message can only be sent when an item is selected."},script:async(e,t,n)=>{const s=t.page.title.split(":");let i="Talk";s.length>1&&(i=s[0].toLowerCase().includes("talk")?s[0]:`${s[0]} talk`);const a=`${i}:${1===s.length?s[0]:s.slice(1).join(":")}`;return await e.api.editSection(a,"new",n.heading,n.message,e.api.summary(`Message from ${e.api.username}: ${n.heading}`))}},"report-user-to-aiv":{title:"Report user to AIV",icon:"fas fa-flag",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Vandalism past final warning","Vandalism-only account","Vandalism after recent release of block","Spambot or compromised account","Long-term abuse"],default:"Vandalism past final warning"},{id:"summary",title:"Summary (optional)",type:"text"}],continuity:!0,progress:"Reporting user to AIV",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be reported when an item is selected."},script:async(e,t,n)=>t.user.name===e.api.username?{valid:!1,reason:"You cannot report yourself, silly!"}:(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to report them?`)?{valid:!1,reason:"User report cancelled by user."}:await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; ${n.reason}${n.summary?`: ${n.summary}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}})),successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}},"report-user-to-uaa":{title:"Report user to UAA",icon:"fas fa-user-slash",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Disruptive username","Offensive username","Promotional username","Misleading username"],default:"Disruptive username"},{id:"summary",title:"Summary (optional)",type:"text"}],continuity:!0,progress:"Reporting user to UAA",valid:(e,t,n)=>t?t.user.anon?{valid:!1,reason:"User cannot be reported because they are anonymous."}:{valid:!0}:{valid:!1,reason:"User can only be reported when an item is selected."},script:async(e,t,n)=>{if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot report yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to report them?`))return{valid:!1,reason:"User report cancelled by user."};if(await e.api.areUsersBlocked([t.user.name])[t.user.name])return{valid:!1,reason:"User cannot be reported because they are blocked."};const s="Offensive username"===n.reason?"offensive username":e.api.user(t.user.name);return await e.api.append(i.WikiShield.config.pages.UAA,null,(0,o.fullTrim)(`\n * {{user-uaa|${t.user.name}}} &ndash; ${n.reason}${n.summary?`: ${n.summary}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${s}`),n=>{var s;return{valid:!(null!==(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))&&void 0!==s&&s.content.includes(`{{user-uaa|${t.user.name}}`)),reason:"User has already been reported to UAA."}})},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.UAA++}},"request-page-protection":{title:"Request page protection",icon:"fas fa-shield-alt",parameters:(e,t)=>[{id:"level",title:"Protection level",type:"choice",options:[...e.api.hasPendingChanges?["Pending changes protection"]:[],"Semi-protection","Extended-confirmed protection","Full protection","Move protection","Template protection"],default:"Semi-protection"},{id:"reason",title:"Reason",type:"choice",options:["Generic","Persistent vandalism","Disruptive editing","Edit warring","BLP violations","Sockpuppetry","Arbitration enforcement"],default:"Generic"},{id:"duration",title:"Duration",type:"choice",options:["Temporary","Indefinite"],default:"Temporary"},{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Requesting page protection",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Page protection can only be requested for edits."}:{valid:!0}},script:async(e,t,n)=>{if(await e.gui.settings.waitForClose(),e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to request protection for it?`))return{valid:!1,reason:"Page protection request cancelled by user."};const s="Generic"===n.reason?n.summary:`${n.reason} &ndash; ${n.summary}`;return await e.api.append(i.WikiShield.config.pages.RFPP,null,`\n${(0,o.fullTrim)(`\n === [[${t.page.title}]] ===\n * {{pagelinks|${t.page.title}}}\n '''${n.duration} ${n.level.toLowerCase()}'''${s?`: ${s}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting ${n.level} protection for [[${t.page.title}]]`),n=>({valid:!e.util.getPageSections(n).some(e=>e.title===`[[${t.page.title}]]`),reason:"Page protection has already been requested for this page."}))},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.RFPP++}},"request-global-block":{title:"Request global block",icon:"fas fa-ban",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Generic","Long-term abuse","Cross-wiki abuse","Spam / spambot","Compromised account"],default:"Generic"},{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Requesting global block",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Global block can only be requested when an item is selected."},script:async(e,t,n)=>{var s;if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot request a global block for yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to request a global block for them?`))return{valid:!1,reason:"Global block request cancelled by user."};if(await e.api.isUserGloballyLocked(t.user.name))return{valid:!1,reason:"User is globally locked."};const a="Generic"===n.reason?n.summary:`${n.reason}. ${n.summary}`,r=(await e.api.getPagesContent([i.WikiShield.config.pages.SRG],!0,"meta.wikimedia.org"))[i.WikiShield.config.pages.SRG]||"",l=e.util.getPageSections(r);return await e.api.append(i.WikiShield.config.pages.SRG,Number(null===(s=Object.entries(l).find(([,e])=>2===e.level&&"Requests for global (un)block"===e.title))||void 0===s?void 0:s[0])+1||void 0,`\n${(0,o.fullTrim)(`\n === Global block for ${t.user.name} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{Luxotool|${t.user.name}}}\n ${a?`${a} `:""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting global block for ${e.api.user(t.user.name)}`),n=>{let s=!1,i=[];for(const t of e.util.getPageSections(n))if(2===t.level){if("Requests for global (un)block"===t.title)s=!0;else if(s)break}else s&&3===t.level&&i.push(t);return i=i.filter(e=>!e.content.match(/^{{Status\|not done}}/i)),{valid:!i.some(n=>{const s=n.content;return!!s.match(new RegExp(`{{Luxotool\\|(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}}}`,"i"))||!!s.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(?:\\|hidename=1)?(?:\\||})`,"i"))}),reason:"User has already been requested for global block."}},!1,"meta.wikimedia.org")},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.global_block++}},"request-global-lock":{title:"Request global lock",icon:"fas fa-lock",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Generic","Long-term abuse","Cross-wiki abuse","Abusive-username","Spam / spambot","Compromised account"],default:"Generic"},{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Requesting global lock",valid:(e,t,n)=>t?t.user.anon?{valid:!1,reason:"Global lock cannot be requested for anonymous users."}:{valid:!0}:{valid:!1,reason:"Global lock can only be requested when an item is selected."},script:async(e,t,n)=>{var s;if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot request a global lock for yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to request a global lock for them?`))return{valid:!1,reason:"Global lock request cancelled by user."};if(await e.api.isUserGloballyLocked(t.user.name))return{valid:!1,reason:"User is already globally locked."};const a="Generic"===n.reason?n.summary:`${n.reason}. ${n.summary}`,r="Yes"===n.hide_username?"":` for ${e.api.centralAuthUser(t.user.name)}`,l=(await e.api.getPagesContent([i.WikiShield.config.pages.SRG],!0,"meta.wikimedia.org"))[i.WikiShield.config.pages.SRG]||"",d=e.util.getPageSections(l);return await e.api.append(i.WikiShield.config.pages.SRG,Number(null===(s=Object.entries(d).find(([,e])=>2===e.level&&"Requests for global (un)lock and (un)hiding"===e.title))||void 0===s?void 0:s[0])+1||void 0,`\n${(0,o.fullTrim)(`\n === Global lock${r} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{LockHide|${t.user.name}${"Yes"===n.hide_username?"|hidename=1":""}}}\n ${a?`${a} `:""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting global lock${r}`),n=>{let s=!1,i=[];for(const t of e.util.getPageSections(n))if(2===t.level){if("Requests for global (un)lock and (un)hiding"===t.title)s=!0;else if(s)break}else s&&3===t.level&&i.push(t);return i=i.filter(e=>!e.content.match(/^{{Status\|not done}}/i)),{valid:!i.some(n=>{const s=n.content;return!!s.match(new RegExp(`{{LockHide\\|(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(\\|hidename=1)?}}`,"i"))||!!s.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(?:\\|hidename=1)?(?:\\||})`,"i"))}),reason:"User has already been requested for global lock."}},!1,"meta.wikimedia.org")},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.global_lock++}},"thank-user":{title:"Thank user",icon:"fas fa-handshake",progress:"Thanking user",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"User can only be thanked when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{const s=e.api.summary(`Thank you for [[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`),i=`User talk:${t.user.name}`;if(t.user.temp){const n=await e.api.thankRevision(t.id);return(n.valid||e.store.settings.talk_page_thanks_for_temporary_users.enabled)&&void 0===(await e.api.pagesExist(i))[i]&&await e.api.editSection(i,"new","Thank you!","{{subst:Thanks-autosign}}",s),n}return t.user.ip?await e.api.editSection(i,"new","Thank you!","{{subst:Thanks-autosign}}",s):await e.api.thankRevision(t.id)},successful:(e,t,n)=>{e.store.statistics.edits_reviewed.thanked++}},"welcome-user":{title:"Welcome user",icon:"fas fa-paper-plane",parameters:(e,t)=>[{id:"template",title:"Template",type:"choice",options:Object.keys(r.welcomes),default:Object.keys(r.welcomes)[0]}],progress:"Welcoming user",valid:(e,t,n)=>t?void 0!==t.user.talk?{valid:!1,reason:"User cannot be welcomed because their talk page is not empty."}:{valid:!0}:{valid:!1,reason:"User can only be welcomed when an item is selected."},script:async(e,t,n)=>await(async()=>{const s=`User talk:${t.user.name}`;if(void 0!==(await e.api.pagesExist([s]))[s])return{valid:!1,reason:"User cannot be welcomed because their talk page is not empty."};let i=r.welcomes[n.template];if(!i)return{valid:!1,reason:"Selected welcome template does not exist."};const a=new Set([i]);for(;"function"==typeof(null===(o=i)||void 0===o?void 0:o.template);){var o,l;if(i=r.welcomes[i.template(e,t)],a.has(i))return null!==(l=void e.gui.dialog.toast("REPORT TO DEVELOPER","Uh oh! Something has gone <i>cat</i>astrophically wrong. Please report this to a developer, and include the error code below:<br><br><code>WELCOME_TEMPLATE_LOOP</code>","dev",-1))&&void 0!==l?l:{valid:!1};if(!i)return{valid:!1,reason:"Selected welcome template does not exist."};a.add(i)}const d=`{{subst:${i.template}}}${i.sign?" [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:03, 25 May 2026 (UTC)":""}`;return await e.api.append(s,null,d,e.api.summary("Welcome to Wikipedia!"))})(),successful:(e,t,n)=>{e.store.statistics.users_welcomed.total++,e.queue.talks.set(t.user.name,!0),e.gui.renderQueue()}},"watch-page":{title:"Watch page",icon:"fas fa-eye",progress:"Watching page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be watched when an item is selected."},script:async(e,t,n)=>await e.api.watchPage(t.page.title,e.util.utcString(e.util.expiryToDate(e.store.settings.expiry.watchlist))),successful:(e,t,n)=>{e.store.statistics.watchlist.watched++,e.queue.watchlist.set(t.page.title,!0)}},"unwatch-page":{title:"Unwatch page",icon:"fas fa-eye-slash",progress:"Unwatching page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be unwatched when an item is selected."},script:async(e,t,n)=>await e.api.unwatchPage(t.page.title),successful:(e,t,n)=>{e.store.statistics.watchlist.unwatched++,e.queue.watchlist.set(t.page.title,!1)}},"whitelist-user":{title:"Add user to whitelist",icon:"fas fa-user-check",progress:"Adding user to whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be added to whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.users.set(t.user.name,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.whitelist.users).valueOf()]),e.store.statistics.items_whitelisted.total++,e.store.statistics.items_whitelisted.users++,e.gui.renderQueue(),{valid:!0})},"unwhitelist-user":{title:"Remove user from whitelist",icon:"fas fa-user-minus",progress:"Removing user from whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be removed from whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.users.delete(t.user.name),e.gui.renderQueue(),{valid:!0})},"whitelist-page":{title:"Add page to whitelist",icon:"fas fa-check",progress:"Adding page to whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be added to whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.pages.set(t.page.title,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.whitelist.pages).valueOf()]),e.store.statistics.items_whitelisted.total++,e.store.statistics.items_whitelisted.pages++,e.gui.renderQueue(),{valid:!0})},"unwhitelist-page":{title:"Remove page from whitelist",icon:"fas fa-minus",progress:"Removing page from whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be removed from whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.pages.delete(t.page.title),e.gui.renderQueue(),{valid:!0})},"highlight-user":{title:"Add user to highlighted users",icon:"fas fa-star",progress:"Adding user to highlighted users",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be added to highlighted users when an item is selected."},script:(e,t,n)=>(e.store.highlight.users.set(t.user.name,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.highlight.users).valueOf()]),e.store.statistics.items_highlighted.total++,e.store.statistics.items_highlighted.users++,e.gui.renderQueue(),{valid:!0})},"unhighlight-user":{title:"Remove user from highlighted users",icon:"fas fa-user-minus",progress:"Removing user from highlighted users",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be removed from highlighted users when an item is selected."},script:(e,t,n)=>(e.store.highlight.users.delete(t.user.name),e.gui.renderQueue(),{valid:!0})},"highlight-page":{title:"Add page to highlighted pages",icon:"fas fa-star",progress:"Adding page to highlighted pages",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be added to highlighted pages when an item is selected."},script:(e,t,n)=>(e.store.highlight.pages.set(t.page.title,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.highlight.pages).valueOf()]),e.store.statistics.items_highlighted.total++,e.store.statistics.items_highlighted.pages++,e.gui.renderQueue(),{valid:!0})},"unhighlight-page":{title:"Remove page from highlighted pages",icon:"fas fa-minus",progress:"Removing page from highlighted pages",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be removed from highlighted pages when an item is selected."},script:(e,t,n)=>(e.store.highlight.pages.delete(t.page.title),e.gui.renderQueue(),{valid:!0})},"refresh-user-contributions":{title:"Refresh user contributions",icon:"fas fa-rotate",progress:"Refreshing user contributions",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User contributions can only be refreshed when an item is selected."},script:async(e,t,n)=>{try{var s;document.querySelector("#refresh-page-history").classList.add("refreshing");const n=(await e.api.parseUsers([t.user.name]))[0].user;return e.queue.talks.set(t.user.name,n.talk),e.queue.contributions.set(t.user.name,n.contributions),e.queue.blocked.set(t.user.name,n.blocked),e.queue.blocks.set(t.user.name,n.blocks),t.user.edits=Math.max(n.edits,(null===(s=n.contributions)||void 0===s?void 0:s.length)||0),t.user.warning=e.queue.getWarningLevel(n.talk||""),t.user.warnings=e.queue.getWarningHistory(n.talk||""),delete t.user.cached_contributions,e.gui.renderQueue(),e.queue.current.item===t&&e.gui.newCurrentItem(t),{valid:!0}}catch(e){return console.error(e),{valid:!1,reason:"An error occurred while fetching user contributions."}}}},"refresh-page-history":{title:"Refresh page history",icon:"fas fa-rotate",progress:"Refreshing page history",valid:(e,t,n)=>t?"users"===t.type?{valid:!1,reason:"Page history cannot be refreshed for user creations."}:{valid:!0}:{valid:!1,reason:"Page history can only be refreshed when an item is selected."},script:async(e,t,n)=>{try{document.querySelector("#refresh-page-history").classList.add("refreshing");const[n,s]=await Promise.all([e.api.getHistory(t.page.title),e.api.getPagesDetails(t.page.title)]),i=s[t.page.title];return e.queue.histories.set(t.page.title,n),t.page.metadata=i.metadata,t.page.categories=i.categories,t.page.protection=i.protection,delete t.page.cached_history,e.gui.renderQueue(),e.queue.current.item===t&&e.gui.newCurrentItem(t),{valid:!0}}catch(e){return console.error(e),{valid:!1,reason:"An error occurred while fetching page history."}}}},"open-user-page":{title:"Open user page",icon:"fas fa-circle-user",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`User:${t.user.name}`)),{valid:!0})},"open-user-talk":{title:"Open user talk page",icon:"fas fa-comment",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User talk page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`User talk:${t.user.name}`)),{valid:!0})},"open-user-contributions":{title:"Open user contributions",icon:"fas fa-list",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User contributions can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`Special:Contributions/${t.user.name}`)),{valid:!0})},"open-user-filter-log":{title:"Open user filter log",icon:"fas fa-filter",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User filter log can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`?title=Special:AbuseLog&wpSearchUser=${encodeURIComponent(t.user.name)}`,!0)),{valid:!0})},"open-page":{title:"Open page",icon:"fas fa-file",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(t.page.title)),{valid:!0})},"open-page-talk":{title:"Open page talk",icon:"fas fa-comments",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page talk can only be opened when an item is selected."},script:(e,t,n)=>{const s=t.page.title.split(":");let i="Talk";s.length>1&&(i=s[0].toLowerCase().includes("talk")?s[0]:`${s[0]} talk`);const a=e.page(`${i}:${1===s.length?s[0]:s.slice(1).join(":")}`);return e.open(a),{valid:!0}}},"open-page-history":{title:"Open page history",icon:"fas fa-clock-rotate-left",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page history can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`Special:PageHistory/${t.page.title}`)),{valid:!0})},"open-revision":{title:"Open revision",icon:"fas fa-file-lines",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Revision can only be opened for edits."}:{valid:!0}},script:(e,t,n)=>(e.open(e.page(`Special:Permalink/${t.id}`)),{valid:!0})},"open-diff":{title:"Open diff",icon:"fas fa-code-compare",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Diff can only be opened for edits."}:{valid:!0}},script:(e,t,n)=>(e.open(e.page(`Special:Diff/${t.id}`)),{valid:!0})},"copy-link":{title:"Copy link",icon:"fas fa-link",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Link can only be copied when an item is selected."},script:(e,t,n)=>{if("edit"===t.group)navigator.clipboard.writeText(e.page(`?diff=${t.id}`,!0));else if("logevent"===t.group)navigator.clipboard.writeText(e.page(`?title=Special:Log&logid=${t.id}`,!0));else{if("abuselog"!==t.group)return e.gui.dialog.toast("Cannot copy link","Please report this issue to a developer, including the error code below:<br><br><code>UNKNOWN_ITEM_GROUP_FOR_LINK_COPY</code>","error",3e3),{valid:!1};t.revid?navigator.clipboard.writeText(e.page(`?diff=${t.revid}`,!0)):navigator.clipboard.writeText(e.page(`?title=Special:AbuseLog/${t.id}`,!0))}return e.gui.dialog.toast("Link copied","The link has been copied to your clipboard.","success",3e3),{valid:!0}}},"open-revert-menu":{title:"Open revert menu",icon:"fas fa-undo",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Revert menu is only available for edits."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector('[data-menu="revert"]'),i=document.querySelector("#revert-menu");if(i.innerHTML="",e.gui.createWarnMenu("reverts",i,t),s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-warn-menu":{title:"Open warn menu",icon:"fas fa-exclamation-triangle",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Warning menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="warn"]'),i=document.querySelector("#warn-menu");if(i.innerHTML="",e.gui.createWarnMenu("warnings",i,t),s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-user-menu":{title:"Open user menu",icon:"fas fa-flag",valid:(e,t,n)=>e.queue.current.item?{valid:!0}:{valid:!1,reason:"User menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="user"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-page-menu":{title:"Open page menu",icon:"fas fa-flag",valid:(e,t,n)=>e.queue.current.item?{valid:!0}:{valid:!1,reason:"Page menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="page"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-edit-menu":{title:"Open edit menu",icon:"fas fa-flag",valid:(e,t,n)=>{let i=e.queue.current.item.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit menu is only available for edits."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector('[data-menu="edit"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"switch-to-recent-queue":{title:"Switch to recent changes queue",icon:"fas fa-stopwatch",valid:(e,t,n)=>e.store.settings.queue.recent.enabled?{valid:!0}:{valid:!1,reason:"Recent changes queue is not enabled."},script:(e,t,n)=>(e.queue.switch("recent"),{valid:!0})},"switch-to-pending-queue":{title:"Switch to pending changes queue",icon:"fas fa-flag",valid:(e,t,n)=>e.store.settings.queue.pending.enabled?e.rights.review?e.api.hasPendingChanges?{valid:!0}:{valid:!1,reason:"The pending changes extension is not enabled on this wiki."}:{valid:!1,reason:"You do not have permission to review pending changes."}:{valid:!1,reason:"Pending changes queue is not enabled."},script:(e,t,n)=>(e.queue.switch("pending"),{valid:!0})},"switch-to-watchlist-queue":{title:"Switch to watchlist queue",icon:"fas fa-book-bookmark",valid:(e,t,n)=>e.store.settings.queue.watchlist.enabled?{valid:!0}:{valid:!1,reason:"Watchlist queue is not enabled."},script:(e,t,n)=>(e.queue.switch("watchlist"),{valid:!0})},"switch-to-users-queue":{title:"Switch to user creation logs queue",icon:"fas fa-user-plus",valid:(e,t,n)=>e.store.settings.queue.users.enabled?{valid:!0}:{valid:!1,reason:"User creation logs queue is not enabled."},script:(e,t,n)=>(e.queue.switch("users"),{valid:!0})},"switch-to-abuselog-queue":{title:"Switch to abuse log queue",icon:"fas fa-filter-circle-xmark",valid:(e,t,n)=>e.store.settings.queue.abuselog.enabled?{valid:!0}:{valid:!1,reason:"Abuse log queue is not enabled."},script:(e,t,n)=>(e.queue.switch("abuselog"),{valid:!0})},"toggle-zen-mode":{title:"Toggle zen mode",icon:"fas fa-spa",script:(e,t,n)=>{var s;return e.store.settings.zen.enabled=!e.store.settings.zen.enabled,null===(s=document.querySelector("#zen-mode-enable"))||void 0===s||s.classList.toggle("active",e.store.settings.zen.enabled),e.gui.updateZenMode(),{valid:!0}}},"toggle-consecutive-edits":{title:"Toggle consecutive edits",icon:"fas fa-users",valid:(e,t,n)=>{const s=e.queue.current.type;return"recent"!==s&&"watchlist"!==s?{valid:!1,reason:"Consecutive edits can only be viewed in the recent changes or watchlist queues."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector("#consecutive-edits-tab");return s.classList.contains("hidden")||(s.classList.contains("selected")?document.querySelector("latest-edits-tab").click():s.click()),{valid:!0}}}}},8921(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.EventManager=void 0;var s=n(985),i=n(870),a=n(5564);t.EventManager=class{constructor(e){this.ws=e,this.events=s.events,this.conditions=i.conditions}button(e,t){const n=this.ws;e.addEventListener("click",e=>(e=>{n.gui.selectedMenu=null;const s=n.queue.current.item,i={};for(const o of(null===(a=(r=n.gui.events.events[t]).parameters)||void 0===a?void 0:a.call(r,n,s))||[]){var a,r;"external"===o.id&&(i[o.id]=(null==e?void 0:e.altKey)||!1)}n.execute({actions:[{name:t,params:i}]})})(e))}submenu(e,t){var n,s;const i=this.events[t];e.dataset.eventName=t;const r=this.ws.queue.current,o=`${r.type}:${null===(n=r.item)||void 0===n?void 0:n.id}`,l={};if(e.dataset.eventId===o)for(const t of(null===(d=i.parameters)||void 0===d?void 0:d.call(i,this.ws,this.ws.queue.current.item))||[]){var d;const n=e.querySelector(`[data-paramid="${t.id}"]`);l[t.id]="checkbox"===n.type?n.checked:n.value}else e.dataset.eventId=o;e.innerHTML="";const c=document.createElement("div");c.classList.add("bottom-subcontent-title"),c.textContent=i.title,e.appendChild(c);const u=new Map,p={},g=(0,a.sortDependencies)((null===(s=i.parameters)||void 0===s?void 0:s.call(i,this.ws,this.ws.queue.current.item))||[]);for(const t of g){const n=document.createElement("div");n.classList.add("bottom-subcontent-input-title"),n.textContent=t.title,e.appendChild(n);const s={};for(const e of null!==(h=t.dependencies)&&void 0!==h?h:[]){var h;s[e]=p[e]}const i="function"==typeof t.default?t.default(s):t.default;let a=null;switch(t.type){case"choice":{const n=document.createElement("select");n.dataset.paramid=t.id,e.appendChild(n);const r="function"==typeof t.options?t.options(s):t.options;for(const e of null!=r?r:[]){const t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),a=()=>{const e={};for(const n of null!==(s=t.dependencies)&&void 0!==s?s:[]){var s;e[n]=p[n]}const i=n.value,a="function"==typeof t.options?t.options(e):t.options;n.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}if(a.includes(i))n.value=i;else{const s="function"==typeof t.default?t.default(e):t.default;n.value=s,p[t.id]=s}},n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}break;case"text":{const n=document.createElement("input");n.type="text",n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}break;case"boolean":{const n=document.createElement("input");n.type="checkbox",n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.checked=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.checked=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.checked;for(const e of u.get(t.id)||[])e()})}break;case"duration":{const n=document.createElement("duration-input");n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}}if("function"==typeof a)for(const e of null!==(m=t.dependencies)&&void 0!==m?m:[]){var m;u.has(e)||u.set(e,[]),u.get(e).push(a)}}const v=document.createElement("button");v.classList.add("bottom-subcontent-button"),v.textContent="Submit",e.appendChild(v),v.addEventListener("click",()=>{const n={};for(const t of g){const s=e.querySelector(`[data-paramid="${t.id}"]`);n[t.id]=s.value}this.ws.execute({actions:[{name:t,params:n}]}),this.ws.gui.closeMenus()})}}},372(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Queue=void 0;var s=n(2852),i=n(2595),a=n(6400);function r(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){return e.get(d(e,t))}function d(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var c=new WeakMap,u=new WeakSet;class p{static areSameGroup(e,t){return this.groups[e]===this.groups[t]}constructor(e){var t,n;r(t=this,n=u),n.add(t),function(e,t,n){r(e,t),t.set(e,n)}(this,c,Promise.resolve()),this.ws=e,this.queues=Object.fromEntries(["void",...p.types].map(t=>[t,{type:t,item:null,previous:null,queue:[],hold:[],repeats:{},history:new i.Stack(100),memory:new s.Memory({size:1e3}),last:{timestamp:e.util.utcString(new Date),id:0}}])),this.cache={simple:new s.Memory({size:1e3}),full:new s.Memory({size:250})},this.current=this.queues[p.types[0]],this.pending=new Map,this.watchlist=new s.Memory({size:1e3}),this.talks=new s.Memory({size:500}),this.warnings=new s.Memory({size:1e3,timeout:864e5}),this.noWelcome=new s.Memory({timeout:36e5}),this.histories=new s.Memory({size:1e3}),this.contributions=new s.Memory({size:1e3}),this.blocks=new s.Memory({size:1e3}),this.blocked=new s.Memory({size:1e4}),this.playedSound={mention:new s.Memory({timeout:6e4})},this.bypass=new s.Memory({timeout:36e5,size:1e4}),this.backoff=2e3}switch(e){var t;this.current.type!==e&&("pending"===this.current.type&&(this.queues.pending.queue=this.queues.pending.queue.filter(e=>this.pending.has(e.id))),document.querySelector("#clear-queue").classList.toggle("hidden","pending"===e),this.current=this.queues[e],this.current.queue.some(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)})||(this.current.item=this.current.queue[0]||null),this.ws.gui.renderQueue(),this.ws.gui.newCurrentItem(this.current.item),document.querySelectorAll("#queue-tabs > .queue-tab.selected").forEach(e=>e.classList.remove("selected")),null===(t=document.querySelector(`#queue-tab-${e}`))||void 0===t||t.classList.add("selected"))}async fetch(){try{const i=this.ws.store.settings.queue;if(i.pending.enabled&&this.ws.rights.review){const e=(await this.ws.api.feeds(null,{ns:"*",full:!0})).pending;this.pending.clear(),Object.values(e).forEach(e=>this.pending.set(e.revid,e)),await this.outdated("pending")}const a=await this.ws.api.feeds(i.recent.enabled?{ns:this.ws.store.settings.namespaces.join("|"),since:this.queues.recent.last.timestamp}:null,i.pending.enabled&&this.ws.rights.review?{ns:"*",full:!1}:null,i.users.enabled?{ns:"*",since:this.queues.users.last.timestamp}:null,i.watchlist.enabled?{ns:"*",since:this.queues.watchlist.last.timestamp}:null,i.abuselog.enabled?{ns:this.ws.store.settings.namespaces.join("|"),since:this.queues.abuselog.last.timestamp}:null),r=this.ws.store.whitelist;for(const i of p.types){var e;const o=this.queues[i].last.id;let l=null!==(e=a[i])&&void 0!==e?e:[];const d=l.reduce((e,t)=>Math.max(e,t.timestamp),0);switch(d&&(this.queues[i].last.timestamp=this.ws.util.utcString(new Date(d))),p.groups[i]){case"edit":{const e=e=>e.revid>o;l="recent"===i?l.filter(t=>e(t)&&!r.pages.has(t.title)):l.filter(e)}break;case"abuselog":l=l.filter(e=>e.id>o);break;case"logevent":l=l.filter(e=>e.logid>o)}l=l.concat(this.queues[i].hold),l.length>25?this.queues[i].hold=l.splice(25).reverse():this.queues[i].hold=[];let c=!1;switch(i){case"recent":{const e=new Set;for(const n of l)for(const s of this.queues[i].queue){var t;e.has(s)||s.id!==(null===(t=this.current.item)||void 0===t?void 0:t.id)&&n.title===s.page.title&&s.id<n.revid&&e.add(s)}for(const t of e){const e=this.queues[i].queue.indexOf(t);e>-1&&(this.queues[i].queue.splice(e,1),this.ws.gui.removeQueueItem(i,t.id))}c=e.size>0}break;case"pending":for(const e of this.queues[i].queue){var n;if((null===(n=this.current.item)||void 0===n?void 0:n.id)!==e.id&&!this.pending.has(e.id)){const t=this.queues[i].queue.indexOf(e);t>-1&&(this.queues[i].queue.splice(t,1),this.ws.gui.removeQueueItem(i,e.id),c=!0)}}break;case"users":l=l.filter(e=>!e.temp);break;case"watchlist":{const e=new Set;for(const t of l)for(const n of this.queues[i].queue){var s;e.has(n)||n.id!==(null===(s=this.current.item)||void 0===s?void 0:s.id)&&(t.title===n.page.title&&n.id<t.revid?e.add(n):n.page.watched||e.add(n))}if(0===l.length)for(const t of this.queues[i].queue)t.page.watched||e.add(t);for(const t of e){const e=this.queues[i].queue.indexOf(t);e>-1&&(this.queues[i].queue.splice(e,1),this.ws.gui.removeQueueItem(i,t.id))}c=e.size>0}}if(0!==l.length)switch(p.groups[i]){case"edit":{this.queues[i].last.id=l.reduce((e,t)=>Math.max(e,t.revid),0);const e=this.ws.store.highlight,t=t=>{var n;return e.users.has(t.user)||e.pages.has(t.title)||(null===(n=t.tags)||void 0===n?void 0:n.some(t=>e.tags.has(t)))};l=l.filter(e=>{var n;return!r.users.has(e.user)&&!(null!==(n=e.tags)&&void 0!==n&&n.some(e=>r.tags.has(e)))&&(!this.bypass.has(e.user)||t(e))});const n={};let[s,a]=await Promise.allSettled(["recent"===i?this.ws.api.getEditCounts(l.map(e=>e.user).filter(e=>!this.bypass.has(e))):Promise.resolve([]),this.ws.api.getORES(l.filter(e=>{var t;if(null===(t=e.oresscores)||void 0===t||!t.length)return!0;n[e.revid]=e.oresscores},this.ws.store.settings.queue.ores_bias).map(e=>e.revid))]);"rejected"===s.status&&console.error("Edit counts failed:",s.reason),s="fulfilled"===s.status?s.value:{},"rejected"===a.status&&console.error("ORES failed:",a.reason),a="fulfilled"===a.status?a.value:{};for(const[e,t]of Object.entries(await this.ws.api.extractORES(n,this.ws.store.settings.queue.ores_bias)))a[e]=t;const o=this.queues[i].repeats,d=[];if("recent"===i){const e=this.ws.store.settings.queue.min_ores,n=this.ws.store.settings.queue.max_edits;l.forEach(r=>{var l,c;if(isNaN(a[r.revid])&&(o[r.revid]||0)<3)return o[r.revid]=(o[r.revid]||0)+1,this.queues[i].hold.push(r);delete o[r.revid];const u=null!==(l=null!==(c=s[r.user])&&void 0!==c?c:this.bypass.get(r.user))&&void 0!==l?l:0;u>n?(this.bypass.set(r.user,u),t(r)&&d.push(r)):((a[r.revid]||0)>=e||t(r))&&d.push(r)})}else l.forEach(e=>{if(isNaN(a[e.revid])&&(o[e.revid]||0)<3)return o[e.revid]=(o[e.revid]||0)+1,this.queues[i].hold.push(e);delete o[e.revid],d.push(e)});await this.add(i,d)}break;case"logevent":{let e=0;const t=new Set,n=[];l.forEach(s=>{t.has(s.logid)||(t.add(s.logid),s.logid>e&&(e=s.logid),n.push(s))}),this.queues[i].last.id=e,await this.add(i,n)}break;case"abuselog":{const e=l.filter(e=>null===e.editcount);let t={};e.length>0&&(t=await this.ws.api.getEditCounts(e.map(e=>e.user)));const n=this.ws.store.settings.queue.max_edits;let s=0;const a=[];l.forEach(e=>{var i;((null!==(i=e.editcount)&&void 0!==i?i:t[e.user])||0)>n||(e.id>s&&(s=e.id),a.push(e))}),this.queues[i].last.id=s,await this.add(i,a)}}else c&&this.ws.gui.renderQueue(this.queues[i].queue,this.current.edit,i)}await this.outdated(),this.backoff=p.refresh}catch(e){console.error(e),this.backoff=Math.min(2*this.backoff,12e4)}setTimeout(()=>this.fetch(),this.backoff)}async outdated(){{const e=[];for(const t of this.queues.pending.queue)t!==this.current.item&&(this.pending.has(t.id)||e.push(t));if(e.length>0)for(const t of e){const e=this.queues.pending.queue.indexOf(t);e>-1&&(this.queues.pending.queue.splice(e,1),this.ws.gui.removeQueueItem("pending",t.id))}}const e=new Set,t=["recent","watchlist","abuselog"];for(const n of t)this.queues[n].queue.forEach(t=>{("abuselog"!==n||t.revid)&&e.add(t.page.title)});const n=await this.ws.api.getLatestIds([...e]);for(const e of t){const t=[];for(const s of this.queues[e].queue){let i=s.id;if("abuselog"===e){if(!s.revid)continue;i=s.revid}const a=n[s.page.title];a&&a>i&&t.push([s.id,i])}if(t.length>0)for(const[n,i]of t){var s;const t="abuselog"===e?"revid":"id";if(i===(null===(s=this.queues[e].item)||void 0===s?void 0:s[t]))continue;const a=this.queues[e].queue.findIndex(e=>e[t]===i);a>-1&&(this.queues[e].queue.splice(a,1),this.ws.gui.removeQueueItem(e,n))}}this.ws.gui.renderQueue()}async add(e,t){const n={edit:"revid",logevent:"logid",abuselog:"id"}[p.groups[e]];(t=t.filter(t=>!this.queues[e].memory.has(t[n]))).forEach(t=>this.queues[e].memory.add(t[n]));const s=t.length;if(0===s)return;const i={ores:!1,mention:!1},a=await this.generate(e,t,!1);switch(p.groups[e]){case"edit":{const n=this.ws.store.settings.audio.ores_alert.threshold;for(let r=0;r<s;r++){t[r];const s=a[r];this.queues[e].queue.push(s),"recent"===e&&s.ores>=n&&(i.ores=!0),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}}break;case"logevent":for(let n=0;n<s;n++){t[n];const s=a[n];this.queues[e].queue.push(s),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}break;case"abuselog":for(let n=0;n<s;n++){t[n];const s=a[n];this.queues[e].queue.push(s),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}}this.sort(e),i.ores&&this.ws.store.settings.audio.ores_alert.enabled&&this.ws.audio.playSound(["queue","ores"]),i.mention&&this.ws.store.settings.username_highlighting.enabled&&this.ws.audio.playSound(["queue","mention"]),this.ws.gui.renderQueue(this.queues[e].queue,this.queues[e].item,e)}sort(e){var t;let n=-1;this.queues[e].item&&(n=this.queues[e].queue.findIndex(t=>t===this.queues[e].item));let s=this.queues[e].queue;n>=0&&(s=s.slice(0,n).concat(s.slice(n+1)));const i=this.ws.store.highlight,a=this.ws.store.settings.username_highlighting.enabled;switch(p.groups[e]){case"edit":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return-1;if(t.history)return 1;let n=e.ores;a&&e.mentions.has&&(n+=200),i.users.has(e.user.name)&&(n+=100),i.pages.has(e.page.title)&&(n+=75),n+=50*e.tags.filter(e=>i.tags.has(e)).length;let s=t.ores;return a&&t.mentions.has&&(s+=200),i.users.has(t.user.name)&&(s+=100),i.pages.has(t.page.title)&&(s+=75),s+=50*t.tags.filter(e=>i.tags.has(e)).length,n===s?t.id-e.id:s-n});break;case"logevent":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return 1;if(t.history)return-1;let n=100*(e.user.profanity.clamped||0);a&&e.mentions.has&&(n+=200);let s=100*(t.user.profanity.clamped||0);return a&&t.mentions.has&&(s+=200),n===s?t.id-e.id:s-n});break;case"abuselog":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return 1;if(t.history)return-1;let n=0;i.users.has(e.user.name)&&(n+=100),i.pages.has(e.page.title)&&(n+=75),a&&e.mentions.has&&(n+=200);let s=0;return i.users.has(t.user.name)&&(s+=100),i.pages.has(t.page.title)&&(s+=75),a&&t.mentions.has&&(s+=200),n===s?t.id-e.id:s-n})}const r=new Set(null!==(t=this.queues[e].item)&&void 0!==t&&t.id?[this.queues[e].item.id]:[]);s=s.filter(e=>!r.has(e.id)&&(r.add(e.id),!0)),n>=0&&s.splice(n,0,this.queues[e].item),this.queues[e].queue=[...s.slice(0,this.ws.store.settings.queue.max_size)],this.queues[e].item||(this.queues[e].item=this.queues[e].queue[0])}async generate(e,t,n,s={}){var i;if(0===t.length)return[];const r=null!==(i=null==s?void 0:s.bypass)&&void 0!==i&&i,o=this.ws,l=o.api.username,d=[];switch(p.groups[e]){case"edit":{t=(t=t.filter(e=>{const t=(e=>{if(n){if(this.cache.simple.has(e))return this.cache.simple.get(e);if(this.cache.full.has(e))return this.cache.full.get(e)}else if(this.cache.full.has(e))return this.cache.full.get(e);return null})(e.revid);var s;return!t||(e.pending&&!t.pending&&(t.pending=e.pending),null!==(s=void d.push(t))&&void 0!==s&&s)})).map(e=>{var t;let n=null;return e.pending&&(n=null===(t=this.pending.get(e.revid))||void 0===t?void 0:t.prior),null!=n||(n=e.old_revid||e.parentid),{item:e,prior:n}});const s=await o.api.parseEdits(t,n,this.ws.store.settings.queue.ores_bias,r);for(const t of s){var c;const{item:s,prior:i,data:a}=t,r={comment:!1,diff:!1};if(l&&a.edit.diff){const e=document.createElement("div");e.innerHTML=a.edit.diff,e.textContent&&(r.diff=o.util.match(l,e.textContent))}this.watchlist.set(s.title,a.page.watched),this.histories.set(s.title,a.page.history),this.contributions.set(s.user,a.user.contributions),this.blocks.set(s.user,a.user.blocks),this.blocked.set(s.user,a.user.blocked);const u=["0","1","2","3","4","4im"],g=this.getWarningLevel(a.user.talk||"");u.indexOf(g)>u.indexOf(this.warnings.get(s.user)||"0")&&this.warnings.set(s.user,g);const h={page:{namespace:s.ns,title:s.title,get history(){var e;return null!==(e=o.queue.histories.get(s.title))&&void 0!==e?e:a.page.history},get watched(){var e;return null!==(e=o.queue.watchlist.get(s.title))&&void 0!==e?e:a.page.watched},metadata:a.page.metadata,categories:a.page.categories,protection:a.page.protection},user:{name:s.user,ip:o.util.isIPAddress(s.user),temp:o.util.isTempAccount(s.user),anon:o.util.isIPAddress(s.user)||o.util.isTempAccount(s.user),edits:Math.max(a.user.edits,(null===(c=a.user.contributions)||void 0===c?void 0:c.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(s.user))&&void 0!==e?e:a.user.contributions},warning:this.getWarningLevel(a.user.talk||""),warnings:this.getWarningHistory(a.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(s.user))&&void 0!==e?e:a.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(s.user))&&void 0!==e?e:a.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(s.user))&&void 0!==e?e:a.user.talk}},mentions:r,AI:{edit:null,username:null},id:s.revid,prior:i,timestamp:s.timestamp,comment:s.parsedcomment,minor:s.minor||!1,diff:a.edit.diff,sizediff:("sizediff"in s?s.sizediff:s.newlen-s.oldlen)||0,ores:a.edit.ores,tags:s.tags||[],reverts:a.page.reverts,consecutive:a.page.consecutive,propagating:!1,reviewed:!1,history:!1,pending:s.pending||!1,group:p.groups[e],type:e,simple:n,origin:s};!n&&o.AI&&(o.store.settings.AI.edit_analysis.enabled&&o.AI.analyze.edit(h).then(e=>h.AI.edit=e).catch(e=>h.AI.edit={error:e.message}).finally(()=>{var e;h.id===(null===(e=this.current.item)||void 0===e?void 0:e.id)&&o.gui.updateAIAnalysisDisplay(h.AI.edit)}),h.user.anon||o.store.whitelist.users.has(h.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(h).then(e=>{h.AI.username=e,e.flag&&this.promptUAA(h,e)}).catch(e=>h.AI.username={error:e.message})),d.push(h),n?this.cache.simple.set(s.revid,h):(this.cache.full.set(s.revid,h),this.cache.simple.has(s.revid)&&this.cache.simple.delete(s.revid))}}break;case"logevent":{const s=await o.api.parseUsers(t.map(e=>e.title.replace(/^(User|User talk):/,"")),n,r),i=await o.api.parseUsers(t.map(e=>e.user),n,r);for(let r=0;r<t.length;r++){var u,g;const c=t[r],h=s[r],m=i[r],v=c.title.replace(/^(User|User talk):/,""),f={username:!1,comment:!1};l&&v&&(f.username=o.util.match(l,v)),this.contributions.set(v,h.user.contributions),this.contributions.set(c.user,m.user.contributions),this.blocks.set(v,h.user.blocks),this.blocks.set(c.user,m.user.blocks),this.blocked.set(v,h.user.blocked),this.blocked.set(c.user,m.user.blocked);const b=["0","1","2","3","4","4im"],w=this.getWarningLevel(h.user.talk||"");b.indexOf(w)>b.indexOf(this.warnings.get(v)||"0")&&this.warnings.set(v,w);const y=this.getWarningLevel(m.user.talk||"");b.indexOf(y)>b.indexOf(this.warnings.get(c.user)||"0")&&this.warnings.set(c.user,y);const x=a.profanity.evaluate(v),k={page:{namespace:c.ns,title:c.title,history:[],get watched(){return!1},metadata:[],categories:[],protection:{}},user:{name:v,ip:o.util.isIPAddress(v),temp:o.util.isTempAccount(v),anon:o.util.isIPAddress(v)||o.util.isTempAccount(v),edits:Math.max(h.user.edits,(null===(u=h.user.contributions)||void 0===u?void 0:u.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(v))&&void 0!==e?e:h.user.contributions},warning:this.getWarningLevel(h.user.talk||""),warnings:this.getWarningHistory(h.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(v))&&void 0!==e?e:h.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(v))&&void 0!==e?e:h.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(v))&&void 0!==e?e:h.user.talk},profanity:x},performer:{name:c.user,ip:o.util.isIPAddress(c.user),temp:o.util.isTempAccount(c.user),anon:o.util.isIPAddress(c.user)||o.util.isTempAccount(c.user),edits:Math.max(m.user.edits,(null===(g=m.user.contributions)||void 0===g?void 0:g.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(c.user))&&void 0!==e?e:m.user.contributions},warning:this.getWarningLevel(m.user.talk||""),warnings:this.getWarningHistory(m.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(c.user))&&void 0!==e?e:m.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(c.user))&&void 0!==e?e:m.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(c.user))&&void 0!==e?e:m.user.talk}},mentions:f,AI:{username:null},id:c.logid,timestamp:c.timestamp,comment:c.parsedcomment,ores:x.clamped||0,filters:x.matches.map(e=>({filter:e.name,id:e.match})),propagating:!1,reviewed:!1,history:!1,group:p.groups[e],type:e,simple:n,origin:c};!n&&o.AI&&(k.user.anon||o.store.whitelist.users.has(k.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(k).then(e=>{k.AI.username=e,e.flag&&this.promptUAA(k,e)}).catch(e=>k.AI.username={error:e.message})),d.push(k)}}break;case"abuselog":{const s=await o.api.parseAbuselogs(t,n,r);for(const t of s){var h,m;const{item:s,data:i}=t,a={comment:!1,diff:!1};if(l&&i.edit.diff){const e=document.createElement("div");e.innerHTML=i.edit.diff,e.textContent&&(a.diff=o.util.match(l,e.textContent))}this.watchlist.set(s.title,i.page.watched),this.histories.set(s.title,i.page.history),this.contributions.set(s.user,i.user.contributions),this.blocks.set(s.user,i.user.blocks),this.blocked.set(s.user,i.user.blocked);const r=["0","1","2","3","4","4im"],c=this.getWarningLevel(i.user.talk||"");r.indexOf(c)>r.indexOf(this.warnings.get(s.user)||"0")&&this.warnings.set(s.user,c);const u=["disallow","warn","showcaptcha","tag","none"],g=u.length;let v=g-1;for(let e=0;e<g;e++)if(s.result.has(u[e])){v=e;break}const f={page:{namespace:s.ns,title:s.title,get history(){var e;return null!==(e=o.queue.histories.get(s.title))&&void 0!==e?e:i.page.history},get watched(){var e;return null!==(e=o.queue.watchlist.get(s.title))&&void 0!==e?e:i.page.watched},metadata:i.page.metadata,categories:i.page.categories,protection:i.page.protection},user:{name:s.user,ip:o.util.isIPAddress(s.user),temp:o.util.isTempAccount(s.user),anon:o.util.isIPAddress(s.user)||o.util.isTempAccount(s.user),edits:Math.max(i.user.edits,(null===(h=i.user.contributions)||void 0===h?void 0:h.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(s.user))&&void 0!==e?e:i.user.contributions},warning:this.getWarningLevel(i.user.talk||""),warnings:this.getWarningHistory(i.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(s.user))&&void 0!==e?e:i.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(s.user))&&void 0!==e?e:i.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(s.user))&&void 0!==e?e:i.user.talk}},mentions:a,AI:{edit:null,username:null},id:s.id,revid:s.revid,timestamp:s.timestamp,comment:i.parsedcomment,minor:!1,diff:i.edit.diff,sizediff:null===(m=s.diff)||void 0===m?void 0:m.size,ores:+(1-v/(g-1)).toFixed(2),filters:s.entries.map(e=>({id:(null==e?void 0:e.filter_id)||"-1",filter:null==e?void 0:e.filter}))||[],reverts:i.page.reverts,propagating:!1,reviewed:!1,history:!1,group:p.groups[e],type:e,simple:n,origin:s};!n&&o.AI&&(o.store.settings.AI.edit_analysis.enabled&&i.edit.diff&&o.AI.analyze.edit(f).then(e=>f.AI.edit=e).catch(e=>f.AI.edit={error:e.message}).finally(()=>{var e;f.id===(null===(e=this.current.item)||void 0===e?void 0:e.id)&&o.gui.updateAIAnalysisDisplay(f.AI.edit)}),f.user.anon||o.store.whitelist.users.has(f.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(f).then(e=>{f.AI.username=e,e.flag&&this.promptUAA(f,e)}).catch(e=>f.AI.username={error:e.message})),d.push(f)}}}return d.forEach(e=>{if(e.comment){const t=(new DOMParser).parseFromString(e.comment,"text/html").body;t.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,n]=e.trim().split(/\s+/,2),s=new URL(t,`https://${this.ws.server}`).href;return n?`${s} ${n}`:s}).join(", ");e.setAttribute("srcset",t)}),e.comment=t.innerHTML;const n=(t.textContent||"").trim();e.has_comment=Boolean(n),!1===e.mentions.comment&&(e.mentions.comment=o.util.match(l,n)),e.mentions&&(e.mentions.has=Object.values(e.mentions).some(e=>e))}else e.has_comment=!1}),d}previous(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});if("pending"===this.current.type)return this.current.item=this.current.queue[Math.max(e-1,0)],this.ws.gui.renderQueue();if(e<=0){if(0===this.current.history.length)return;return this.current.queue.unshift(this.current.history.pop()),this.current.item=this.current.queue[0],this.ws.gui.renderQueue()}this.current.item=this.current.queue[e-1],this.ws.gui.renderQueue()}next(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});if(-1===e)return this.current.item=this.current.queue[0],this.ws.gui.renderQueue();if("pending"===this.current.type)return this.current.item=this.current.queue[Math.min(e+1,this.current.queue.length-1)],this.ws.gui.renderQueue();const t=this.current.item,n=p.groups[t.type];if(!t.reviewed&&("edit"===n||"abuselog"===n&&t.revid)){"watchlist"===t.type&&this.ws.api.markWatchlistSeen(t.page.title,t.id);const e="abuselog"===t.type?t.revid:t.id;if(["recent","watchlist","abuselog"].filter(e=>e!==t.type).forEach(t=>{this.queues[t].queue="abuselog"===t?this.queues[t].queue.filter(n=>n.revid!==e||(this.queues[t].history.push({...n,history:performance.now()}),!1)):this.queues[t].queue.filter(n=>n.id!==e||(this.queues[t].history.push({...n,history:performance.now()}),"watchlist"===t&&this.ws.api.markWatchlistSeen(n.page.title,n.id),!1))}),"abuselog"!==n){let e=this.queues.abuselog.queue.filter(e=>t.user.name===e.user.name&&t.page.title===e.page.title&&Math.abs(new Date(t.timestamp).getTime()-new Date(e.timestamp).getTime())<1e4);e.length>0&&Promise.allSettled(e.map(async e=>{let t=e.revid;return t||(t=await this.ws.api.getAbuseLogRevid(e.id)),t?(e.revid=t,{id:e.id,revid:t}):null})).then(e=>{const t=e.map(e=>"fulfilled"===e.status?e.value:null).filter(e=>e);this.queues.abuselog.queue=this.queues.abuselog.queue.filter(e=>!t.some(t=>t.revid===e.revid)),"abuselog"===this.current.type&&(t.forEach(e=>this.ws.gui.removeQueueItem("abuselog",e.id)),this.ws.gui.renderQueue(this.queues.abuselog.queue,this.queues.abuselog.item,"abuselog"))}).catch(()=>{})}}t.reviewed=!0,t&&this.ws.AI&&this.ws.AI.cancel.edit(t.id),this.current.queue.splice(e,1),this.ws.gui.removeQueueItem(this.current.type,t.id),0===this.current.queue.length?this.current.item=null:e<this.current.queue.length?this.current.item=this.current.queue[e]:this.current.item=this.current.queue[this.current.queue.length-1],t&&"edit"===p.groups[this.current.type]&&this.promptWelcome(t),this.current.history.push({...t,history:performance.now()}),this.ws.gui.renderQueue()}canGoPrevious(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});return-1===e?this.current.history.length>0:"pending"===this.current.type?e>0:0!==e||this.current.history.length>0}canGoNext(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});return-1===e?Boolean(this.current.queue[0]):"pending"!==this.current.type||e<this.current.queue.length-1}clear(e){"pending"!==e&&(this.queues[e].item=null,this.queues[e].queue=[],this.current.type===e&&(this.ws.gui.newCurrentItem(null),this.ws.gui.clearQueueItems()))}async promptWelcome(e){if(!this.ws.store.settings.auto_welcome.enabled&&e.user.anon&&0!==(e.user.edits||0)&&void 0!==e.user.talk&&!this.noWelcome.has(e.user.name))try{var t;const n=`User talk:${e.user.name}`,s=await this.ws.api.pagesExist([n]);if(void 0!==s[n])return null!==(t=void this.talks.set(e.user.name,s[n]))&&void 0!==t?t:s[n];await this.ws.gui.settings.waitForClose();const i=await this.ws.gui.dialog.confirm("Auto-Welcome User",`Would you like to welcome <span class="confirmation-modal-username">${this.ws.util.escape(e.user.name)}</span>?<br><br>\n\t\t\t\t\t<span style="font-size: 0.9em; color: #888;">Editing: <strong>${this.ws.util.escape(e.page.title)}</strong></span>`,{username:e.user.name,hideUAA:!1});this.noWelcome.add(e.user.name),i&&this.ws.execute({actions:[{name:"welcome-user",params:{template:"Auto"}}]},void 0,void 0,e)}catch(e){console.error("Error during auto-welcome check:",e)}}promptUAA(e,t){var n,s,i;return n=c,s=this,i=l(c,this).then(()=>d(u,this,g).call(this,e,t)).catch(()=>{}),n.set(d(n,s),i),l(c,this)}async propagate(e,t){if(e.propagating)return await e.propagating;if(e.simple){let n;e.propagating=new Promise(e=>n=e);const[s]=await this.generate(e.type,[e.origin],!1,{bypass:t});s.history=e.history,Object.assign(e,s),n(),e.propagating=!1}else this.generate(e.type,[e.origin],!1,{bypass:t}).then(([t])=>{const n=e.revid;t.history=e.history,Object.assign(e,t),e.revid=n})}loadFromItem(e){const t=this.current.type;if(p.areSameGroup(t,"edit")&&("pending"!==t||"edit"!==e.type)){this.queues[t].queue=this.queues[t].queue.filter(t=>t.id!==e.id);const n=this.queues[t].queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});n>-1&&(this.queues[t].queue[n]=e)}this.queues[t].item=this.queues[t].queue.find(t=>t.id===e.id)||e,this.ws.gui.renderQueue()}async loadFromRevision(e,t){try{let n;if(this.ws.gui.updateDiffDisplay("loading"),this.cache.full.has(t))n=this.cache.full.get(t);else{let s;if(this.cache.simple.has(t)){const e=this.cache.simple.get(t);s={revid:e.id,parentid:e.prior,ns:e.page.namespace,title:e.page.title,user:e.user.name,timestamp:e.timestamp,parsedcomment:e.comment,tags:e.origin.tags,sizediff:e.sizediff,minor:e.minor}}else{const n=await this.ws.api.getRevision(e,t,!0);if(!n)throw new Error("Revision not found");s={revid:n.revid,parentid:n.parentid,ns:n.ns,title:e,user:n.user,timestamp:n.timestamp,parsedcomment:n.parsedcomment,tags:n.tags,size:n.size,oldlen:n.oldlen||0,newlen:n.size,minor:n.minor}}[n]=await this.generate("edit",[s],!1,{bypass:!0})}const s=this.current.type;if(p.areSameGroup(s,"edit")&&"pending"!==s&&"abuselog"!==s){this.queues[s].queue=this.queues[s].queue.filter(e=>e.id!==n.id);const e=this.queues[s].queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});e>-1&&(this.queues[s].queue[e]=n)}this.queues[s].item=n,this.ws.gui.renderQueue()}catch(e){console.error("Error loading from revision:",e),document.querySelector("#diff-container").innerHTML=`<div class="error">Failed to load revision: ${this.ws.util.escape(e.message)}</div>`}}getWarningLevel(e){const t=["0","1","2","3","4","4im"];let n="0";const s=this.ws.util.monthSectionName(),i=this.ws.util.getPageSections(e);for(const e of i)if(e.title===s){const s=e.content.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/g);if(null===s)break;const i=[...s.map(e=>{const t=e.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/);return t?t[1].toString():"0"}),n].map(e=>[e,t.indexOf(e)]);n=i.sort((e,t)=>t[1]-e[1])[0][0]}return n}getWarningHistory(e){const t=[],n=this.ws.util.monthSectionName(),s=this.ws.util.getPageSections(e);for(const e of s)if(e.title===n){const n=e.content.matchAll(/<!-- Template:([\w-]+?)(\d(?:i?m)?) -->([^]+?)(?=<!-- Template:|$)/g);for(let s of n){const n=s[1],i=s[2],a=s[3],r=a.match(/(\d{2}:\d{2}.*?\d{4} \(UTC\))/);let o=r?r[1]:null;if(o&&(o=o.replace(/<[^>]*>/g,"")),o){const[,e,t,n,s]=o.match(/(\d{2}:\d{2}), (\d{1,2}) ([A-Za-z]+) (\d{4})/),i=["January","February","March","April","May","June","July","August","September","October","November","December"].indexOf(n);o=new Date(Date.UTC(s,i,t,...e.split(":"))).toUTCString()}else o=null;let l=null;const d=a.match(/\[\[User(?:[ _]talk)?:([^\]|]+)/i);d&&(l=d[1].trim());const c=a.match(/\[\[([^\]]+?)\]\]/),u=c?c[1]:null;t.push({template:n,level:i,timestamp:o,username:l,article:u,section:e.title})}}return t}}async function g(e,t){if(e.user.anon)return;if(this.ws.store.whitelist.users.has(e.user.name))return;if(!t.issues||0===t.issues.length)return;if(!t.explanation)return;const n=t.issues.map(e=>`${e.severity} ${e.policy} violation`).join(", "),s=Math.round(100*t.confidence),i=e.user.name;await this.ws.gui.settings.waitForClose();if(await this.ws.gui.dialog.confirm("Report Username to UAA",`\n\t\t\t\tThe username <span class="confirmation-modal-username">${this.ws.util.escape(i)}</span> for ${n}.<br><br>\n\t\t\t\t<strong>AI Confidence:</strong> ${s}%<br>\n\t\t\t\t<strong>Reasoning:</strong> ${t.explanation}<br>\n\t\t\t`,i)){await this.ws.gui.settings.waitForClose();const t=await this.ws.gui.dialog.UAA(e.user.name);t&&this.ws.execute({actions:[{name:"report-user-to-uaa",params:{reason:t}}]},void 0,void 0,e)}}t.Queue=p,o(p,"refresh",1e3),o(p,"types",["recent","pending","watchlist","abuselog","users"]),o(p,"groups",{void:"void",recent:"edit",pending:"edit",watchlist:"edit",edit:"edit",abuselog:"abuselog",users:"logevent"})},7054(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.WikiShield=void 0;var s=n(3241),i=n(8169),a=n(2535),r=n(4674),o=n(6151),l=n(372),d=n(8469),c=n(8678),u=n(9501),p=n(9808);function g(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function h(e,t){return e.get(m(e,t))}function m(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var v,f,b,w=new WeakMap,y=new WeakSet;class x{constructor(e,t,n,o){var c,p;g(c=this,p=y),p.add(c),function(e,t,n){g(e,t),t.set(e,n)}(this,w,{ready:[]}),this.__DEV__=o,this.started=!1,this.server=e,this.storage=new u.StorageManager,this.defaultStorage=new u.StorageManager,this.defaultStorage.load(),this.util=new s.Utility(this),this.api=new a.API(this,e,t,n),this.notifications=new r.Notifications(this),this.rights={},this.groups={},this.api.account().then(async e=>{this.rights=e.rights.reduce((e,t)=>({...e,[t]:!0}),{}),this.groups=e.groups.reduce((e,t)=>({...e,[t]:!0}),{});{const e=this.rights.review&&this.api.hasPendingChanges;document.querySelector("#queue-tab-pending").classList.toggle("hidden",!e),e||"pending"!==this.queue.current.type||this.queue.switch("recent")}await m(y,this,_).call(this),this.cleanup(),setInterval(()=>this.cleanup(),1e4),m(y,this,k).call(this,"ready")}),this.gui=new d.GUI(this),this.queue=new l.Queue(this),this.audio=new i.AudioManager(this),this.time={load:null,save:null}}get store(){return this.storage.data}disable(e,t){electron.disable(e,t)}on(e,t,n={}){return h(w,this)[e]&&h(w,this)[e].push({callback:t,options:n}),this}async init(e=null){return this.gui.build(),await this.audio.init(),await m(y,this,_).call(this,e)}async noinit(e=null){var t;const n=await m(y,this,_).call(this,e);if(null===(t=this.AI)||void 0===t||t.cancel.all(),this.store.settings.AI.enabled)if("Ollama"===this.store.settings.AI.provider)this.AI=new c.AI.providers.Ollama(this,this.store.settings.AI.Ollama);else this.AI=null;else this.AI=null;{const e=this.store.UI.queue.width;document.body.querySelector("#queue").style.width=e,document.body.querySelector("#right-container").style.width=`calc(100% - ${e})`}{const e=this.store.UI.details.width;document.body.querySelector("#right-details").style.width=e,document.body.querySelector("#right-top").style.width=e,document.body.querySelector("#main-container").style.width=`calc(100% - ${e})`}return this.gui.settings.update(),n}async start(){this.gui.start(),this.update(),this.queue.fetch(),this.started=!0}async update(){const e=performance.now();try{await this.api.account().then(e=>{this.rights=e.rights.reduce((e,t)=>({...e,[t]:!0}),{}),this.groups=e.groups.reduce((e,t)=>({...e,[t]:!0}),{})}),await this.api.getGlobalUserInfo(this.api.username).then(e=>{var t;(t=this.rights).rollback||(t.rollback=e.rights.includes("rollback"))}),this.rights.rollback||"LuniZunie"===this.api.username||this.disable("Rollback required","Your account no longer has rollback rights, which are required to use WikiShield.");{const e=this.rights.review&&this.api.hasPendingChanges;document.querySelector("#queue-tab-pending").classList.toggle("hidden",!e),e||"pending"!==this.queue.current.type||this.queue.switch("recent")}this.backup()}catch(e){console.error("Update error:",e)}setTimeout(()=>this.update(),Math.max(0,2500-(performance.now()-e)))}cleanup(){const e=Date.now();let t=!1;for(const[,n]of Object.entries(this.store.highlight))for(const[s,i]of n.entries())e>=i[1]&&(n.delete(s),t=!0);for(const[,n]of Object.entries(this.store.whitelist))for(const[s,i]of n.entries())e>=i[1]&&(n.delete(s),t=!0);t&&this.queue.current.item&&this.gui&&this.gui.renderQueue(this.queue.current.queue,this.queue.current.item)}controller(e){var t,n,s;if(this.started){if(this.gui.dialog.dialogs.active)return this.gui.dialog.controller(e);if(this.gui.settings.active)return this.gui.settings.controller(e);if(!("INPUT"===(null===(t=e.target)||void 0===t?void 0:t.tagName)||"TEXTAREA"===(null===(n=e.target)||void 0===n?void 0:n.tagName)||null!==(s=e.target)&&void 0!==s&&s.isContentEditable)&&"keydown"===e.type){if(e.repeat&&!this.store.settings.repeat_control_scripts)return;const t=(0,p.buildShortcut)(e);for(const n of this.store.control_scripts)n.keys.every(e=>e===t)&&(e.preventDefault(),this.execute(n))}}}async execute(e,t=!0,n=null,s=null){const i=(e,t)=>!e.name||("if"===e.name?this.gui.events.conditions[e.condition.name].check(this,t,e.condition.params):"if not"===e.name&&!this.gui.events.conditions[e.condition.name].check(this,t,e.condition.params));if(null===n){null!=s||(s=this.queue.current.item||1);const t=[e];let a=0;for(;t.length>0;){const e=t[0];if(i(e,s)){if(!e.actions){t.splice(0,1);continue}t.push(...e.actions)}e.name&&"if"!==e.name&&"if not"!==e.name&&this.gui.events.events[e.name].progress&&a++,t.splice(0,1)}if(a>0){let e=0;const t=new o.ProgressBar;n=(n,s)=>{const i="Done"===n?1:e/a;t.set(n,i,s),e++}}else n=e=>{}}if(i(e,s))for(const i of e.actions){if(!("name"in i))continue;const e={...i.params};for(const t of(null===(a=this.gui.events.events[i.name])||void 0===a||null===(r=a.parameters)||void 0===r?void 0:r.call(a,this,s))||[]){var a,r;t.id&&!(t.id in e)&&"default"in t&&(e[t.id]=t.default)}if("if"===i.name||"if not"===i.name)t=await this.execute(i,t,n,s);else{const a=this.gui.events.events[i.name],r=()=>{t=!1,this.audio.playSound(["action","failed"]),a.progress&&n(a.progress,!0)};try{if(t||!a.continuity){var l,d;const t=null!==(l=null===(d=a.valid)||void 0===d?void 0:d.call(a,this,s,e))&&void 0!==l?l:{valid:!0};if(t.valid){a.progress&&(n(a.progress,!1),this.audio.playSound(["action","default"])),this.store.statistics.actions_executed.total++;const t=await a.script(this,s,e);var c;if(!1===t.valid)r(),"reason"in t&&this.gui.dialog.toast("Action failed",t.reason,"error");else this.store.statistics.actions_executed.successful++,null===(c=a.successful)||void 0===c||c.call(a,this,s,e)}else r(),"reason"in t&&this.gui.dialog.toast("Action skipped",t.reason,"error")}}catch(e){r(),this.gui.dialog.toast("Please report to developer",`An error occurred while executing action "${i.name}". Check the console for details.`,"error"),console.error(`Error executing action "${i.name}":`,e.message||String(e))}}}return e.name||n("Done",!t),t}async getDEFCON(){const e="User:EnterpriseyBot/defcon",t=(await this.api.getPagesContent([e]))[e],n=t.match(/level\s*=\s*(\d+)/),s=t.match(/info\s*=\s*([\d.]+)/);return{level:n?Number(n[1]).toLocaleString():null,info:s?Number(s[1]).toLocaleString():null}}export(){this.time.save=performance.now(),this.store.statistics.session_time+=this.time.save-this.time.load;const{string:e,logs:t}=this.storage.encode();return u.StorageManager.output(t),e}backup(){this.time.save=performance.now(),this.store.statistics.session_time+=this.time.save-this.time.load,this.time.load=this.time.save;const{string:e}=this.storage.encode();return electron.localStorage.set(`WikiShield:BackupStorage-${this.api.username}`,`${Date.now()};${e}`),!0}async save(){this.backup();const e=`${Date.now()};${this.export()}`,t=this.api.username;if(window.isFinite)electron.saveAccount(t,e);else try{const n=await this.api.postWithToken({action:"options",optionname:"userjs-wikishield-storage",optionvalue:e});"success"===(null==n?void 0:n.options)||console.error(`[WikiShield] Failed to save account data for ${t}:`,n)}catch(e){console.error(`[WikiShield] Failed to save account data for ${t}:`,e)}}async load(){try{var e,t;return null!==(e=null===(t=[electron.localStorage.get(`WikiShield:BackupStorage-${this.api.username}`),(await this.api.post({action:"query",meta:"userinfo",uiprop:"options",format:"json"})).query.userinfo.options["userjs-wikishield-storage"]].reduce((e,t)=>{var n;null!=t||(t="0;e30=");let s=0,i=t;return t.includes(";")&&([s,i]=t.split(";",2),s=parseInt(s,10)),s>0&&s>(null!==(n=null==e?void 0:e.timestamp)&&void 0!==n?n:0)?{timestamp:s,data:i}:e},null))||void 0===t?void 0:t.data)&&void 0!==e?e:"e30="}catch(e){var n;return null!==(n=void console.error("Failed to load storage from wiki:",e))&&void 0!==n?n:"e30="}}page(e,t,n=!0){return`https://${this.server}/${t?`w/index.php${e}`:`wiki/${n?encodeURIComponent(e):e}`}`}open(e,t){"force"===t?t=!1:t||(t=!this.store.settings.wikipedia_popups.enabled),t?electron.openExternal(e):electron.openInBrowser(e).then(e=>{e&&requestAnimationFrame(()=>{if(this.gui.dialog.popups.push(e),!document.getElementById("popup-blocker")){const e=document.createElement("div");e.id="popup-blocker",e.innerText="Please close the popup or click anywhere on this page to continue using WikiShield.",document.body.appendChild(e),this.gui.dialog.check()}})})}}function k(e){if(h(w,this)[e])for(const n of h(w,this)[e])try{n.callback()}catch(e){}finally{var t;!0===(null===(t=n.options)||void 0===t?void 0:t.once)&&(h(w,this)[e]=h(w,this)[e].filter(e=>e!==n))}return this}async function _(e=null){const t=this.storage.decode(null!=e?e:await this.load()).logs;var n,s,i;(this.time.load=performance.now(),this.store.settings.AI.enabled)?"Ollama"===this.store.settings.AI.provider?"function"==typeof(null===(n=c.AI.providers)||void 0===n?void 0:n.Ollama)?this.AI=new c.AI.providers.Ollama(this,this.store.settings.AI.Ollama):(console.error("AI.providers.Ollama is not available. Falling back to null."),this.AI=null):(null===(s=this.AI)||void 0===s||s.cancel.all(),this.AI=null):(null===(i=this.AI)||void 0===i||i.cancel.all(),this.AI=null);return t}t.WikiShield=x,v=x,f="config",b={version:"2.0.0",changelog:{version:"6",HTML:fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/CHANGELOG.html").then(e=>e.text()).catch(()=>"<em>Could not fetch changelog.</em>")},pages:{AIV:"Wikipedia:Administrator intervention against vandalism",UAA:"Wikipedia:Usernames for administrator attention",RFPP:"Wikipedia:Requests for page protection/Increase",SRG:"Steward requests/Global"},config:{refresh:{recent:2e3,pending:2e3,watchlist:2e3,users:2e3},historyCount:10}},(f=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(f))in v?Object.defineProperty(v,f,{value:b,enumerable:!0,configurable:!0,writable:!0}):v[f]=b},4018(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.namespaces=void 0;t.namespaces=[{name:"Main",id:0,analysis_description:{edit:"",username:""}},{name:"Talk",id:1,analysis_description:{edit:"",username:""}},{name:"User",id:2,analysis_description:{edit:"Flag content unrelated to Wikipedia, such as self-promotion. If the page looks like a Wikipedia article, check that it isn't an obvious hoax, and that it is a subpage. Do not follow strict standards for these pages.",username:"Check whether the username matches the base page title. Most often, a user page should only be edited by that user. Consider alternative accounts, like User:Example creating User:Example (alt)."}},{name:"User talk",id:3,analysis_description:{edit:"",username:""}},{name:"Project",id:4,analysis_description:{edit:"",username:""}},{name:"Project talk",id:5,analysis_description:{edit:"",username:""}},{name:"File",id:6,analysis_description:{edit:"",username:""}},{name:"File talk",id:7,analysis_description:{edit:"",username:""}},{name:"MediaWiki",id:8,analysis_description:{edit:"",username:""}},{name:"MediaWiki talk",id:9,analysis_description:{edit:"",username:""}},{name:"Template",id:10,analysis_description:{edit:"",username:""}},{name:"Template talk",id:11,analysis_description:{edit:"",username:""}},{name:"Help",id:12,analysis_description:{edit:"",username:""}},{name:"Help talk",id:13,analysis_description:{edit:"",username:""}},{name:"Category",id:14,analysis_description:{edit:"",username:""}},{name:"Category talk",id:15,analysis_description:{edit:"",username:""}},{name:"Portal",id:100,analysis_description:{edit:"",username:""}},{name:"Portal talk",id:101,analysis_description:{edit:"",username:""}},{name:"Draft",id:118,analysis_description:{edit:"",username:""}},{name:"Draft talk",id:119,analysis_description:{edit:"",username:""}},{name:"MOS",id:126,analysis_description:{edit:"",username:""}},{name:"MOS talk",id:127,analysis_description:{edit:"",username:""}},{name:"TimedText",id:710,analysis_description:{edit:"",username:""}},{name:"TimedText talk",id:711,analysis_description:{edit:"",username:""}},{name:"Module",id:828,analysis_description:{edit:"Check whether the edit is meaningful Lua code. In this namespace, anything that isn't written in Lua can be safely assumed to be vandalism. Be careful about multi-line strings, as they might contain non-Lua code: check the context of the edit to make sure. Additionally, check if the edit introduces any obvious Lua syntax errors.",username:""}},{name:"Module talk",id:829,analysis_description:{edit:"",username:""}},{name:"Event",id:1728,analysis_description:{edit:"",username:""}},{name:"Event talk",id:1729,analysis_description:{edit:"",username:""}}]},6400(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.profanity=void 0;const n="\\*#\\-",s=`[${n}a4]`,i=`[${n}b6]`,a=`[${n}ck]`,r=`[${n}h]`,o=`[${n}i1y]`,l=`[${n}o0]`,d=`[${n}t7]`,c={a:s,b:i,c:a,d:`[${n}d6]`,e:`[${n}e3]`,f:`[${n}f]`,g:`[${n}g9]`,h:r,i:o,j:`[${n}j]`,k:`[${n}k]`,l:`[${n}l1]`,m:`[${n}m]`,n:`[${n}n]`,o:l,p:`[${n}p9]`,q:`[${n}q9]`,r:`[${n}r]`,s:`[${n}sz526]`,t:d,u:`[${n}uv]`,v:`[${n}vu]`,w:`[${n}w]`,x:`[${n}x]`,y:`[${n}y]`,z:`[${n}zs25]`,0:`[${n}0]`,1:`[${n}1]`,2:`[${n}2]`,3:`[${n}3]`,4:`[${n}4]`,5:`[${n}5]`,6:`[${n}6]`,7:`[${n}7]`,8:`[${n}8]`,9:`[${n}9]`};class u{constructor(e={}){this.conversion={};for(const[t,n]of Object.entries(e))for(const e of n)this.conversion[e]&&console.warn(`Profanity lookalike collision: ${e} is already mapped to ${this.conversion[e]}, remapping to ${t}`),this.conversion[e]=t}removeAccents(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}obscureReplacements(e){return e.replace(/(\/[|\\]\/|\\[|\\]\\)/g,"n").replace(/&/g,"and").replace(/zero/g,"0").replace(/one/g,"1").replace(/two/g,"2").replace(/three/g,"3").replace(/four/g,"4").replace(/five/g,"5").replace(/six/g,"6").replace(/seven/g,"7").replace(/eight/g,"8").replace(/nine/g,"9")}parseString(e,t=!1){e=t?e.replace(/[._,;:|]/g," ").replace(/\s+/g," ").toLowerCase():e.replace(/[\s._,;:|]/g,"").toLowerCase(),e=this.removeAccents(e);let n="";for(const t of e)this.conversion[t]?n+=this.conversion[t]:n+=t;return e=this.obscureReplacements(n)}analyzeObfuscation(e,t,n,s,i=!1){const a=e.substring(t,n);let r=0;if(/\s/.test(a)&&!i)return-.95;const o=this.countCaseChanges(a);if(o>0){o/Math.max(1,a.length-1)>.3&&(r+=.3)}if(/[._,;:|]/.test(a)){const e=(a.match(/[._,;:|]/g)||[]).length,t=(a.match(/[a-zA-Z0-9]/g)||[]).length;if(t>0){const n=e/t;n>.3&&(r+=Math.min(.5,.7*n))}}const l=this.checkWordBoundaries(e,t,n,s,i);r+=l;const d=this.checkSubstitution(a,s);if(d>0&&(r+=d),l<0){if(!this.isStandaloneWord(e,t,n)){this.isCamelCaseBoundary(e,t,n)?r+=.2:r-=.2}}return Math.max(-1,Math.min(1,r))}countCaseChanges(e){let t=0;for(let n=1;n<e.length;n++){const s=e[n-1],i=e[n];if(/[a-zA-Z]/.test(s)&&/[a-zA-Z]/.test(i)){s===s.toUpperCase()!==(i===i.toUpperCase())&&t++}}return t}checkWordBoundaries(e,t,n,s,i=!1){const a=t>0?e[t-1]:"",r=n<e.length?e[n]:"",o=e.substring(Math.max(0,t-8),Math.min(e.length,n+8)).toLowerCase(),l=[/WMF/,/pass(word|phrase|port|enger|ion|ive|ed|ing|es|key|code|over|by|able)/i,/class(room|mate|ified|es|ic|y|ification)/i,/grass(land|hopper|y|es)/i,/bass(ist|oon|line|es)/i,/mass(ive|acre|age|es|achusetts)/i,/assign(ment|ed|ing|s|ee|or)/i,/assess(ment|ed|ing|or|s)/i,/assemble|assembly|assertion|asset|assist|assume|assure|associate|association/i,/brass|crass|harass|morass|surpass|trespass|compass|embassy|embarrass/i,/cock(pit|tail|roach|ade|atoo|le|ney)/i,/scunthorpe|penistone|shitterton|lightwater|middlesex|sussex|essex|wessex/i,/dick(ens|inson|son|ey|ie)/i,/analyst|analytics|analyze|canal|banal/i,/therapist|therapeutic|therapy/i,/cumul(ative|us|at)|circum(stance|ference|cise|vent|navigate|scribe)/i,/butter(cup|fly|milk|scotch|fingers|nut)|buttress|button|rebuttal/i,/count(ry|er|ess|down|ing|ed|able|enance|erfeit|erpart)/i,/grape|drape|scrape|landscape|escapade/i,/shell(fish|fire|ter|ed)|eggshell|nutshell|bombshell|seashell/i,/whole(sale|some|hearted)/i,/exchange|exchequer/i,/title|titled|subtitle|entitle/i,/sextant|sextet|bisect|insect|intersect|section|sector/i,/cocktail|peacock|hancock|hitchcock|babcock|woodcock/i,/niger(ia|ian)|montenegro/i,/penisten|penetrat|penal(ty|ize|ise)|penchant|pencil|pendant|penguin|peninsula/i,/manslaughter|slaughterhouse/i,/shitake|shiitake/i,/arsenic|arsenal/i,/cummings|scumble/i,/smother|another|mother(board|land|hood)/i,/wanton|wanting|wanted|warrant/i,/trigger|bigger|digger|jigger|rigger|vigor|figure/i,/ballad|ball(room|park|istic|oon|et|ot|ard|ast)/i,/grape(fruit|vine|shot)/i,/raptor|rapport|rapid|rapier|rapture/i,/killed|killer|skill(ed|ful|s)|killjoy|kiln|kilo(gram|meter|byte|watt)/i,/bomb(ard|astic|shell|er|ing|ay)/i,/hellenic|hello|shell|othello/i,/crack(down|le|ed|ing|erjack)|firecracker/i,/jewel{1,2}/i,/skill/i];for(const e of l)if(e.test(o))return-.8;const d=/[a-zA-Z]/.test(a),c=/[a-zA-Z]/.test(r);if(d&&c){const i=e.substring(Math.max(0,t-8),t).toLowerCase(),a=e.substring(n,Math.min(e.length,n+8)).toLowerCase(),r=e.substring(Math.max(0,t-8),Math.min(e.length,n+8)).toLowerCase();return this.analyzePaddingLikelihood(i,a,s)>=.4||r.length>15&&r===r.toLowerCase()&&!/\s/.test(r)?0:-.5}if(d||c){const i=e.substring(Math.max(0,t-8),t).toLowerCase(),a=e.substring(n,Math.min(e.length,n+8)).toLowerCase();this.analyzePaddingLikelihood(i,a,s);return 0}const u=e.substring(t,n);return/\s/.test(u)&&!i?-.9:0}analyzePaddingLikelihood(e,t,n){let s=0;const i=/[bcdfghjklmnpqrstvwxyz]{3,}/i;(i.test(e)||i.test(t))&&(s+=.4);const a=t.match(/([a-z])\1{1,}/i);if(a&&a[0].length>=2){if(t.indexOf(a[0])>=t.length-3){(!/\b(ll|ss|tt|nn|mm|pp|dd|bb|gg|ff)$/i.test(a[0])||t.length<=3)&&(s+=.35)}}if(e.length<=2&&e.length>0&&(s+=.25),t.length<=3&&t.length>0){/^(er|ed|ing|ion|ly|al|ful|less|ness|ment|s)$/i.test(t)||(s+=.2)}/([qx][^u]|[jqxz]{2}|[bcdfghjklmnpqrstvwxz]{4,})/i.test(e+t)&&(s+=.3);const r=e+t;if(r.length>0){(r.match(/[aeiou]/gi)||[]).length/r.length<.2&&(s+=.3)}return Math.min(1,s)}checkSubstitution(e,t){const n=/[0-9@$!]/;if(!n.test(e))return 0;let s=0;for(const t of e)n.test(t)&&s++;const i=s/e.length;return Math.min(.3,.6*i)}isStandaloneWord(e,t,n){const s=t>0?e[t-1]:" ",i=n<e.length?e[n]:" ",a=/[\s.,;:!?()[\]{}"'`~\-_]/;return a.test(s)&&a.test(i)}isCamelCaseBoundary(e,t,n){if(0===t||n===e.length)return!1;const s=e[t-1],i=e[t],a=e[n-1],r=e[n],o=/[A-Z]/.test(i),l=/[a-z]/.test(s),d=(/[a-z]/.test(r),/[a-z]/.test(a));return!!(l&&o||d&&/[A-Z]/.test(r))}findMatchPosition(e,t,n,s){const i=e.toLowerCase();let a=-1,r=-1,o=-1;for(let n=0;n<=i.length-t.length;n++){const i=this.parseString(e.substring(n,n+t.length+10));if(i.includes(s)){const e=this.calculateSimilarity(s,i.substring(0,s.length));e>o&&(o=e,a=n,r=n+t.length)}}return{start:a,end:r}}calculateSimilarity(e,t){const n=Math.min(e.length,t.length);let s=0;for(let i=0;i<n;i++)e[i]===t[i]&&s++;return s/Math.max(e.length,t.length)}match(e){const t=this.parseString(e),n=[];for(const s of u.hits)if(s.term){const i=s.term,a=s.severity||.5,r=s.note||null,o=s.multiWord||!1;if(1===i.length&&/[^\x00-\x7F]/.test(i))continue;const l=o?this.parseString(e,!0):t,d=i.split("").reduce((e,t)=>{var n;if(o&&" "===t)return e+" *";return e+(null!==(n=c[t])&&void 0!==n?n:t)},""),u=new RegExp(d,"gi");let p;const g=this.buildPositionMap(e,o);for(;null!==(p=u.exec(l));){const t=p[0],l=p.index,d=l+t.length,c=g[l]||l,u=void 0!==g[d-1]?g[d-1]+1:d,h=this.analyzeObfuscation(e,c,u,i,o);let m=this.calculateMatchConfidence(t,i);h<-.5?m*=Math.max(.01,1+4*h):h<-.2?m*=Math.max(.05,1+2.5*h):h>.5&&(m=Math.min(1,m+.08*h));if(m>=Math.max(.05,.2-.015*i.length)){const o=e.substring(c,u);if(s.ignore&&Array.isArray(s.ignore)&&s.ignore.includes(o))continue;n.push({name:i,match:t,confidence:m,obfuscation:h,severity:a,note:r,originalSegment:o})}}}else if(s.regex){const t=e.match(new RegExp(s.regex.source,"g"));if(t)for(const e of t)n.push({name:s.name,match:e,confidence:1,obfuscation:.5,severity:s.severity||.5,note:s.note||"Pattern-based detection with high confidence. Obfuscation is moderate for formatted data.",originalSegment:e})}else s.test&&s.test(e)&&n.push({name:s.name,match:e,confidence:1,obfuscation:.5,severity:s.severity||.5,note:s.note||"Test-based detection with high confidence.",originalSegment:e});return n}buildPositionMap(e,t=!1){const n={};let s=0;for(let i=0;i<e.length;i++){const a=e[i];t?/[\s._,;:|]/.test(a)&&0!==i&&/[\s._,;:|]/.test(e[i-1])||(n[s]=i,s++):/[\s._,;:|]/.test(a)||(n[s]=i,s++)}return n}findOriginalPosition(e,t){let n=0;for(let s=0;s<e.length;s++){const i=e[s];if(!/\s/.test(i)){if(n===t)return s;n++}}return t}calculateMatchConfidence(e,t){const n=/[\*#_\-]/;let s=0,i=0,a=0,r=0;for(const t of e)n.test(t)?(i++,a++,r=Math.max(r,a)):(s++,a=0);const o=s+i;if(0===o)return 0;const l=s/o;if(l<.3)return 0;if(l<.5)return.1*l;const d=r>1?Math.max(.2,1-.2*r):1,c={};for(const t of e)n.test(t)||(c[t]=(c[t]||0)+1);let u=1;for(const e of Object.values(c))e>2&&(u*=Math.max(.4,1-.15*(e-2)));const p=o/t.length,g=p>1.5?Math.max(.2,1-.4*(p-1)):1;return Math.max(0,Math.min(1,l*d*u*g))}score(e){const t=this.match(e);let n=0;for(const e of t)n+=e.confidence;return n}evaluate(e){const t=this.match(e),n=this.parseString(e);if(0===t.length)return{finalScore:0,risk:"No",matches:[],details:{baseScore:0,weightedScore:0,severityScore:0,matchCount:0,averageConfidence:0,averageObfuscation:0,averageSeverity:0,textLength:e.length,densityPenalty:0,repetitionPenalty:0,diversityBonus:0,lengthModifier:1,highConfidenceMatches:0,mediumConfidenceMatches:0,lowConfidenceMatches:0}};let s=0,i=0,a=0,r=0,o=0,l=0;const d=new Set;for(const e of t){const t=e.severity||.5,n=e.confidence;r+=n,l+=Math.pow(n,1.5)*t,o+=e.obfuscation||0,d.add(e.name),n>=.7?s++:n>=.4?i++:a++}const c=r/t.length,u=o/t.length,p=r>0?l/r:0,g=1*s+.35*i+.08*a,h=n.length,m=t.length/Math.max(h/5,1),v=.6*Math.tanh(.3*m),f={};for(const e of n)/[a-z0-9]/.test(e)&&(f[e]=(f[e]||0)+1);let b=0;const w=Object.values(f).reduce((e,t)=>e+t,0);for(const e of Object.values(f))e>3&&(b+=Math.pow((e-3)/w,1.5));const y=Math.min(.8,2*b),x=d.size/t.length,k=x>.6?1*(x-.6):0,_=Math.max(.5,Math.min(1.5,1+Math.log10(Math.max(10,h))/10)),S=u>.4?.5*(u-.4):u<-.2?.4*Math.abs(u):0,q=t.filter(e=>e.severity>=1&&e.confidence>=.5||e.confidence>=.9).length,E=g*p*_;let L=E+.5*l+k+.8*q-(v+y+S);c<.5&&(L*=Math.max(.1,1.5*c)),L>3?L=3+1.5*Math.log10(L-2):L>1.5&&(L=1.5+.8*Math.sqrt(L-1.5)),L=Math.max(0,L);let A="No";return L>=4||q>=2?A="Critical":L>=2.5?A="High":L>=1.5?A="Medium":L>=.5&&(A="Low"),{clamped:Math.max(0,Math.min(1,L/5)),finalScore:Math.round(100*L)/100,risk:A,matches:t,details:{baseScore:Math.round(100*g)/100,weightedScore:Math.round(100*E)/100,severityScore:Math.round(100*l)/100,matchCount:t.length,uniqueMatches:d.size,averageConfidence:Math.round(100*c)/100,averageObfuscation:Math.round(100*u)/100,averageSeverity:Math.round(100*p)/100,textLength:e.length,densityPenalty:Math.round(100*v)/100,repetitionPenalty:Math.round(100*y)/100,diversityBonus:Math.round(100*k)/100,lengthModifier:Math.round(100*_)/100,obfuscationPenalty:Math.round(100*S)/100,criticalPatterns:q,highConfidenceMatches:s,mediumConfidenceMatches:i,lowConfidenceMatches:a}}}}!function(e,t,n){(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(u,"hits",[{name:"URL",regex:/(?:https?:\/\/(?:www\.)?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*(?:\/[^\s]*)?|(?:www\.)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:\/[^\s]*)?|[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.(?:com|org|net|edu|gov|mil|int|co|io|ai|app|dev|info|biz|name|pro|museum|aero|coop|jobs|mobi|travel|xxx|ac|ad|ae|af|ag|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(?:\/[^\s]*)?)/i,severity:.1,note:"URLs in usernames may indicate spam or advertising."},{name:"Phone number",regex:/(\+?\d{1,3}[-.\s]?|\(\+?\d{1,3}\)\s?)?(\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\d{4}[-.\s]?\d{3}[-.\s]?\d{3})/,severity:.3,note:"The pattern of numbers in this username resemble a phone number. Usernames containing personal information may be considered disruptive."},{name:"Email address",regex:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/,severity:.3,note:"Email addresses in usernames can indicate spam or contact sharing."},{term:"base64",severity:.2,note:"Base64 encoding may be used to obfuscate content to bypass filters."},{term:"fromhex",severity:.2,note:"Hex encoding may be used to obfuscate content to bypass filters."},{term:"1488",severity:.5,note:"Well-known Neo-Nazi symbol, however the number itself can appear in innocent contexts."},{term:"nazi",severity:1},{term:"swastika",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"卍",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"卐",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿕",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿖",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿗",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿘",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"aryan",severity:.7,note:"Associated with white supremacist ideology, though it can also be in reference to the self-designation of Indo-Iranian peoples."},{term:"fascism",severity:.5},{term:"fascist",severity:.5},{term:"facist",severity:.5},{term:"☭",severity:.5,note:"Hammer and sickle symbol, politically charged but context-dependent."},{term:"✡",severity:.4,note:"Star of David, can be used respectfully or in antisemitic contexts."},{term:"44",severity:.1,note:"Obfuscated symbol of the Nazi SS division. If appears as 'ᛋᛋ' or similar, indicates intent to reference the SS."},{term:"imbo wales",severity:.2,multiWord:!0,note:"Play on 'Jimbo Wales' name, may indicate mockery or impersonation."},{term:"sock",severity:.3,note:"May reference sockpuppet accounts but has innocent meanings."},{term:"puppet",severity:.3,note:"May reference sockpuppet accounts but has innocent meanings."},{term:"sock puppet",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"return",severity:.2,note:"Often used in usernames by sockpuppeteers."},{term:"is back",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"are back",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"timelash",severity:1,note:'Well-known sockpuppeteer ("Timelash") on Wikipedia.'},{term:"my little",severity:.8,multiWord:!0,note:"If related to 'my little pony', indicates sockpuppeteer."},{term:"my little pony",severity:1,multiWord:!0,note:"Well-known sockpuppeteer on Wikipedia."},{term:"friendship is magic",severity:1,multiWord:!0,note:"Well-known sockpuppeteer on Wikipedia."},{term:"anal",severity:.7},{term:"anus",severity:.5},{term:"sex",severity:.3},{term:"secs",severity:.05,note:"Obfuscated form of 'sex'."},{term:"seggs",severity:.2,note:"Obfuscated form of 'sex'."},{term:"willy",severity:.2,note:"Slang for penis."},{term:"wank",severity:.6,note:"British sexual slang for masturbation."},{term:"barf",severity:.3},{term:"bastard",severity:.5},{term:"batty boy",severity:.7,multiWord:!0,note:"Homophobic slur in British/Caribbean English."},{name:"bitch",regex:new RegExp(`${i+o}(${l}|${s})?${d}?${a+r}`),severity:.7},{term:"blow job",severity:.8,multiWord:!0},{term:"blowing",severity:.2,note:"Sexual innuendo but common verb."},{term:"boner",severity:.4},{term:"boob",severity:.4},{term:"booty",severity:.3},{term:"breast",severity:.4,note:"Anatomical term, but can be used inappropriately."},{term:"butt",severity:.2},{term:"bite me",severity:.5,multiWord:!0,note:"Often has defiant or provocative connotation."},{term:"butt plug",severity:.7,multiWord:!0},{term:"bollock",severity:.5,note:"British slang for testicles."},{term:"bollox",severity:.5,note:"Variant spelling of 'bollocks'."},{term:"bollix",severity:.5,note:"Variant spelling of 'bollocks'."},{term:"clit",severity:.7},{term:"cock",severity:.7},{term:"cum",severity:.7},{term:"brain dead",severity:.5,multiWord:!0,note:"Derogatory medical reference."},{term:"bukake",severity:.7},{term:"bully",severity:.5,note:"Indicates harassment behavior."},{term:"bullies",severity:.5,note:"Indicates harassment behavior."},{term:"bullied",severity:.3,note:"May indicate victimhood or boasting."},{term:"versus",severity:.4,note:"Combat/conflict framing, but legitimate word."},{term:"bumming",severity:.5,note:"British slang for anal sex or begging."},{term:"bunghole",severity:.5},{term:"cesspool",severity:.3,note:"Derogatory term for filthy place."},{term:"cesspit",severity:.3,note:"Variant of cesspool."},{term:"dick",severity:.7},{term:"prick",severity:.7},{term:"dildo",severity:.7},{term:"censor",severity:.1,note:"May indicate anti-censorship stance."},{term:"ching",severity:.8,note:"Part of racial slur against Asians."},{term:"ching chong",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"ching chang",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"wing wong",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"bot",severity:.4,note:"May indicate automated account claim."},{term:"ox long",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'cock's long'."},{term:"douche",severity:.5},{term:"cunt",severity:.7},{term:"cuck",severity:.4,note:"Derogatory term from manosphere."},{term:"curry munch",severity:.9,multiWord:!0,note:"Racist slur against South Asians."},{term:"crime",severity:.3,note:"Negative connotation but legitimate word."},{term:"pussy",severity:.7},{term:"deeznuts",severity:.3,note:"Crude joke phrase."},{term:"destroy",severity:.3,note:"Aggressive language."},{term:"destruction",severity:.3,note:"Aggressive language."},{term:"diaper",severity:.3,note:"Infantilization or fetish reference."},{term:"diarrhea",severity:.3},{term:"throbbing",severity:.5,note:"Sexual innuendo term."},{term:"dimwit",severity:.3},{term:"doo doo",severity:.3,multiWord:!0},{term:"dookie",severity:.3},{term:"fart",severity:.3},{term:"ejaculat",severity:.7},{term:"erect",severity:.5,note:"Sexual context or legitimate word."},{term:"erotic",severity:.5},{term:"fuck",severity:.8},{term:"phuck",severity:.8,note:'Alternative spelling of "fuck" to bypass detection.'},{term:"orgasm",severity:.7},{term:"rape",severity:1},{term:"lawsuit",severity:.3,note:"Legal threat implication."},{term:"fraud",severity:.5,note:"Accusation of criminal behavior."},{term:"tard",severity:.5,note:"Ableist slur suffix."},{term:"terror",severity:.7,note:"Violence/terrorism reference."},{term:"mike hunt",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'my cunt'."},{term:"mike ox",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'my cock's'."},{term:"masturbat",severity:.7},{term:"nutsack",severity:.5},{term:"ophile",severity:1,note:"Suffix for sexual predator terms like pedophile."},{term:"pedo",severity:.6},{term:"peeing",severity:.3},{term:"peanus",severity:.5,note:"Intentional misspelling of 'penis'."},{term:"penis",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"porn",severity:.7},{term:"piss",severity:.5},{term:"poop",severity:.3},{term:"prison",severity:.3,note:"Criminal context, but legitimate word."},{term:"prostitute",severity:.5,note:"Sexual work reference or insult."},{term:"queer",severity:.5,note:"Can be slur or reclaimed identity."},{term:"rectum",severity:.3,note:"Anatomical term."},{term:"report me",severity:.3,multiWord:!0,note:"Defiant/trolling phrase."},{term:"rimming",severity:.7},{term:"scrotum",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"semen",severity:.7},{term:"slut",severity:.7},{term:"sucks",severity:.3,note:"Mild profanity or legitimate verb."},{term:"sux",severity:.3,note:"Intentional misspelling of 'sucks'."},{term:"vagina",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"vadge",severity:.5,note:"Slang for vagina."},{term:"vomit",severity:.3},{term:"vulva",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"whore",severity:.7},{term:"chink",severity:1},{term:"jew",severity:.3,note:"Legitimate religious/ethnic term but tracked for antisemitic usage patterns."},{term:"nigger",severity:1},{term:"nigga",severity:1},{term:"nigguh",severity:1,note:"Phonetic spelling of racial slur."},{term:"niglet",severity:1},{term:"pajeet",severity:.7,note:"Derogatory term for South Asians."},{term:"slave",severity:.6,note:"Dehumanizing term with historical trauma, but legitimate historical uses."},{term:"master race",severity:1,multiWord:!0,note:"Nazi supremacist ideology phrase."},{term:"inferior race",severity:1,multiWord:!0},{term:"superior race",severity:1,multiWord:!0,note:"White supremacist ideology."},{term:"racist",severity:.8},{term:"racism",severity:.7},{term:"racial",severity:.3,note:"Neutral term but tracked for context in discriminatory language."},{term:"bigot",severity:.7},{term:"fag",severity:.7},{term:"taliban",severity:.7,note:"Terrorist organization reference."},{term:"antisemit",severity:1},{term:"bleed",severity:.3,note:"Can indicate violence or be medical."},{term:"bloody",severity:.3,note:"British profanity or literal blood reference."},{term:"hell",severity:.5,note:"Religious reference used as mild profanity, but legitimate uses."},{term:"damn",severity:.3},{term:"crap",severity:.3},{term:"darn",severity:.1,note:"Mild euphemism for 'damn'."},{term:"shutup",severity:.3,note:"Rude command indicating hostility."},{term:"spastic",severity:.5,note:"Ableist slur in British English, medical term in US."},{term:"disabled",severity:.1,note:"Legitimate disability term but tracked for ableist patterns."},{term:"loser",severity:.3},{term:"abuse",severity:.5,note:"Indicates harmful behavior or accusations."},{term:"spam",severity:.3,note:"Indicates unwanted content or disruption."},{term:"abusi",severity:.5,note:"Variant of 'abuse/abusive'."},{term:"hitler",severity:1},{term:"adolf",severity:.4,note:"Common name but often used in Hitler references."},{term:"gestapo",severity:1},{term:"heil",severity:.8,note:"Nazi salute reference."},{term:"final solution",severity:1,multiWord:!0,note:"Nazi euphemism for genocide."},{term:"death camp",severity:1,multiWord:!0},{term:"concentration camp",severity:1,multiWord:!0,note:"Holocaust reference, legitimate historical use but concerning in usernames."},{term:"gas chamber",severity:1,multiWord:!0},{term:"holocaust",severity:.5,note:"Historical tragedy reference, legitimate historical use."},{term:"zionis",severity:.5,note:"Political term stem, can be antisemitic depending on context."},{term:"fuhrer",severity:1},{term:"reich",severity:.7,note:"Nazi Germany reference, though legitimate German word."},{term:"massacre",severity:.7},{term:"slaughter",severity:.7},{term:"torture",severity:.7},{term:"lynch",severity:1,note:"Racist mob killing reference, though also a surname."},{term:"killer",severity:.5},{term:"mobster",severity:.5,note:"Organized crime reference."},{term:"gangster",severity:.3,note:"Criminal reference or slang."},{term:"druglord",severity:.5,note:"Drug trafficking reference."},{term:"drugs",severity:.3,note:"General term that can be legitimate or problematic."},{term:"meth",severity:.5,note:"Reference to illegal drug, though also shorthand for 'method'."},{term:"cocaine",severity:.5},{term:"heroin",severity:.5},{term:"weed",severity:.3,note:"Marijuana reference with varying legal status, also refers to plants."},{term:"marijuana",severity:.3,note:"Cannabis reference with complex legal status."},{term:"crack",severity:.5,note:"Drug reference or legitimate verb."},{term:"amphetamine",severity:.5},{term:"benzo",severity:.3,note:"Drug abbreviation or name prefix."},{term:"benzodiazepine",severity:.5},{term:"opioid",severity:.3,note:"Drug class, medical term."},{term:"opiate",severity:.3,note:"Drug class, medical term."},{term:"ketamine",severity:.5,note:"Drug reference or medical use."},{term:"rohypnol",severity:.7,note:"Date rape drug reference."},{term:"i like",severity:.2,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"i love",severity:.3,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"i hate",severity:.5,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"young",severity:.2,note:"Age reference with legitimate uses but flagged in combination."},{term:"underage",severity:.8,note:"Age reference with concerning implications in certain contexts."},{term:"teen",severity:.3,note:"Age reference, concerning in some contexts."},{term:"adolescent",severity:.2,note:"Age term, concerning in some contexts."},{term:"preteen",severity:.4,note:"Age reference with concerning implications in certain contexts."},{term:"rapist",severity:1},{term:"raping",severity:1},{term:"incest",severity:1},{term:"cult",severity:.3,note:"Religious/social group term with negative connotation."},{term:"sekt",severity:.3,note:"German for 'sect', cult reference."},{term:"disembowel",severity:1},{term:"behead",severity:1},{term:"traitor",severity:.5,note:"Accusatory term."},{term:"genocide",severity:1},{term:"ethnic clean",severity:1,multiWord:!0,note:"Euphemism for genocide."},{term:"klan",severity:1},{term:"klux",severity:1},{term:"kkk",severity:1},{term:"kill",severity:.5,note:"Violent language, but common word."},{term:"bomb",severity:.7,note:"Terrorism/violence reference."},{term:"organi",severity:.1,note:"Word stem for organization."},{term:"blog",severity:.1,note:"External site reference."},{term:"group",severity:.1,note:"Organizational term."},{term:"compan",severity:.1,note:"Company stem, spam indicator."},{term:"associat",severity:.1,note:"Association stem."},{term:"industr",severity:.1,note:"Industry stem, spam indicator."},{term:"corporate",severity:.1,note:"Business term, spam indicator."},{term:"famil",severity:.1,note:"Family stem, group indicator."},{term:"task",severity:.1,note:"Organizational term."},{term:"alliance",severity:.1,note:"Group term."},{term:"entertain",severity:.1,note:"Entertainment stem, promotional."},{term:"public",severity:.1,note:"Common term, promotional context."},{term:"private",severity:.1,note:"Common term, organizational."},{term:"troll",severity:.3,note:"Disruptive behavior indicator."},{term:"trolol",severity:.3,note:"Trolling variant/meme."},{term:"grief",severity:.3,note:"Gaming term for harassment."},{term:"password",severity:.3,note:"Security term, suspicious in username."},{term:"admin",severity:.7,note:"Role impersonation."},{term:"sysop",severity:.4,note:"Wikipedia role impersonation."},{term:"bureaucrat",severity:.5,note:"Wikipedia role impersonation."},{term:"moderator",severity:.5,note:"Role impersonation."},{term:"staff",severity:.5,note:"Role impersonation."},{term:"developer",severity:.5,note:"Role impersonation."},{term:"owner",severity:.4,note:"Role impersonation."},{term:"founder",severity:.3,note:"Role impersonation."},{term:"wmf",severity:.2,note:"Wikimedia Foundation impersonation."},{term:"foundation",severity:.3,note:"Organizational impersonation."},{term:"unblock",severity:.1,note:"Suggests blocked user."},{term:"4chan",severity:.5,note:"Imageboard site, trolling association."},{term:"8chan",severity:.3,note:"Controversial imageboard."},{term:"reddit",severity:.3,note:"External site reference."},{term:"plague",severity:.3,note:"Disease/attack term."},{term:"skibidi",severity:.1,note:"Internet meme reference."},{term:"milf",severity:.5},{term:"dilf",severity:.5},{term:"sext",severity:.5,note:"Sending sexual messages."},{term:"thot",severity:.3,note:"Derogatory sexual slang."},{term:"rizz",severity:.1,note:"Gen Z slang for charisma."},{term:"gyatt",severity:.1,note:"Sexualized Gen Z slang."},{term:"noob",severity:.1},{term:"lyric",severity:.1,note:"Possible lyrics website spammer."},{term:"propaganda",severity:.5,note:"Misinformation term."},{term:"asshole",severity:.7},{term:"fucktard",severity:.7},{term:"retard",severity:.7},{term:"imbecile",severity:.5},{term:"moron",severity:.5},{term:"chigga",severity:1},{term:"chigger",severity:1},{term:"wigga",severity:1},{term:"wigger",severity:1},{term:"igga",severity:.7,note:"Potential variant of racial slur.",ignore:["1994","ig94"]},{term:"igger",severity:.7,note:"Potential variant of racial slur."},{term:"mother fuck",severity:.7,multiWord:!0},{term:"bull shit",severity:.6,multiWord:!0},{term:"dumb ass",severity:.5,multiWord:!0},{term:"dumb fuck",severity:.7,multiWord:!0},{term:"goon",severity:.2,multiWord:!1}]);t.profanity=new u({a:["ɑ","𝑎","𝗮","𝕒","𝖆","𝓪","𝚊","𝞪","А","а","𝔞","𝒂","𝘢","𝛼","𝒶","𝙖","𝜶","𝐚","𝖺","🄰","🅰️","🅰","Ⓐ","ⓐ","@"],b:["b","𝑏","𝗯","𝕓","𝖇","𝓫","𝚋","𝞫","Ь","в","𝔟","𝒃","𝘣","𝛃","𝒷","𝙗","𝜷","𝐛","𝖻","🄱","🅱️","🅱","Ⓑ","ⓑ"],c:["c","𝑐","𝗰","𝕔","𝖈","𝓬","𝚌","ϲ","с","𝔠","𝒄","𝘤","𝒸","𝙘","𝐜","𝖼","🄲","Ⓒ","ⓒ"],d:["d","𝑑","𝗱","𝕕","𝖉","𝓭","𝚍","𝞭","ԁ","ԃ","𝔡","𝒅","𝘥","𝛿","𝒹","𝙙","𝜹","𝐝","𝖽","𝝏","🄳","Ⓓ","ⓓ"],e:["e","𝑒","𝗲","𝕖","𝖊","𝓮","𝚎","𝞮","е","𝔢","𝒆","𝘦","𝛆","𝒺","𝙚","𝜺","𝐞","𝖾","з","𝝐","🄴","Ⓔ","ⓔ","€"],f:["f","𝑓","𝗳","𝕗","𝖋","𝓯","𝚏","𝞯","ғ","ƒ","𝔣","𝒇","𝘧","𝒻","𝙛","𝜻","𝐟","𝖿","🄵","Ⓕ","ⓕ"],g:["g","𝑔","𝗴","𝕘","𝖌","𝓰","𝚐","ɡ","Ԍ","ԍ","𝔤","𝒈","𝘨","𝙜","𝐠","𝗀","🄶","Ⓖ","ⓖ"],h:["h","𝗵","𝕙","𝖍","𝓱","𝚑","һ","н","𝔥","𝒉","𝘩","ℎ","𝒽","𝙝","𝐡","𝗁","🄷","Ⓗ","ⓗ"],i:["i","𝑖","𝗶","𝕚","𝖎","𝓲","𝚒","𝞲","і","𝔦","𝒊","𝘪","𝒾","𝙞","𝜾","𝐢","𝗂","🄸","ℹ️","ℹ","Ⓘ","ⓘ","!"],j:["j","𝑗","𝗷","𝕛","𝖏","𝓳","𝚳","ј","𝔧","𝒋","𝘫","𝒿","𝙟","𝐣","𝗃","🄹","Ⓙ","ⓙ"],k:["k","𝑘","𝗸","𝕜","𝖐","𝓴","κ","к","𝔨","𝒌","𝘬","𝓀","𝙠","𝝀","𝐤","𝗄","𝞳","𝜿","қ","🄺","Ⓚ","ⓚ"],l:["l","𝑙","𝗹","𝕝","𝖑","𝓵","ⅼ","ӏ","𝔩","𝒍","𝘭","𝓁","𝙡","𝐥","𝗅","🄻","Ⓛ","ⓛ","|"],m:["m","𝑚","𝗺","𝕞","𝖒","𝓶","𝚖","м","𝔪","𝒎","𝘮","𝓂","𝙢","𝐦","𝗆","🄼","Ⓜ️","Ⓜ","ⓜ"],n:["n","𝑛","𝗻","𝕟","𝖓","𝓷","𝚗","ո","п","𝔫","𝒏","𝘯","𝓃","𝙣","𝐧","𝗇","𝞰","𝜼","🄽","Ⓝ","ⓝ"],o:["o","𝑜","𝗼","𝕠","𝖔","𝓸","𝚘","ο","о","𝔬","𝒐","𝘰","𝙤","𝝈","𝐨","𝗈","𝜽","𝝄","𝝓","𝝑","𝝋","🄾","🅾️","🅾","Ⓞ","ⓞ"],p:["p","𝑝","𝗽","𝕡","𝖕","𝓹","𝚙","ρ","р","𝔭","𝒑","𝘱","𝓅","𝙥","𝐩","𝗉","𝝆","🄿","🅿️","🅿","Ⓟ","ⓟ"],q:["q","𝑞","𝗾","𝕢","𝖖","𝓺","𝚚","ԛ","𝔮","𝒒","𝘲","𝓆","𝙦","𝐪","𝗊","🅀","Ⓠ","ⓠ"],r:["r","𝑟","𝗿","𝕣","𝖗","𝓻","𝚛","г","𝔯","𝒓","𝘳","𝓇","𝙧","𝐫","𝗋","𝞽","🅁","Ⓡ","ⓡ"],s:["s","𝑠","𝗌","𝕤","𝖘","𝓼","𝚜","ѕ","𝔰","𝒔","𝘴","𝓈","𝙨","𝐬","🅂","Ⓢ","ⓢ","$"],t:["t","𝑡","𝗍","𝕥","𝖙","𝓽","𝚝","τ","т","𝔱","𝒕","𝘵","𝓉","𝙩","𝐭","𝝉","🅃","Ⓣ","ⓣ","+"],u:["u","𝑢","𝗎","𝕦","𝖚","𝓾","𝚞","υ","𝔲","𝒖","𝘶","𝓊","𝙪","𝐮","𝛍","🅄","Ⓤ","ⓤ"],v:["v","𝑣","𝗏","𝕧","𝖛","𝓿","𝚟","ν","𝔳","𝒗","𝘷","𝓋","𝙫","𝐯","𝞶","𝝂","𝝊","🅅","Ⓥ","ⓥ"],w:["w","𝑤","𝗐","𝕨","𝖜","𝔀","𝚠","ω","ш","𝔴","𝒘","𝘸","𝓌","𝙬","𝐰","𝝎","𝝍","🅆","Ⓦ","ⓦ"],x:["x","𝑥","𝗑","𝕩","𝖝","𝔁","𝚡","χ","х","𝔵","𝒙","𝘹","𝓍","𝙭","𝐱","𝝒","𝝌","🅇","Ⓧ","ⓧ"],y:["y","𝑦","𝗒","𝕪","𝖞","𝔂","𝚢","у","𝔶","𝒚","𝘺","𝓎","𝙮","𝐲","𝞬","𝜸","𝞴","🅈","Ⓨ","ⓨ"],z:["z","𝑧","𝗓","𝕫","𝖟","𝔃","𝚣","ζ","𝔷","𝒛","𝘻","𝓏","𝙯","𝐳","🅉","Ⓩ","ⓩ"],0:["0","𝟎","𝟬","𝟢"],1:["1","𝟏","𝟭","𝟣","①","➀","❶","➊","⓵"],2:["2","𝟐","𝟮","𝟤","②","➁","❷","➋","⓶"],3:["3","𝟑","𝟯","𝟥","③","➂","❸","➌","⓷"],4:["4","𝟒","𝟰","𝟦","④","➃","❹","➍","⓸","ᛋ"],5:["5","𝟓","𝟱","𝟧","⑤","➄","❺","➎","⓹"],6:["6","𝟔","𝟲","𝟨","⑥","➅","❻","➏","⓺"],7:["7","𝟕","𝟳","𝟩","⑦","➆","❼","➐","⓻"],8:["8","𝟖","𝟴","𝟪","⑧","➇","❽","➑","⓼"],9:["9","𝟗","𝟵","𝟫","⑨","➈","❾","➒","⓽"]})},4712(e,t){function n(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function s(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;var i=new WeakSet;function a(e,t,n=!1){const s=(new Date).toISOString();this.logs.push({type:e,timestamp:s,message:t,expected:n})}t.Logger=class{constructor(){n(this,i),this.logs=[]}getLogs(){return[...this.logs]}log(e,t){s(i,this,a).call(this,"log",e,t)}warn(e,t){s(i,this,a).call(this,"warn",e,t)}error(e,t){s(i,this,a).call(this,"error",e,t)}dev(e,t){s(i,this,a).call(this,"dev",e,t)}}},9501(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.StorageManager=void 0;var s,i,a,r=n(4712),o=n(4029);n(9458),n(7345),n(7704),n(8415);class l{static get versions(){return new Map([[0,o.Version.v0],[1,o.Version.v1],[2,o.Version.v2],[3,o.Version.v3]])}constructor(){this.reset(new r.Logger)}reset(e){return null==e||e.log("Resetting storage to default."),this.data=l.version.default,l.version.init(e,this.data),l.version.validate(),l.version.construct(),this.data}load(e={}){var t,n;const s=new r.Logger;let i=null!==(n=(t=e).version)&&void 0!==n?n:t.version=0;if(l.versions.has(i)){const t=l.version.number;for(;i!==t;){const t=l.versions.get(i+1);if(!("function"==typeof(null==t?void 0:t.constructor)&&new t instanceof o.Version)){s.dev("[MISSING_UPGRADE_METHOD] Uh oh! Something has gone wrong; this message should never appear. Please report this to the WikiShield developers."),e=this.reset(s);break}s.log(`Upgrading storage from version ${i} to ${i+1}`,!0);try{if(!t.init(s,e)){e=this.reset(s);break}(e=t.upgrade()).version=++i}catch(t){s.error(`Error upgrading storage from version ${i} to ${i+1}: ${t}`),e=this.reset(s);break}}i=e.version,s.log(`Initializing storage at version ${i}.`,!0),l.version.init(s,e),s.log(`Validating storage at version ${i}.`,!0),l.version.validate(),s.log(`Constructing storage at version ${i}.`,!0),e=l.version.construct(),s.log(`Storage loaded successfully at version ${i}.`,!0),this.data=e}else s.error(`Storage version ${i} is corrupted or unsupported.`),this.reset(s);return{data:this.data,logs:s.getLogs()}}save(){const e=new r.Logger,t=l.version.number;e.log(`Initializing storage at version ${t}.`,!0),l.version.init(e,this.data),e.log(`Deconstructing storage at version ${t}.`,!0);const n=l.version.deconstruct();return e.log(`Storage saved successfully at version ${t}.`,!0),{data:n,logs:e.getLogs()}}decode(e){try{return this.load(JSON.parse(atob(e.trim()||"e30=")))}catch(e){return this.load({})}}encode(){const{data:e,logs:t}=this.save();return{string:btoa(JSON.stringify(e)),logs:t}}static output(e,t="<unknown>",n=console){var s;const i=!e.some(e=>!e.expected);null==n||null===(s=n.log)||void 0===s||s.call(n,`[${i?" ":"X"}] WikiShield Storage Logs: ${t}`);for(const t of e){var a;let e=`[${t.expected?" ":"X"}][${t.timestamp}][Storage]`,s=t.type;"dev"===s&&(s="error",e=`#DEV# ${e}`),null==n||null===(a=n[s])||void 0===a||a.call(n,`${e} ${t.message}`)}}static okay(e,t=console){var n,s,i,a;null!=e||(e=(new l).load(l.versions.get(0).default));const r=!(null===(n=null===(s=e.logs)||void 0===s||null===(i=s.some)||void 0===i?void 0:i.call(s,e=>!e.expected))||void 0===n||n);return r||(null!==(a=void l.output(e.logs,"Storage Check",t))&&void 0!==a?a:r)}}t.StorageManager=l,s=l,i="version",a=o.Version.v3,(i=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(i))in s?Object.defineProperty(s,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):s[i]=a},330(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.isURL=t.isObject=void 0;t.isObject=e=>null!==e&&"object"==typeof e&&!Array.isArray(e);t.isURL=e=>{try{return new URL(e),!0}catch(e){return!1}}},4029(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Version=void 0;var s=n(4712),i=n(330);function a(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class r{static sanitize(e,t,n=null){var s;const i=e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.loadedData);if(void 0===i)return null!==(s=void this.loadedLogger.warn(`Missing expected key path [ ${e.join(" -> ")} ] in stored data, defaulting to fallback value.`))&&void 0!==s?s:t;if("function"==typeof n){var a;const s=n(i);return void 0===s?null!==(a=void this.loadedLogger.warn(`Invalid value at key path [ ${e.join(" -> ")} ] in stored data, defaulting to fallback value.`))&&void 0!==a?a:t:s}return i}static exists(...e){return void 0!==e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.loadedData)}static deprecated(...e){var t;return!!this.exists(...e)&&(null===(t=void this.loadedLogger.warn(`Skipped deprecated key path [ ${e.join(" -> ")} ] in stored data.`,!0))||void 0===t||t)}static reset(...e){this.loadedLogger.warn(`Resetting key path [ ${e.join(" -> ")} ] in stored data to default value.`);const t=e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.default);if(void 0===t)return void this.loadedLogger.dev(`Could not find default value for key path [ ${e.join(" -> ")} ] in stored data.`);const n=e.pop();e.reduce((e,t)=>(void 0===e[t]&&(e[t]={}),e[t]),this.loadedData)[n]=t}static restrictObject(e,...t){var n;if(!(0,i.isObject)(e))return null!==(n=void this.reset(...t))&&void 0!==n&&n;const s=Object.keys(t.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.default));return Object.keys(e).forEach(n=>{s.includes(n)||(this.loadedLogger.warn(`Removing unexpected key [ ${[...t,n].join(" -> ")} ] from stored data.`),delete e[n])}),!0}static get default(){return{}}static init(e,t){return this.loadedLogger=e,this.loadedData=t,!0}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");return{}}static validate(){var e;const t=this.loadedData;return this.restrictObject(t),t.version===this.number||null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e}}t.Version=r,a(r,"loadedLogger",new s.Logger),a(r,"loadedData",{}),a(r,"number",0)},9458(e,t,n){var s,i,a,r,o=n(4029);o.Version.v0=(s=class extends o.Version{static get default(){return{version:0,changelog:"0",options:{maxQueueSize:50,maxEditCount:50,minimumORESScore:0,enableSoundAlerts:!0,soundAlertORESScore:.95,enableUsernameHighlighting:!0,enableWelcomeLatin:!1,enableAutoWelcome:!1,enableEditAnalysis:!1,enableUsernameAnalysis:!1,enableAutoReporting:!0,selectedAutoReportReasons:{Vandalism:!0,"Subtle vandalism":!0,"Image vandalism":!0,Sandbox:!0,Unsourced:!0,"Unsourced (BLP)":!0,"Unsourced genre":!0,POV:!1,Commentary:!0,"AI-generated":!0,"AI-generated (talk)":!0,"MOS violation":!1,Censoring:!1,Disruption:!0,Deleting:!0,Errors:!0,"Editing tests":!0,Chatting:!1,Jokes:!0,Owning:!1,Advertising:!0,"Spam links":!0,"Personal attacks":!0,TPO:!0,"AfD removal":!0},zen:{enabled:!1,sounds:!0,watchlist:!1,notifications:!0,editCount:!1,toasts:!1},enableCloudStorage:!0,masterVolume:.5,volumes:{click:.5,notification:.5,watchlist:.5,alert:.5,whoosh:.5,warn:.5,rollback:.5,report:.5,thank:.5,protection:.5,block:.5,sparkle:.5,success:.5,error:.5},soundMappings:{click:"click",notification:"notify",watchlist:"ping",alert:"alert",whoosh:"whoosh",warn:"warn",rollback:"rollback",report:"report",thank:"thank",protection:"protection",block:"block",sparkle:"sparkle",success:"success",error:"error"},watchlistExpiry:"1 week",whitelistExpiry:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlightedExpiry:{users:"1 week",pages:"1 week",tags:"1 week"},wiki:"en",namespacesShown:[0],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:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlightUser",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:"Mentor"}}]}],selectedPalette:0,theme:"theme-light"},statistics:{reviewed:0,reverts:0,reverts:0,reports:0,warnings:0,welcomes:0,whitelisted:0,highlighted:0,blocks:0,sessionStart:Date.now()},whitelist:{users:[],pages:[],tags:[]},highlighted:{users:[],pages:[],tags:[]},queueWidth:"15vw",detailsWidth:"15vw"}}},i=s,r=0,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},7345(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(4029);g.Version.v1=(s=class extends g.Version{static get default(){return{version:1,changelog:"3",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,recent:{enabled:!0,order:0},flagged:{enabled:!0,order:1},users:{enabled:!0,order:2},watchlist:{enabled:!0,order:3}},cloud_storage:{enabled:!0},username_highlighting:{enabled:!0,fuzzy:!0},auto_welcome:{enabled:!0},expiry:{watchlist:"1 week",whitelist:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlight:{users:"1 week",pages:"1 week",tags:"1 week"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Unsourced","Unsourced (BLP)","Unsourced genre","Commentary","AI-generated","AI-generated (talk)","Censoring",,"Disruption","Deleting","Errors","Editing tests","Jokes","Advertising","Spam links","Personal attacks","TPO","AfD removal"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.notice":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},notices:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}}},UI:{theme:{palette:0},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlightUser",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:"Auto"}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");this.deprecated("options","enableWelcomeLatin"),this.deprecated("options","volumes","whoosh"),this.deprecated("options","volumes","warn"),this.deprecated("options","volumes","rollback"),this.deprecated("options","volumes","thank"),this.deprecated("options","volumes","sparkle"),this.deprecated("options","volumes","watchlist"),this.deprecated("options","volumes","success"),this.deprecated("options","volumes","error"),this.deprecated("options","soundMappings"),this.deprecated("options","wiki"),this.deprecated("options","showTemps"),this.deprecated("options","showUsers"),this.deprecated("options","sortQueueItems"),this.deprecated("options","theme"),this.deprecated("options","zen","editCount"),this.deprecated("options","zen","watchlist");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:e.settings.performance.startup},namespaces:this.sanitize(["options","namespacesShown"],e.settings.namespaces),queue:{max_size:this.sanitize(["options","maxQueueSize"],e.settings.queue.max_size),max_edits:this.sanitize(["options","maxEditCount"],e.settings.queue.max_edits),min_ores:this.sanitize(["options","minimumORESScore"],e.settings.queue.min_ores),recent:{enabled:e.settings.queue.recent.enabled,order:e.settings.queue.recent.order},flagged:{enabled:e.settings.queue.flagged.enabled,order:e.settings.queue.flagged.order},users:{enabled:e.settings.queue.users.enabled,order:e.settings.queue.users.order},watchlist:{enabled:e.settings.queue.watchlist.enabled,order:e.settings.queue.watchlist.order}},cloud_storage:{enabled:this.sanitize(["options","enableCloudStorage"],e.settings.cloud_storage.enabled)},username_highlighting:{enabled:this.sanitize(["options","enableUsernameHighlighting"],e.settings.username_highlighting.enabled),fuzzy:e.settings.username_highlighting.fuzzy},auto_welcome:{enabled:this.sanitize(["options","enableAutoWelcome"],e.settings.auto_welcome.enabled)},expiry:{watchlist:this.sanitize(["options","watchlistExpiry"],e.settings.expiry.watchlist),whitelist:{users:this.sanitize(["options","whitelistExpiry","users"],e.settings.expiry.whitelist.users),pages:this.sanitize(["options","whitelistExpiry","pages"],e.settings.expiry.whitelist.pages),tags:this.sanitize(["options","whitelistExpiry","tags"],e.settings.expiry.whitelist.tags)},highlight:{users:this.sanitize(["options","highlightedExpiry","users"],e.settings.expiry.highlight.users),pages:this.sanitize(["options","highlightedExpiry","pages"],e.settings.expiry.highlight.pages),tags:this.sanitize(["options","highlightedExpiry","tags"],e.settings.expiry.highlight.tags)}},auto_report:{enabled:this.sanitize(["options","enableAutoReporting"],e.settings.auto_report.enabled),for:this.sanitize(["options","selectedAutoReportReasons"],e.settings.auto_report.for,e=>{if((0,o.isObject)(e))return e["AI-generated"]=e["AI-Generated"],delete e["AI-Generated"],e["AI-generated (talk)"]=e["AI-Generated (talk)"],delete e["AI-Generated (talk)"],Object.keys(e).filter(t=>!0===(null==e?void 0:e[t]))})},AI:{enabled:this.sanitize(["options","enableOllamaAI"],e.settings.AI.enabled),provider:e.settings.AI.provider,edit_analysis:{enabled:this.sanitize(["options","enableEditAnalysis"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["options","enableUsernameAnalysis"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["options","ollamaServerUrl"],e.settings.AI.Ollama.server),model:this.sanitize(["options","ollamaModel"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["options","enableSoundAlerts"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["options","soundAlertORESScore"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["options","masterVolume"],e.settings.audio.volume.master),"master.startup":e.settings.audio.volume["master.startup"],"master.music":e.settings.audio.volume["master.music"],"master.music.zen_mode":e.settings.audio.volume["master.music.zen_mode"],"master.ui":e.settings.audio.volume["master.ui"],"master.ui.click":this.sanitize(["options","volumes","click"],e.settings.audio.volume["master.ui.click"]),"master.queue":e.settings.audio.volume["master.queue"],"master.queue.ores":this.sanitize(["options","volumes","alert"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":e.settings.audio.volume["master.queue.mention"],"master.notification":e.settings.audio.volume["master.notification"],"master.notification.alert":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.alert"]),"master.notification.notice":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.notice"]),"master.notification.toast":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.toast"]),"master.action":e.settings.audio.volume["master.action"],"master.action.default":e.settings.audio.volume["master.action.default"],"master.action.failed":e.settings.audio.volume["master.action.failed"],"master.action.report":this.sanitize(["options","volumes","report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["options","volumes","block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["options","volumes","protection"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["options","zen","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["options","zen","sounds"],e.settings.zen_mode.sound.enabled)},music:{enabled:e.settings.zen_mode.music.enabled},alerts:{enabled:this.sanitize(["options","zen","notifications"],e.settings.zen_mode.alerts.enabled)},notices:{enabled:this.sanitize(["options","zen","notifications"],e.settings.zen_mode.notices.enabled)},toasts:{enabled:this.sanitize(["options","zen","toasts"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:e.settings.zen_mode.badges.enabled}}},UI:{theme:{palette:this.sanitize(["options","selectedPalette"],e.UI.theme.palette)},queue:{width:this.sanitize(["queueWidth"],e.UI.queue.width)},details:{width:this.sanitize(["detailsWidth"],e.UI.details.width)}},control_scripts:this.sanitize(["options","controlScripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name){if(!(e.condition in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else switch(e.name){case"welcome":if(!(0,o.isObject)(e.params))return!0;switch(e.params.template){case"Links":e.params.template="Graphical";break;case"Latin":e.params.template="Non-Latin";break;case"Mentor":return this.loadedLogger.warn(`Skipped deprecated "Mentor" welcome template at key [${[...n,s,"params","template"].join(" -> ")}].`,!0),!1}break;case"warn":if(!(0,o.isObject)(e.params))return!0;switch(e.params.warningType){case"AI-Generated":e.params.warningType="AI-generated";break;case"AI-Generated (talk)":e.params.warningType="AI-generated (talk)"}}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:e.statistics.edits_reviewed.total,thanked:e.statistics.edits_reviewed.thanked},recent_changes_reviewed:{total:e.statistics.recent_changes_reviewed.total},pending_changes_reviewed:{total:e.statistics.pending_changes_reviewed.total,accepted:e.statistics.pending_changes_reviewed.accepted,rejected:e.statistics.pending_changes_reviewed.rejected},watchlist_changes_reviewed:{total:e.statistics.watchlist_changes_reviewed.total},users_reviewed:{total:e.statistics.users_reviewed.total},reverts_made:{total:e.statistics.reverts_made.total,good_faith:e.statistics.reverts_made.good_faith,from_recent_changes:e.statistics.reverts_made.from_recent_changes,from_pending_changes:e.statistics.reverts_made.from_pending_changes,from_watchlist:e.statistics.reverts_made.from_watchlist,from_loaded_edits:e.statistics.reverts_made.from_loaded_edits},users_welcomed:{total:e.statistics.users_welcomed.total},warnings_issued:{total:e.statistics.warnings_issued.total,level_1:e.statistics.warnings_issued.level_1,level_2:e.statistics.warnings_issued.level_2,level_3:e.statistics.warnings_issued.level_3,level_4:e.statistics.warnings_issued.level_4,level_4im:e.statistics.warnings_issued.level_4im},reports_filed:{total:e.statistics.reports_filed.total,AIV:e.statistics.reports_filed.AIV,UAA:e.statistics.reports_filed.UAA,RFPP:e.statistics.reports_filed.RFPP},watchlist:{watched:e.statistics.watchlist.watched,unwatched:e.statistics.watchlist.unwatched},items_whitelisted:{total:e.statistics.items_whitelisted.total,users:e.statistics.items_whitelisted.users,pages:e.statistics.items_whitelisted.pages,tags:e.statistics.items_whitelisted.tags},items_highlighted:{total:e.statistics.items_highlighted.total,users:e.statistics.items_highlighted.users,pages:e.statistics.items_highlighted.pages,tags:e.statistics.items_highlighted.tags},blocks_issued:{total:e.statistics.blocks_issued.total},pages_protected:{total:e.statistics.pages_protected.total},actions_executed:{total:e.statistics.actions_executed.total,successful:e.statistics.actions_executed.successful},session_time:e.statistics.session_time},highlight:{users:this.sanitize(["highlighted","users"],e.highlight.users),pages:this.sanitize(["highlighted","pages"],e.highlight.pages),tags:this.sanitize(["highlighted","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),t.version!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const g=t.settings.namespaces;Array.isArray(g)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const h=t.settings.queue;this.restrictObject(h,"settings","queue");{const m=t.settings.queue.max_size;"number"==typeof m&&Number.isInteger(m)&&m>0||this.reset("settings","queue","max_size")}{const v=t.settings.queue.max_edits;"number"==typeof v&&Number.isInteger(v)&&v>0||this.reset("settings","queue","max_edits")}{const f=t.settings.queue.min_ores;"number"==typeof f&&f>=0&&f<=1||this.reset("settings","queue","min_ores")}["recent","flagged","users","watchlist"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const b=t.settings.cloud_storage;this.restrictObject(b,"settings","cloud_storage");"boolean"!=typeof t.settings.cloud_storage.enabled&&this.reset("settings","cloud_storage","enabled")}{const w=t.settings.username_highlighting;this.restrictObject(w,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const y=t.settings.auto_welcome;this.restrictObject(y,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const x=new Set(["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"]),k=t.settings.expiry;this.restrictObject(k,"settings","expiry");{const _=t.settings.expiry.watchlist;x.has(_)||this.reset("settings","expiry","watchlist")}{const S=t.settings.expiry.whitelist;this.restrictObject(S,"settings","expiry","whitelist");{const q=t.settings.expiry.whitelist.users;x.has(q)||this.reset("settings","expiry","whitelist","users")}{const E=t.settings.expiry.whitelist.pages;x.has(E)||this.reset("settings","expiry","whitelist","pages")}{const L=t.settings.expiry.whitelist.tags;x.has(L)||this.reset("settings","expiry","whitelist","tags")}}{const A=t.settings.expiry.highlight;this.restrictObject(A,"settings","expiry","highlight");{const T=t.settings.expiry.highlight.users;x.has(T)||this.reset("settings","expiry","highlight","users")}{const C=t.settings.expiry.highlight.pages;x.has(C)||this.reset("settings","expiry","highlight","pages")}{const z=t.settings.expiry.highlight.tags;x.has(z)||this.reset("settings","expiry","highlight","tags")}}}{const M=t.settings.auto_report;this.restrictObject(M,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const $=t.settings.auto_report.for;Array.isArray($)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const O=t.settings.AI;this.restrictObject(O,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const I=t.settings.AI.edit_analysis;this.restrictObject(I,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const P=t.settings.AI.username_analysis;this.restrictObject(P,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const j=t.settings.AI.Ollama;this.restrictObject(j,"settings","AI","Ollama");{const W=t.settings.AI.Ollama.server;(0,o.isURL)(W)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const D=t.settings.audio;this.restrictObject(D,"settings","audio");{const R=t.settings.audio.ores_alert;this.restrictObject(R,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const U=t.settings.audio.ores_alert.threshold;"number"==typeof U&&U>=0&&U<=1||this.reset("settings","audio","ores_alert","threshold")}}{const N=t.settings.audio.volume;this.restrictObject(N,"settings","audio","volume");const H=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.notice","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const F of H){const V=t.settings.audio.volume[F];"number"==typeof V&&V>=0&&V<=1||this.reset("settings","audio","volume",F)}}}{const B=t.settings.zen_mode;this.restrictObject(B,"settings","zen_mode");"boolean"!=typeof B.enabled&&this.reset("settings","zen_mode","enabled");{const G=t.settings.zen_mode.sound;this.restrictObject(G,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const Q=t.settings.zen_mode.music;this.restrictObject(Q,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const Y=t.settings.zen_mode.alerts;this.restrictObject(Y,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const Z=t.settings.zen_mode.notices;this.restrictObject(Z,"settings","zen_mode","notices");"boolean"!=typeof t.settings.zen_mode.notices.enabled&&this.reset("settings","zen_mode","notices","enabled")}{const K=t.settings.zen_mode.toasts;this.restrictObject(K,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const X=t.settings.zen_mode.badges;this.restrictObject(X,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}}{const J=t.UI;this.restrictObject(J,"UI");{const ee=t.UI.theme;this.restrictObject(ee,"UI","theme");{const te=t.UI.theme.palette;"number"==typeof te&&Number.isInteger(te)&&te>=0&&te<=3||this.reset("UI","theme","palette")}}{const ne=t.UI.queue;this.restrictObject(ne,"UI","queue");{const se=t.UI.queue.width;"string"==typeof se&&se.endsWith("vw")||this.reset("UI","queue","width");const ie=parseFloat(se.slice(0,-2));"number"==typeof ie&&!isNaN(ie)&&ie>=10&&ie<=30||this.reset("UI","queue","width")}}{const ae=t.UI.details;this.restrictObject(ae,"UI","details");{const re=t.UI.details.width;"string"==typeof re&&re.endsWith("vw")||this.reset("UI","details","width");const oe=parseFloat(re.slice(0,-2));"number"==typeof oe&&!isNaN(oe)&&oe>=10&&oe<=30||this.reset("UI","details","width")}}}{const le=t.control_scripts;function de(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name){var i;if(!(e.condition in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${e.condition} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]),e.actions=de.call(this,e.actions,...t,n,"actions")}else{var a;if(!(e.name in c.events))return this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`),!1;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=null!==(a=c.events[e.name].parameters)&&void 0!==a?a:[],i=new Set;for(const a of s)i.add(a.id),"choice"===a.type&&(a.id in e.params||(this.loadedLogger.warn(`Resetting missing choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]),a.options.includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]));for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(le)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>p.controls.has(e)),t.control_scripts[n].actions=de.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const ce=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,ue=t.statistics;this.restrictObject(ue,"statistics");{const pe=t.statistics.edits_reviewed;this.restrictObject(pe,"statistics","edits_reviewed");ce(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");ce(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const ge=t.statistics.recent_changes_reviewed;this.restrictObject(ge,"statistics","recent_changes_reviewed");ce(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const he=t.statistics.pending_changes_reviewed;this.restrictObject(he,"statistics","pending_changes_reviewed");ce(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");ce(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");ce(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const me=t.statistics.watchlist_changes_reviewed;this.restrictObject(me,"statistics","watchlist_changes_reviewed");ce(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const ve=t.statistics.users_reviewed;this.restrictObject(ve,"statistics","users_reviewed");ce(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const fe=t.statistics.reverts_made;this.restrictObject(fe,"statistics","reverts_made");ce(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");ce(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");ce(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");ce(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");ce(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");ce(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const be=t.statistics.users_welcomed;this.restrictObject(be,"statistics","users_welcomed");ce(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const we=t.statistics.warnings_issued;this.restrictObject(we,"statistics","warnings_issued");ce(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");ce(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");ce(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");ce(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");ce(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");ce(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const ye=t.statistics.reports_filed;this.restrictObject(ye,"statistics","reports_filed");ce(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");ce(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");ce(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");ce(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP")}{const xe=t.statistics.watchlist;this.restrictObject(xe,"statistics","watchlist");ce(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");ce(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const ke=t.statistics.items_whitelisted;this.restrictObject(ke,"statistics","items_whitelisted");ce(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");ce(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");ce(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");ce(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const _e=t.statistics.items_highlighted;this.restrictObject(_e,"statistics","items_highlighted");ce(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");ce(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");ce(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");ce(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const Se=t.statistics.blocks_issued;this.restrictObject(Se,"statistics","blocks_issued");ce(t.statistics.blocks_issued.total)||this.reset("statistics","blocks_issued","total")}{const qe=t.statistics.pages_protected;this.restrictObject(qe,"statistics","pages_protected");ce(t.statistics.pages_protected.total)||this.reset("statistics","pages_protected","total")}{const Ee=t.statistics.actions_executed;this.restrictObject(Ee,"statistics","actions_executed");ce(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");ce(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const Le=t.statistics.session_time;"number"==typeof Le&&Le>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Ae=t.highlight;this.restrictObject(Ae,"highlight");{const Te=t.highlight.users;Array.isArray(Te)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const Ce=t.highlight.pages;Array.isArray(Ce)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const ze=t.highlight.tags;Array.isArray(ze)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const Me=t.whitelist;this.restrictObject(Me,"whitelist");{const $e=t.whitelist.users;Array.isArray($e)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const Oe=t.whitelist.pages;Array.isArray(Oe)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const Ie=t.whitelist.tags;Array.isArray(Ie)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=1,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},7704(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(4029);g.Version.v2=(s=class extends g.Version{static get default(){return{version:2,changelog:"6",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,recent:{enabled:!0,order:0},flagged:{enabled:!0,order:1},users:{enabled:!0,order:2},watchlist:{enabled:!0,order:3}},cloud_storage:{enabled:!0},username_highlighting:{enabled:!0,fuzzy:!0},wikipedia_popups:{enabled:!0},auto_welcome:{enabled:!1},expiry:{watchlist:"1 week",whitelist:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlight:{users:"1 week",pages:"1 week",tags:"1 week"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Deliberate errors","Disruptive editing","Editing tests","Commentary","Inappropriate jokes","Deleting","Unsourced","Unsourced (BLP)","Unsourced genre","Original research","Censoring","AI-generated","AI-generated (talk)","Personal attacks","Harassment","TPO",,"AfD removal","Advertising","Spam links","Inappropriate edit summary","Misleading edit summary"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.notice":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},notices:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}},repeat_control_scripts:!0},UI:{theme:{palette:0},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warning:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]},{name:"highlightUser",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:"Auto"}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]},favorite:{warnings:[],reverts:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:this.sanitize(["settings","performance","startup"],e.settings.performance.startup)},namespaces:this.sanitize(["settings","namespaces"],e.settings.namespaces),queue:{max_size:this.sanitize(["settings","queue","max_size"],e.settings.queue.max_size),max_edits:this.sanitize(["settings","queue","max_edits"],e.settings.queue.max_edits),min_ores:this.sanitize(["settings","queue","min_ores"],e.settings.queue.min_ores),recent:{enabled:this.sanitize(["settings","queue","recent","enabled"],e.settings.queue.recent.enabled),order:this.sanitize(["settings","queue","recent","order"],e.settings.queue.recent.order)},flagged:{enabled:this.sanitize(["settings","queue","flagged","enabled"],e.settings.queue.flagged.enabled),order:this.sanitize(["settings","queue","flagged","order"],e.settings.queue.flagged.order)},users:{enabled:this.sanitize(["settings","queue","users","enabled"],e.settings.queue.users.enabled),order:this.sanitize(["settings","queue","users","order"],e.settings.queue.users.order)},watchlist:{enabled:this.sanitize(["settings","queue","watchlist","enabled"],e.settings.queue.watchlist.enabled),order:this.sanitize(["settings","queue","watchlist","order"],e.settings.queue.watchlist.order)}},cloud_storage:{enabled:this.sanitize(["settings","cloud_storage","enabled"],e.settings.cloud_storage.enabled)},username_highlighting:{enabled:this.sanitize(["settings","username_highlighting","enabled"],e.settings.username_highlighting.enabled),fuzzy:this.sanitize(["settings","username_highlighting","fuzzy"],e.settings.username_highlighting.fuzzy)},wikipedia_popups:{enabled:e.settings.wikipedia_popups.enabled},auto_welcome:{enabled:this.sanitize(["settings","auto_welcome","enabled"],e.settings.auto_welcome.enabled)},expiry:{watchlist:this.sanitize(["settings","expiry","watchlist"],e.settings.expiry.watchlist),whitelist:{users:this.sanitize(["settings","expiry","whitelist","users"],e.settings.expiry.whitelist.users),pages:this.sanitize(["settings","expiry","whitelist","pages"],e.settings.expiry.whitelist.pages),tags:this.sanitize(["settings","expiry","whitelist","tags"],e.settings.expiry.whitelist.tags)},highlight:{users:this.sanitize(["settings","expiry","highlight","users"],e.settings.expiry.highlight.users),pages:this.sanitize(["settings","expiry","highlight","pages"],e.settings.expiry.highlight.pages),tags:this.sanitize(["settings","expiry","highlight","tags"],e.settings.expiry.highlight.tags)}},auto_report:{enabled:this.sanitize(["settings","auto_report","enabled"],e.settings.auto_report.enabled),for:this.sanitize(["settings","auto_report","for"],e.settings.auto_report.for,e=>{if(!Array.isArray(e))return;const t=new Set(["Harassment","Inappropriate edit summary","Original research"]);return e.forEach(e=>{switch(e){case"Errors":return void t.add("Deliberate errors");case"Disruption":return void t.add("Disruptive editing");case"Jokes":return void t.add("Inappropriate jokes")}t.add(e)}),[...t]})},AI:{enabled:this.sanitize(["settings","AI","enabled"],e.settings.AI.enabled),provider:this.sanitize(["settings","AI","provider"],e.settings.AI.provider),edit_analysis:{enabled:this.sanitize(["settings","AI","edit_analysis","enabled"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["settings","AI","username_analysis","enabled"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["settings","AI","Ollama","server"],e.settings.AI.Ollama.server),model:this.sanitize(["settings","AI","Ollama","model"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["settings","audio","ores_alert","enabled"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["settings","audio","ores_alert","threshold"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["settings","audio","volume","master"],e.settings.audio.volume.master),"master.startup":this.sanitize(["settings","audio","volume","master.startup"],e.settings.audio.volume["master.startup"]),"master.music":this.sanitize(["settings","audio","volume","master.music"],e.settings.audio.volume["master.music"]),"master.music.zen_mode":this.sanitize(["settings","audio","volume","master.music.zen_mode"],e.settings.audio.volume["master.music.zen_mode"]),"master.ui":this.sanitize(["settings","audio","volume","master.ui"],e.settings.audio.volume["master.ui"]),"master.ui.click":this.sanitize(["settings","audio","volume","master.ui.click"],e.settings.audio.volume["master.ui.click"]),"master.queue":this.sanitize(["settings","audio","volume","master.queue"],e.settings.audio.volume["master.queue"]),"master.queue.ores":this.sanitize(["settings","audio","volume","master.queue.ores"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":this.sanitize(["settings","audio","volume","master.queue.mention"],e.settings.audio.volume["master.queue.mention"]),"master.notification":this.sanitize(["settings","audio","volume","master.notification"],e.settings.audio.volume["master.notification"]),"master.notification.alert":this.sanitize(["settings","audio","volume","master.notification.alert"],e.settings.audio.volume["master.notification.alert"]),"master.notification.notice":this.sanitize(["settings","audio","volume","master.notification.notice"],e.settings.audio.volume["master.notification.notice"]),"master.notification.toast":this.sanitize(["settings","audio","volume","master.notification.toast"],e.settings.audio.volume["master.notification.toast"]),"master.action":this.sanitize(["settings","audio","volume","master.action"],e.settings.audio.volume["master.action"]),"master.action.default":this.sanitize(["settings","audio","volume","master.action.default"],e.settings.audio.volume["master.action.default"]),"master.action.failed":this.sanitize(["settings","audio","volume","master.action.failed"],e.settings.audio.volume["master.action.failed"]),"master.action.report":this.sanitize(["settings","audio","volume","master.action.report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["settings","audio","volume","master.action.block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["settings","audio","volume","master.action.protect"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["settings","zen_mode","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["settings","zen_mode","sound","enabled"],e.settings.zen_mode.sound.enabled)},music:{enabled:this.sanitize(["settings","zen_mode","music","enabled"],e.settings.zen_mode.music.enabled)},alerts:{enabled:this.sanitize(["settings","zen_mode","alerts","enabled"],e.settings.zen_mode.alerts.enabled)},notices:{enabled:this.sanitize(["settings","zen_mode","notices","enabled"],e.settings.zen_mode.notices.enabled)},toasts:{enabled:this.sanitize(["settings","zen_mode","toasts","enabled"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:this.sanitize(["settings","zen_mode","badges","enabled"],e.settings.zen_mode.badges.enabled)}},repeat_control_scripts:e.settings.repeat_control_scripts},UI:{theme:{palette:this.sanitize(["UI","theme","palette"],e.UI.theme.palette)},queue:{width:this.sanitize(["UI","queue","width"],e.UI.queue.width)},details:{width:this.sanitize(["UI","details","width"],e.UI.details.width)}},control_scripts:this.sanitize(["control_scripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name){if(!(e.condition in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else if("warn"===e.name){if(!(0,o.isObject)(e.params))return!0;e.params.warning=e.params.warningType,delete e.params.warningType}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:this.sanitize(["statistics","edits_reviewed","total"],e.statistics.edits_reviewed.total),thanked:this.sanitize(["statistics","edits_reviewed","thanked"],e.statistics.edits_reviewed.thanked)},recent_changes_reviewed:{total:this.sanitize(["statistics","recent_changes_reviewed","total"],e.statistics.recent_changes_reviewed.total)},pending_changes_reviewed:{total:this.sanitize(["statistics","pending_changes_reviewed","total"],e.statistics.pending_changes_reviewed.total),accepted:this.sanitize(["statistics","pending_changes_reviewed","accepted"],e.statistics.pending_changes_reviewed.accepted),rejected:this.sanitize(["statistics","pending_changes_reviewed","rejected"],e.statistics.pending_changes_reviewed.rejected)},watchlist_changes_reviewed:{total:this.sanitize(["statistics","watchlist_changes_reviewed","total"],e.statistics.watchlist_changes_reviewed.total)},users_reviewed:{total:this.sanitize(["statistics","users_reviewed","total"],e.statistics.users_reviewed.total)},reverts_made:{total:this.sanitize(["statistics","reverts_made","total"],e.statistics.reverts_made.total),good_faith:this.sanitize(["statistics","reverts_made","good_faith"],e.statistics.reverts_made.good_faith),from_recent_changes:this.sanitize(["statistics","reverts_made","from_recent_changes"],e.statistics.reverts_made.from_recent_changes),from_pending_changes:this.sanitize(["statistics","reverts_made","from_pending_changes"],e.statistics.reverts_made.from_pending_changes),from_watchlist:this.sanitize(["statistics","reverts_made","from_watchlist"],e.statistics.reverts_made.from_watchlist),from_loaded_edits:this.sanitize(["statistics","reverts_made","from_loaded_edits"],e.statistics.reverts_made.from_loaded_edits)},users_welcomed:{total:this.sanitize(["statistics","users_welcomed","total"],e.statistics.users_welcomed.total)},warnings_issued:{total:this.sanitize(["statistics","warnings_issued","total"],e.statistics.warnings_issued.total),level_1:this.sanitize(["statistics","warnings_issued","level_1"],e.statistics.warnings_issued.level_1),level_2:this.sanitize(["statistics","warnings_issued","level_2"],e.statistics.warnings_issued.level_2),level_3:this.sanitize(["statistics","warnings_issued","level_3"],e.statistics.warnings_issued.level_3),level_4:this.sanitize(["statistics","warnings_issued","level_4"],e.statistics.warnings_issued.level_4),level_4im:this.sanitize(["statistics","warnings_issued","level_4im"],e.statistics.warnings_issued.level_4im)},reports_filed:{total:this.sanitize(["statistics","reports_filed","total"],e.statistics.reports_filed.total),AIV:this.sanitize(["statistics","reports_filed","AIV"],e.statistics.reports_filed.AIV),UAA:this.sanitize(["statistics","reports_filed","UAA"],e.statistics.reports_filed.UAA),RFPP:this.sanitize(["statistics","reports_filed","RFPP"],e.statistics.reports_filed.RFPP)},watchlist:{watched:this.sanitize(["statistics","watchlist","watched"],e.statistics.watchlist.watched),unwatched:this.sanitize(["statistics","watchlist","unwatched"],e.statistics.watchlist.unwatched)},items_whitelisted:{total:this.sanitize(["statistics","items_whitelisted","total"],e.statistics.items_whitelisted.total),users:this.sanitize(["statistics","items_whitelisted","users"],e.statistics.items_whitelisted.users),pages:this.sanitize(["statistics","items_whitelisted","pages"],e.statistics.items_whitelisted.pages),tags:this.sanitize(["statistics","items_whitelisted","tags"],e.statistics.items_whitelisted.tags)},items_highlighted:{total:this.sanitize(["statistics","items_highlighted","total"],e.statistics.items_highlighted.total),users:this.sanitize(["statistics","items_highlighted","users"],e.statistics.items_highlighted.users),pages:this.sanitize(["statistics","items_highlighted","pages"],e.statistics.items_highlighted.pages),tags:this.sanitize(["statistics","items_highlighted","tags"],e.statistics.items_highlighted.tags)},blocks_issued:{total:this.sanitize(["statistics","blocks_issued","total"],e.statistics.blocks_issued.total)},pages_protected:{total:this.sanitize(["statistics","pages_protected","total"],e.statistics.pages_protected.total)},actions_executed:{total:this.sanitize(["statistics","actions_executed","total"],e.statistics.actions_executed.total),successful:this.sanitize(["statistics","actions_executed","successful"],e.statistics.actions_executed.successful)},session_time:this.sanitize(["statistics","session_time"],e.statistics.session_time)},highlight:{users:this.sanitize(["highlight","users"],e.highlight.users),pages:this.sanitize(["highlight","pages"],e.highlight.pages),tags:this.sanitize(["highlight","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)},favorite:{warnings:e.favorite.warnings,reverts:e.favorite.reverts}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),t.version!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const g=t.settings.namespaces;Array.isArray(g)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const h=t.settings.queue;this.restrictObject(h,"settings","queue");{const m=t.settings.queue.max_size;"number"==typeof m&&Number.isInteger(m)&&m>0||this.reset("settings","queue","max_size")}{const v=t.settings.queue.max_edits;"number"==typeof v&&Number.isInteger(v)&&v>0||this.reset("settings","queue","max_edits")}{const f=t.settings.queue.min_ores;"number"==typeof f&&f>=0&&f<=1||this.reset("settings","queue","min_ores")}["recent","flagged","users","watchlist"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const b=t.settings.cloud_storage;this.restrictObject(b,"settings","cloud_storage");"boolean"!=typeof t.settings.cloud_storage.enabled&&this.reset("settings","cloud_storage","enabled")}{const w=t.settings.username_highlighting;this.restrictObject(w,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const y=t.settings.wikipedia_popups;this.restrictObject(y,"settings","wikipedia_popups");"boolean"!=typeof t.settings.wikipedia_popups.enabled&&this.reset("settings","wikipedia_popups","enabled")}{const x=t.settings.auto_welcome;this.restrictObject(x,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const k=new Set(["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"]),_=t.settings.expiry;this.restrictObject(_,"settings","expiry");{const S=t.settings.expiry.watchlist;k.has(S)||this.reset("settings","expiry","watchlist")}{const q=t.settings.expiry.whitelist;this.restrictObject(q,"settings","expiry","whitelist");{const E=t.settings.expiry.whitelist.users;k.has(E)||this.reset("settings","expiry","whitelist","users")}{const L=t.settings.expiry.whitelist.pages;k.has(L)||this.reset("settings","expiry","whitelist","pages")}{const A=t.settings.expiry.whitelist.tags;k.has(A)||this.reset("settings","expiry","whitelist","tags")}}{const T=t.settings.expiry.highlight;this.restrictObject(T,"settings","expiry","highlight");{const C=t.settings.expiry.highlight.users;k.has(C)||this.reset("settings","expiry","highlight","users")}{const z=t.settings.expiry.highlight.pages;k.has(z)||this.reset("settings","expiry","highlight","pages")}{const M=t.settings.expiry.highlight.tags;k.has(M)||this.reset("settings","expiry","highlight","tags")}}}{const $=t.settings.auto_report;this.restrictObject($,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const O=t.settings.auto_report.for;Array.isArray(O)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const I=t.settings.AI;this.restrictObject(I,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const P=t.settings.AI.edit_analysis;this.restrictObject(P,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const j=t.settings.AI.username_analysis;this.restrictObject(j,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const W=t.settings.AI.Ollama;this.restrictObject(W,"settings","AI","Ollama");{const D=t.settings.AI.Ollama.server;(0,o.isURL)(D)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const R=t.settings.audio;this.restrictObject(R,"settings","audio");{const U=t.settings.audio.ores_alert;this.restrictObject(U,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const N=t.settings.audio.ores_alert.threshold;"number"==typeof N&&N>=0&&N<=1||this.reset("settings","audio","ores_alert","threshold")}}{const H=t.settings.audio.volume;this.restrictObject(H,"settings","audio","volume");const F=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.notice","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const V of F){const B=t.settings.audio.volume[V];"number"==typeof B&&B>=0&&B<=1||this.reset("settings","audio","volume",V)}}}{const G=t.settings.zen_mode;this.restrictObject(G,"settings","zen_mode");"boolean"!=typeof G.enabled&&this.reset("settings","zen_mode","enabled");{const Q=t.settings.zen_mode.sound;this.restrictObject(Q,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const Y=t.settings.zen_mode.music;this.restrictObject(Y,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const Z=t.settings.zen_mode.alerts;this.restrictObject(Z,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const K=t.settings.zen_mode.notices;this.restrictObject(K,"settings","zen_mode","notices");"boolean"!=typeof t.settings.zen_mode.notices.enabled&&this.reset("settings","zen_mode","notices","enabled")}{const X=t.settings.zen_mode.toasts;this.restrictObject(X,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const J=t.settings.zen_mode.badges;this.restrictObject(J,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}"boolean"!=typeof t.settings.repeat_control_scripts&&this.reset("settings","repeat_control_scripts")}{const ee=t.UI;this.restrictObject(ee,"UI");{const te=t.UI.theme;this.restrictObject(te,"UI","theme");{const ne=t.UI.theme.palette;"number"==typeof ne&&Number.isInteger(ne)&&ne>=0&&ne<=3||this.reset("UI","theme","palette")}}{const se=t.UI.queue;this.restrictObject(se,"UI","queue");{const ie=t.UI.queue.width;"string"==typeof ie&&ie.endsWith("vw")||this.reset("UI","queue","width");const ae=parseFloat(ie.slice(0,-2));"number"==typeof ae&&!isNaN(ae)&&ae>=10&&ae<=30||this.reset("UI","queue","width")}}{const re=t.UI.details;this.restrictObject(re,"UI","details");{const oe=t.UI.details.width;"string"==typeof oe&&oe.endsWith("vw")||this.reset("UI","details","width");const le=parseFloat(oe.slice(0,-2));"number"==typeof le&&!isNaN(le)&&le>=10&&le<=30||this.reset("UI","details","width")}}}{const de=t.control_scripts;function ce(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name){var i;if(!(e.condition in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${e.condition} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]),e.actions=ce.call(this,e.actions,...t,n,"actions")}else{var a,r;if(!(e.name in c.events))return null!==(a=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`))&&void 0!==a&&a;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=null!==(r=c.events[e.name].parameters)&&void 0!==r?r:[],i=new Set;for(const a of s)i.add(a.id),"choice"===a.type&&(a.id in e.params||(this.loadedLogger.warn(`Resetting missing choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]),a.options.includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]));for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(de)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>p.controls.has(e)),t.control_scripts[n].actions=ce.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const ue=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,pe=t.statistics;this.restrictObject(pe,"statistics");{const ge=t.statistics.edits_reviewed;this.restrictObject(ge,"statistics","edits_reviewed");ue(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");ue(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const he=t.statistics.recent_changes_reviewed;this.restrictObject(he,"statistics","recent_changes_reviewed");ue(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const me=t.statistics.pending_changes_reviewed;this.restrictObject(me,"statistics","pending_changes_reviewed");ue(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");ue(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");ue(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const ve=t.statistics.watchlist_changes_reviewed;this.restrictObject(ve,"statistics","watchlist_changes_reviewed");ue(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const fe=t.statistics.users_reviewed;this.restrictObject(fe,"statistics","users_reviewed");ue(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const be=t.statistics.reverts_made;this.restrictObject(be,"statistics","reverts_made");ue(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");ue(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");ue(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");ue(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");ue(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");ue(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const we=t.statistics.users_welcomed;this.restrictObject(we,"statistics","users_welcomed");ue(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const ye=t.statistics.warnings_issued;this.restrictObject(ye,"statistics","warnings_issued");ue(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");ue(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");ue(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");ue(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");ue(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");ue(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const xe=t.statistics.reports_filed;this.restrictObject(xe,"statistics","reports_filed");ue(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");ue(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");ue(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");ue(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP")}{const ke=t.statistics.watchlist;this.restrictObject(ke,"statistics","watchlist");ue(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");ue(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const _e=t.statistics.items_whitelisted;this.restrictObject(_e,"statistics","items_whitelisted");ue(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");ue(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");ue(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");ue(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const Se=t.statistics.items_highlighted;this.restrictObject(Se,"statistics","items_highlighted");ue(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");ue(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");ue(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");ue(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const qe=t.statistics.blocks_issued;this.restrictObject(qe,"statistics","blocks_issued");ue(t.statistics.blocks_issued.total)||this.reset("statistics","blocks_issued","total")}{const Ee=t.statistics.pages_protected;this.restrictObject(Ee,"statistics","pages_protected");ue(t.statistics.pages_protected.total)||this.reset("statistics","pages_protected","total")}{const Le=t.statistics.actions_executed;this.restrictObject(Le,"statistics","actions_executed");ue(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");ue(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const Ae=t.statistics.session_time;"number"==typeof Ae&&Ae>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Te=t.highlight;this.restrictObject(Te,"highlight");{const Ce=t.highlight.users;Array.isArray(Ce)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const ze=t.highlight.pages;Array.isArray(ze)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const Me=t.highlight.tags;Array.isArray(Me)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const $e=t.whitelist;this.restrictObject($e,"whitelist");{const Oe=t.whitelist.users;Array.isArray(Oe)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const Ie=t.whitelist.pages;Array.isArray(Ie)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const Pe=t.whitelist.tags;Array.isArray(Pe)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}{const je=t.favorite;this.restrictObject(je,"favorite");{const We=t.favorite.warnings;Array.isArray(We)||this.reset("favorite","warnings"),t.favorite.warnings=t.favorite.warnings.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite warning [ ${e} ] from stored data.`),t})}{const De=t.favorite.reverts;Array.isArray(De)||this.reset("favorite","reverts"),t.favorite.reverts=t.favorite.reverts.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite revert [ ${e} ] from stored data.`),t})}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=2,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},8415(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(3241),h=n(5564),m=n(8469),v=n(4029);v.Version.v3=(s=class extends v.Version{static get default(){return{version:3,changelog:"6",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,ores_bias:.5,recent:{enabled:!0,order:0},pending:{enabled:!0,order:1},users:{enabled:!1,order:2},watchlist:{enabled:!0,order:3},abuselog:{enabled:!0,order:4}},username_highlighting:{enabled:!0,fuzzy:!1},wikipedia_popups:{enabled:!0},auto_welcome:{enabled:!1},talk_page_thanks_for_temporary_users:{enabled:!0},expiry:{watchlist:"1W",whitelist:{users:"infinity",pages:"infinity",tags:"infinity"},highlight:{users:"1W",pages:"1W",tags:"1W"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Deliberate errors","Disruptive editing","Editing tests","Commentary","Inappropriate jokes","Deleting","Unsourced","Unsourced (BLP)","Unsourced genre","Original research","Censoring","AI-generated","AI-generated (talk)","Personal attacks","Harassment","TPO","AfD removal","Advertising","Spam links","Attempt","Inappropriate edit summary","Misleading edit summary"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.message":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},messages:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}},accessibility:{colorblind:!1,dyslexia:!1,high_contrast:!1,reduce_motion:!1},repeat_control_scripts:!0},UI:{theme:{app:"auto",palette:"traffic"},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"," "],actions:[{name:"next-item",params:{}}]},{keys:["arrowleft"],actions:[{name:"previous-item",params:{}}]},{keys:["q"],actions:[{name:"next-item",params:{}},{name:"revert",params:{warning:"Vandalism"}},{name:"highlight-user",params:{}}]},{keys:["h"],actions:[{name:"open-page-history",params:{}}]},{keys:["c"],actions:[{name:"open-user-contributions",params:{}}]},{keys:["t"],actions:[{name:"thank-user",params:{}}]},{keys:["w"],actions:[{name:"welcome-user",params:{}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},abuselogs_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_abuselogs:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0,global_blocks:0,global_locks:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]},favorite:{warnings:[],reverts:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");this.deprecated("settings","cloud_storage");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:this.sanitize(["settings","performance","startup"],e.settings.performance.startup)},namespaces:this.sanitize(["settings","namespaces"],e.settings.namespaces),queue:{max_size:this.sanitize(["settings","queue","max_size"],e.settings.queue.max_size),max_edits:this.sanitize(["settings","queue","max_edits"],e.settings.queue.max_edits),min_ores:this.sanitize(["settings","queue","min_ores"],e.settings.queue.min_ores),ores_bias:e.settings.queue.ores_bias,recent:{enabled:this.sanitize(["settings","queue","recent","enabled"],e.settings.queue.recent.enabled),order:this.sanitize(["settings","queue","recent","order"],e.settings.queue.recent.order)},pending:{enabled:this.sanitize(["settings","queue","flagged","enabled"],e.settings.queue.pending.enabled),order:this.sanitize(["settings","queue","flagged","order"],e.settings.queue.pending.order)},users:{enabled:this.sanitize(["settings","queue","users","enabled"],e.settings.queue.users.enabled),order:this.sanitize(["settings","queue","users","order"],e.settings.queue.users.order)},watchlist:{enabled:this.sanitize(["settings","queue","watchlist","enabled"],e.settings.queue.watchlist.enabled),order:this.sanitize(["settings","queue","watchlist","order"],e.settings.queue.watchlist.order)},abuselog:{enabled:e.settings.queue.abuselog.enabled,order:e.settings.queue.abuselog.order}},username_highlighting:{enabled:this.sanitize(["settings","username_highlighting","enabled"],e.settings.username_highlighting.enabled),fuzzy:this.sanitize(["settings","username_highlighting","fuzzy"],e.settings.username_highlighting.fuzzy)},wikipedia_popups:{enabled:e.settings.wikipedia_popups.enabled},auto_welcome:{enabled:this.sanitize(["settings","auto_welcome","enabled"],e.settings.auto_welcome.enabled)},talk_page_thanks_for_temporary_users:{enabled:e.settings.talk_page_thanks_for_temporary_users.enabled},expiry:{watchlist:this.sanitize(["settings","expiry","watchlist"],e.settings.expiry.watchlist,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),whitelist:{users:this.sanitize(["settings","expiry","whitelist","users"],e.settings.expiry.whitelist.users,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),pages:this.sanitize(["settings","expiry","whitelist","pages"],e.settings.expiry.whitelist.pages,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),tags:this.sanitize(["settings","expiry","whitelist","tags"],e.settings.expiry.whitelist.tags,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e]))},highlight:{users:this.sanitize(["settings","expiry","highlight","users"],e.settings.expiry.highlight.users,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),pages:this.sanitize(["settings","expiry","highlight","pages"],e.settings.expiry.highlight.pages,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),tags:this.sanitize(["settings","expiry","highlight","tags"],e.settings.expiry.highlight.tags,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e]))}},auto_report:{enabled:this.sanitize(["settings","auto_report","enabled"],e.settings.auto_report.enabled),for:this.sanitize(["settings","auto_report","for"],e.settings.auto_report.for,e=>{if(!Array.isArray(e))return;const t=new Set(["Attempt"]);return e.forEach(e=>t.add(e)),[...t]})},AI:{enabled:this.sanitize(["settings","AI","enabled"],e.settings.AI.enabled),provider:this.sanitize(["settings","AI","provider"],e.settings.AI.provider),edit_analysis:{enabled:this.sanitize(["settings","AI","edit_analysis","enabled"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["settings","AI","username_analysis","enabled"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["settings","AI","Ollama","server"],e.settings.AI.Ollama.server),model:this.sanitize(["settings","AI","Ollama","model"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["settings","audio","ores_alert","enabled"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["settings","audio","ores_alert","threshold"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["settings","audio","volume","master"],e.settings.audio.volume.master),"master.startup":this.sanitize(["settings","audio","volume","master.startup"],e.settings.audio.volume["master.startup"]),"master.music":this.sanitize(["settings","audio","volume","master.music"],e.settings.audio.volume["master.music"]),"master.music.zen_mode":this.sanitize(["settings","audio","volume","master.music.zen_mode"],e.settings.audio.volume["master.music.zen_mode"]),"master.ui":this.sanitize(["settings","audio","volume","master.ui"],e.settings.audio.volume["master.ui"]),"master.ui.click":this.sanitize(["settings","audio","volume","master.ui.click"],e.settings.audio.volume["master.ui.click"]),"master.queue":this.sanitize(["settings","audio","volume","master.queue"],e.settings.audio.volume["master.queue"]),"master.queue.ores":this.sanitize(["settings","audio","volume","master.queue.ores"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":this.sanitize(["settings","audio","volume","master.queue.mention"],e.settings.audio.volume["master.queue.mention"]),"master.notification":this.sanitize(["settings","audio","volume","master.notification"],e.settings.audio.volume["master.notification"]),"master.notification.alert":this.sanitize(["settings","audio","volume","master.notification.alert"],e.settings.audio.volume["master.notification.alert"]),"master.notification.message":this.sanitize(["settings","audio","volume","master.notification.notice"],e.settings.audio.volume["master.notification.message"]),"master.notification.toast":this.sanitize(["settings","audio","volume","master.notification.toast"],e.settings.audio.volume["master.notification.toast"]),"master.action":this.sanitize(["settings","audio","volume","master.action"],e.settings.audio.volume["master.action"]),"master.action.default":this.sanitize(["settings","audio","volume","master.action.default"],e.settings.audio.volume["master.action.default"]),"master.action.failed":this.sanitize(["settings","audio","volume","master.action.failed"],e.settings.audio.volume["master.action.failed"]),"master.action.report":this.sanitize(["settings","audio","volume","master.action.report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["settings","audio","volume","master.action.block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["settings","audio","volume","master.action.protect"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["settings","zen_mode","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["settings","zen_mode","sound","enabled"],e.settings.zen_mode.sound.enabled)},music:{enabled:this.sanitize(["settings","zen_mode","music","enabled"],e.settings.zen_mode.music.enabled)},alerts:{enabled:this.sanitize(["settings","zen_mode","alerts","enabled"],e.settings.zen_mode.alerts.enabled)},messages:{enabled:this.sanitize(["settings","zen_mode","notices","enabled"],e.settings.zen_mode.messages.enabled)},toasts:{enabled:this.sanitize(["settings","zen_mode","toasts","enabled"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:this.sanitize(["settings","zen_mode","badges","enabled"],e.settings.zen_mode.badges.enabled)}},accessibility:{colorblind:e.settings.accessibility.colorblind,dyslexia:e.settings.accessibility.dyslexia,high_contrast:e.settings.accessibility.high_contrast,reduce_motion:e.settings.accessibility.reduce_motion},repeat_control_scripts:this.sanitize(["settings","repeat_control_scripts"],e.settings.repeat_control_scripts)},UI:{theme:{app:e.UI.theme.app,palette:this.sanitize(["UI","theme","palette"],e.UI.theme.palette,t=>["traffic","heat","natural","cool"][t]||e.UI.theme.palette)},queue:{width:this.sanitize(["UI","queue","width"],e.UI.queue.width)},details:{width:this.sanitize(["UI","details","width"],e.UI.details.width)}},control_scripts:this.sanitize(["control_scripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name||"if not"===e.name){var i,a;const r="if not"===e.name,o=()=>e.name=r?"if":"if not";switch("string"==typeof e.condition&&(e.condition={name:e.condition,params:{}}),null!==(a=(i=e.condition).params)&&void 0!==a||(i.params={}),e.condition.name){case"operatorNonAdmin":o();case"operatorAdmin":e.condition.name="account-admin";break;case"userIsHighlighted":e.condition.name="username-highlighted";break;case"userIsWhitelisted":e.condition.name="username-whitelisted";break;case"pageIsWhitelisted":e.condition.name="page-whitelisted";break;case"userIsAnon":o();case"userIsRegistered":e.codition.name="user-registered";break;case"userIsIP":e.condition.name="user-ip";break;case"userIsTemp":e.condition.name="user-temp";break;case"userHasEmptyTalkPage":e.condition.name="user-empty-talk";break;case"editIsMajor":o();case"editIsMinor":e.condition.name="edit-minor";break;case"editSizeNegative":e.condition.name="edit-size",e.condition.params={condition:"<",size:0};break;case"editSizePositive":e.condition.name="edit-size",e.condition.params={condition:">",size:0};break;case"editSizeLarge":e.condition.name="abs-edit-size",e.condition.params={condition:"≥",size:1e3};break;case"userEditCountLow":e.condition.name="user-edit-count",e.condition.params={condition:"<",count:10};break;case"userEditCountHigh":e.condition.name="user-edit-count",e.condition.params={condition:"≥",count:100};break;case"atFinalWarning":e.condition.name="user-final-warning";break;case"userNoWarnings":o();case"userHasWarnings":e.condition.name="user-has-warnings"}if(!(e.condition.name in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else{var r;switch(null!==(r=e.params)&&void 0!==r||(e.params={}),e.name){case"toggleZenMode":e.name="toggle-zen-mode";break;case"acceptFlaggedEdit":if(e.name="accept-pending-edit",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.reason,delete e.params.reason;break;case"rejectFlaggedEdit":if(e.name="reject-pending-edit",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.reason,delete e.params.reason;break;case"prevEdit":e.name="previous-item";break;case"nextEdit":e.name="next-item";break;case"deleteQueue":e.name="clear-queue";break;case"openRevertMenu":e.name="open-revert-menu";break;case"openWarnMenu":e.name="open-warn-menu";break;case"openUserPage":e.name="open-user-page";break;case"openUserTalk":e.name="open-user-talk";break;case"openUserContribs":e.name="open-user-contributions";break;case"openFilterLog":e.name="open-user-filter-log";break;case"openPage":e.name="open-page";break;case"openTalk":e.name="open-page-talk";break;case"openHistory":e.name="open-page-history";break;case"openRevision":e.name="open-revision";break;case"openDiff":e.name="open-diff";break;case"switchToRecentQueue":e.name="switch-to-recent-queue";break;case"switchToFlaggedQueue":e.name="switch-to-pending-queue";break;case"switchToUsersQueue":e.name="switch-to-users-queue";break;case"switchToWatchlistQueue":e.name="switch-to-watchlist-queue";break;case"watchPage":e.name="watch-page";break;case"unwatchPage":e.name="unwatch-page";break;case"whitelistUser":e.name="whitelist-user";break;case"whitelistPage":e.name="whitelist-page";break;case"unwhitelistUser":e.name="unwhitelist-user";break;case"unwhitelistPage":e.name="unwhitelist-page";break;case"highlightUser":e.name="highlight-user";break;case"highlightPage":e.name="highlight-page";break;case"unwhitelistUser":e.name="unhighlight-user";break;case"unwhitelistPage":e.name="unhighlight-page";break;case"thankUser":e.name="thank-user";break;case"warn":e.name="warn-user";break;case"rollback":if(e.name="rollback-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"rollbackGoodFaith":if(e.name="rollback-goodfaith-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"undo":if(e.name="undo-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"reportToAIV":if(e.name="report-user-to-aiv",!(0,o.isObject)(e.params))return!0;e.params.reason=e.params.reportMessage,delete e.params.reportMessage,e.params.summary=e.params.comment,delete e.params.comment;break;case"reportToUAA":if(e.name="report-user-to-uaa",!(0,o.isObject)(e.params))return!0;e.params.reason=e.params.reportMessage,delete e.params.reportMessage,e.params.summary=e.params.comment,delete e.params.comment;break;case"requestProtection":if(e.name="request-page-protection",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.comment,delete e.params.comment;break;case"welcome":e.name="welcome-user";break;case"toggleConsecutive":e.name="toggle-consecutive-edits";break;case"block":return this.loadedLogger.warn(`Skipping deprecated action 'block' in control script at ${[...n,s].join(" -> ")}.`),!1;case"protect":return this.loadedLogger.warn(`Skipping deprecated action 'protect' in control script at ${[...n,s].join(" -> ")}.`),!1;case"openSettings":return this.loadedLogger.warn(`Skipping deprecated action 'openSettings' in control script at ${[...n,s].join(" -> ")}.`),!1}}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:this.sanitize(["statistics","edits_reviewed","total"],e.statistics.edits_reviewed.total),thanked:this.sanitize(["statistics","edits_reviewed","thanked"],e.statistics.edits_reviewed.thanked)},recent_changes_reviewed:{total:this.sanitize(["statistics","recent_changes_reviewed","total"],e.statistics.recent_changes_reviewed.total)},pending_changes_reviewed:{total:this.sanitize(["statistics","pending_changes_reviewed","total"],e.statistics.pending_changes_reviewed.total),accepted:this.sanitize(["statistics","pending_changes_reviewed","accepted"],e.statistics.pending_changes_reviewed.accepted),rejected:this.sanitize(["statistics","pending_changes_reviewed","rejected"],e.statistics.pending_changes_reviewed.rejected)},watchlist_changes_reviewed:{total:this.sanitize(["statistics","watchlist_changes_reviewed","total"],e.statistics.watchlist_changes_reviewed.total)},users_reviewed:{total:this.sanitize(["statistics","users_reviewed","total"],e.statistics.users_reviewed.total)},abuselogs_reviewed:{total:e.statistics.abuselogs_reviewed.total},reverts_made:{total:this.sanitize(["statistics","reverts_made","total"],e.statistics.reverts_made.total),good_faith:this.sanitize(["statistics","reverts_made","good_faith"],e.statistics.reverts_made.good_faith),from_recent_changes:this.sanitize(["statistics","reverts_made","from_recent_changes"],e.statistics.reverts_made.from_recent_changes),from_pending_changes:this.sanitize(["statistics","reverts_made","from_pending_changes"],e.statistics.reverts_made.from_pending_changes),from_watchlist:this.sanitize(["statistics","reverts_made","from_watchlist"],e.statistics.reverts_made.from_watchlist),from_abuselogs:e.statistics.reverts_made.from_abuselogs,from_loaded_edits:this.sanitize(["statistics","reverts_made","from_loaded_edits"],e.statistics.reverts_made.from_loaded_edits)},users_welcomed:{total:this.sanitize(["statistics","users_welcomed","total"],e.statistics.users_welcomed.total)},warnings_issued:{total:this.sanitize(["statistics","warnings_issued","total"],e.statistics.warnings_issued.total),level_1:this.sanitize(["statistics","warnings_issued","level_1"],e.statistics.warnings_issued.level_1),level_2:this.sanitize(["statistics","warnings_issued","level_2"],e.statistics.warnings_issued.level_2),level_3:this.sanitize(["statistics","warnings_issued","level_3"],e.statistics.warnings_issued.level_3),level_4:this.sanitize(["statistics","warnings_issued","level_4"],e.statistics.warnings_issued.level_4),level_4im:this.sanitize(["statistics","warnings_issued","level_4im"],e.statistics.warnings_issued.level_4im)},reports_filed:{total:this.sanitize(["statistics","reports_filed","total"],e.statistics.reports_filed.total),AIV:this.sanitize(["statistics","reports_filed","AIV"],e.statistics.reports_filed.AIV),UAA:this.sanitize(["statistics","reports_filed","UAA"],e.statistics.reports_filed.UAA),RFPP:this.sanitize(["statistics","reports_filed","RFPP"],e.statistics.reports_filed.RFPP),global_blocks:e.statistics.reports_filed.global_blocks,global_locks:e.statistics.reports_filed.global_locks},watchlist:{watched:this.sanitize(["statistics","watchlist","watched"],e.statistics.watchlist.watched),unwatched:this.sanitize(["statistics","watchlist","unwatched"],e.statistics.watchlist.unwatched)},items_whitelisted:{total:this.sanitize(["statistics","items_whitelisted","total"],e.statistics.items_whitelisted.total),users:this.sanitize(["statistics","items_whitelisted","users"],e.statistics.items_whitelisted.users),pages:this.sanitize(["statistics","items_whitelisted","pages"],e.statistics.items_whitelisted.pages),tags:this.sanitize(["statistics","items_whitelisted","tags"],e.statistics.items_whitelisted.tags)},items_highlighted:{total:this.sanitize(["statistics","items_highlighted","total"],e.statistics.items_highlighted.total),users:this.sanitize(["statistics","items_highlighted","users"],e.statistics.items_highlighted.users),pages:this.sanitize(["statistics","items_highlighted","pages"],e.statistics.items_highlighted.pages),tags:this.sanitize(["statistics","items_highlighted","tags"],e.statistics.items_highlighted.tags)},blocks_issued:{total:this.sanitize(["statistics","blocks_issued","total"],e.statistics.blocks_issued.total)},pages_protected:{total:this.sanitize(["statistics","pages_protected","total"],e.statistics.pages_protected.total)},actions_executed:{total:this.sanitize(["statistics","actions_executed","total"],e.statistics.actions_executed.total),successful:this.sanitize(["statistics","actions_executed","successful"],e.statistics.actions_executed.successful)},session_time:this.sanitize(["statistics","session_time"],e.statistics.session_time)},highlight:{users:this.sanitize(["highlight","users"],e.highlight.users),pages:this.sanitize(["highlight","pages"],e.highlight.pages),tags:this.sanitize(["highlight","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)},favorite:{warnings:this.sanitize(["favorite","warnings"],e.favorite.warnings),reverts:this.sanitize(["favorite","reverts"],e.favorite.reverts)}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),(null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const v=t.settings.namespaces;Array.isArray(v)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const f=t.settings.queue;this.restrictObject(f,"settings","queue");{const b=t.settings.queue.max_size;"number"==typeof b&&Number.isInteger(b)&&b>0||this.reset("settings","queue","max_size")}{const w=t.settings.queue.max_edits;"number"==typeof w&&Number.isInteger(w)&&w>0||this.reset("settings","queue","max_edits")}{const y=t.settings.queue.min_ores;"number"==typeof y&&y>=0&&y<=1||this.reset("settings","queue","min_ores")}{const x=t.settings.queue.ores_bias;"number"==typeof x&&x>=0&&x<=1||this.reset("settings","queue","ores_bias")}["recent","pending","users","watchlist","abuselog"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const k=t.settings.username_highlighting;this.restrictObject(k,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const _=t.settings.wikipedia_popups;this.restrictObject(_,"settings","wikipedia_popups");"boolean"!=typeof t.settings.wikipedia_popups.enabled&&this.reset("settings","wikipedia_popups","enabled")}{const S=t.settings.auto_welcome;this.restrictObject(S,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const q=t.settings.talk_page_thanks_for_temporary_users;this.restrictObject(q,"settings","talk_page_thanks_for_temporary_users");"boolean"!=typeof t.settings.talk_page_thanks_for_temporary_users.enabled&&this.reset("settings","talk_page_thanks_for_temporary_users","enabled")}{const E=t.settings.expiry;this.restrictObject(E,"settings","expiry");{const L=t.settings.expiry.watchlist;g.expiryRegex.test(L)||this.reset("settings","expiry","watchlist")}{const A=t.settings.expiry.whitelist;this.restrictObject(A,"settings","expiry","whitelist");{const T=t.settings.expiry.whitelist.users;g.expiryRegex.test(T)||this.reset("settings","expiry","whitelist","users")}{const C=t.settings.expiry.whitelist.pages;g.expiryRegex.test(C)||this.reset("settings","expiry","whitelist","pages")}{const z=t.settings.expiry.whitelist.tags;g.expiryRegex.test(z)||this.reset("settings","expiry","whitelist","tags")}}{const M=t.settings.expiry.highlight;this.restrictObject(M,"settings","expiry","highlight");{const $=t.settings.expiry.highlight.users;g.expiryRegex.test($)||this.reset("settings","expiry","highlight","users")}{const O=t.settings.expiry.highlight.pages;g.expiryRegex.test(O)||this.reset("settings","expiry","highlight","pages")}{const I=t.settings.expiry.highlight.tags;g.expiryRegex.test(I)||this.reset("settings","expiry","highlight","tags")}}}{const P=t.settings.auto_report;this.restrictObject(P,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const j=t.settings.auto_report.for;Array.isArray(j)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const W=t.settings.AI;this.restrictObject(W,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const D=t.settings.AI.edit_analysis;this.restrictObject(D,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const R=t.settings.AI.username_analysis;this.restrictObject(R,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const U=t.settings.AI.Ollama;this.restrictObject(U,"settings","AI","Ollama");{const N=t.settings.AI.Ollama.server;(0,o.isURL)(N)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const H=t.settings.audio;this.restrictObject(H,"settings","audio");{const F=t.settings.audio.ores_alert;this.restrictObject(F,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const V=t.settings.audio.ores_alert.threshold;"number"==typeof V&&V>=0&&V<=1||this.reset("settings","audio","ores_alert","threshold")}}{const B=t.settings.audio.volume;this.restrictObject(B,"settings","audio","volume");const G=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.message","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const Q of G){const Y=t.settings.audio.volume[Q];"number"==typeof Y&&Y>=0&&Y<=1||this.reset("settings","audio","volume",Q)}}}{const Z=t.settings.zen_mode;this.restrictObject(Z,"settings","zen_mode");"boolean"!=typeof Z.enabled&&this.reset("settings","zen_mode","enabled");{const K=t.settings.zen_mode.sound;this.restrictObject(K,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const X=t.settings.zen_mode.music;this.restrictObject(X,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const J=t.settings.zen_mode.alerts;this.restrictObject(J,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const ee=t.settings.zen_mode.messages;this.restrictObject(ee,"settings","zen_mode","messages");"boolean"!=typeof t.settings.zen_mode.messages.enabled&&this.reset("settings","zen_mode","messages","enabled")}{const te=t.settings.zen_mode.toasts;this.restrictObject(te,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const ne=t.settings.zen_mode.badges;this.restrictObject(ne,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}{const se=t.settings.accessibility;this.restrictObject(se,"settings","accessibility");"boolean"!=typeof t.settings.accessibility.colorblind&&this.reset("settings","accessibility","colorblind");"boolean"!=typeof t.settings.accessibility.dyslexia&&this.reset("settings","accessibility","dyslexia");"boolean"!=typeof t.settings.accessibility.high_contrast&&this.reset("settings","accessibility","high_contrast");"boolean"!=typeof t.settings.accessibility.reduce_motion&&this.reset("settings","accessibility","reduce_motion")}"boolean"!=typeof t.settings.repeat_control_scripts&&this.reset("settings","repeat_control_scripts")}{const ie=t.UI;this.restrictObject(ie,"UI");{const ae=t.UI.theme;this.restrictObject(ae,"UI","theme");{const re=t.UI.theme.app;["light","dark","auto"].includes(re)||this.reset("UI","theme","app")}t.UI.theme.palette in m.GUI.palettes||this.reset("UI","theme","palette")}{const oe=t.UI.queue;this.restrictObject(oe,"UI","queue");{const le=t.UI.queue.width;"string"==typeof le&&le.endsWith("vw")||this.reset("UI","queue","width");const de=parseFloat(le.slice(0,-2));"number"==typeof de&&!isNaN(de)&&de>=10&&de<=30||this.reset("UI","queue","width")}}{const ce=t.UI.details;this.restrictObject(ce,"UI","details");{const ue=t.UI.details.width;"string"==typeof ue&&ue.endsWith("vw")||this.reset("UI","details","width");const pe=parseFloat(ue.slice(0,-2));"number"==typeof pe&&!isNaN(pe)&&pe>=10&&pe<=30||this.reset("UI","details","width")}}}{const ge=t.control_scripts;function he(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name||"if not"===e.name){var i,a,r,l;const s=e.condition;if(!(s.name in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${s.name} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]);const o=(0,h.sortDependencies)(null!==(a=null===(r=(l=u.conditions[s.name]).parameters)||void 0===r?void 0:r.call(l))&&void 0!==a?a:[]),c=new Set;for(const e of o){const i={};for(const t of null!==(d=e.dependencies)&&void 0!==d?d:[]){var d;i[t]=s.params[t]}const a="function"==typeof e.default?e.default(i):e.default;if(e.id in s.params||"default"in e&&(this.loadedLogger.warn(`Resetting missing parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a),c.add(e.id),"default"in e)switch(e.type){case"choice":("function"==typeof e.options?e.options(i):e.options).includes(s.params[e.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"text":"string"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid text parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"boolean":"boolean"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"number":"number"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid number parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a)}}for(const e of Object.keys(s.params))c.has(e)||(this.loadedLogger.warn(`Removing invalid parameter [ ${e} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete s.params[e]);e.actions=he.call(this,e.actions,...t,n,"actions")}else{var p,m,v,f;if(!(e.name in c.events))return null!==(p=void this.loadedLogger.warn(`Removing invalid action [ ${e.name} ] at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`))&&void 0!==p&&p;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=(0,h.sortDependencies)(null!==(m=null===(v=(f=c.events[e.name]).parameters)||void 0===v?void 0:v.call(f))&&void 0!==m?m:[]),i=new Set;for(const a of s){const s={};for(const t of null!==(b=a.dependencies)&&void 0!==b?b:[]){var b;s[t]=e.params[t]}const r="function"==typeof a.default?a.default(s):a.default;if(a.id in e.params||"default"in a&&(this.loadedLogger.warn(`Resetting missing parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r),i.add(a.id),"default"in a)switch(a.type){case"choice":("function"==typeof a.options?a.options(s):a.options).includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"text":"string"!=typeof e.params[a.id]&&(this.loadedLogger.warn(`Resetting invalid text parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"boolean":"boolean"!=typeof e.params[a.id]&&(this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"duration":"string"==typeof e.params[a.id]&&g.expiryRegex.test(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid duration parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r)}}for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(ge)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>(0,p.validateShortcut)(e)),t.control_scripts[n].actions=he.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const me=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,ve=t.statistics;this.restrictObject(ve,"statistics");{const fe=t.statistics.edits_reviewed;this.restrictObject(fe,"statistics","edits_reviewed");me(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");me(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const be=t.statistics.recent_changes_reviewed;this.restrictObject(be,"statistics","recent_changes_reviewed");me(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const we=t.statistics.pending_changes_reviewed;this.restrictObject(we,"statistics","pending_changes_reviewed");me(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");me(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");me(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const ye=t.statistics.watchlist_changes_reviewed;this.restrictObject(ye,"statistics","watchlist_changes_reviewed");me(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const xe=t.statistics.users_reviewed;this.restrictObject(xe,"statistics","users_reviewed");me(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const ke=t.statistics.abuselogs_reviewed;this.restrictObject(ke,"statistics","abuselogs_reviewed");me(t.statistics.abuselogs_reviewed.total)||this.reset("statistics","abuselogs_reviewed","total")}{const _e=t.statistics.reverts_made;this.restrictObject(_e,"statistics","reverts_made");me(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");me(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");me(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");me(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");me(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");me(t.statistics.reverts_made.from_abuselogs)||this.reset("statistics","reverts_made","from_abuselogs");me(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const Se=t.statistics.users_welcomed;this.restrictObject(Se,"statistics","users_welcomed");me(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const qe=t.statistics.warnings_issued;this.restrictObject(qe,"statistics","warnings_issued");me(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");me(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");me(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");me(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");me(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");me(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const Ee=t.statistics.reports_filed;this.restrictObject(Ee,"statistics","reports_filed");me(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");me(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");me(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");me(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP");me(t.statistics.reports_filed.global_blocks)||this.reset("statistics","reports_filed","global_blocks");me(t.statistics.reports_filed.global_locks)||this.reset("statistics","reports_filed","global_locks")}{const Le=t.statistics.watchlist;this.restrictObject(Le,"statistics","watchlist");me(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");me(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const Ae=t.statistics.items_whitelisted;this.restrictObject(Ae,"statistics","items_whitelisted");me(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");me(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");me(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");me(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const Te=t.statistics.items_highlighted;this.restrictObject(Te,"statistics","items_highlighted");me(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");me(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");me(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");me(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const Ce=t.statistics.actions_executed;this.restrictObject(Ce,"statistics","actions_executed");me(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");me(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const ze=t.statistics.session_time;"number"==typeof ze&&ze>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Me=t.highlight;this.restrictObject(Me,"highlight");{const $e=t.highlight.users;Array.isArray($e)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const Oe=t.highlight.pages;Array.isArray(Oe)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const Ie=t.highlight.tags;Array.isArray(Ie)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const Pe=t.whitelist;this.restrictObject(Pe,"whitelist");{const je=t.whitelist.users;Array.isArray(je)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const We=t.whitelist.pages;Array.isArray(We)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const De=t.whitelist.tags;Array.isArray(De)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}{const Re=t.favorite;this.restrictObject(Re,"favorite");{const Ue=t.favorite.warnings;Array.isArray(Ue)||this.reset("favorite","warnings"),t.favorite.warnings=t.favorite.warnings.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite warning [ ${e} ] from stored data.`),t})}{const Ne=t.favorite.reverts;Array.isArray(Ne)||this.reset("favorite","reverts"),t.favorite.reverts=t.favorite.reverts.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite revert [ ${e} ] from stored data.`),t})}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=3,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},955(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.getWarningFromLookup=function(e){return a[e]},t.warningsLookup=t.warnings=t.warningTemplateColors=void 0;t.warningTemplateColors={0:"grey",1:"#4169e1",2:"#ff8c00",3:"#ff4500",4:"#b22222","4im":"#000000"};const n={0:"1",1:"2",2:"3",3:"4",4:"report","4im":"report"},s=t.warnings={Vandalism:{title:"Vandalism",icon:"fas fa-skull-crossbones",description:"Warnings for different types of vandalism.",warnings:[{reportable:!0,queueType:["edit"],title:"Vandalism",name:"vandalism",icon:"fas fa-skull-crossbones",description:"Warning for general vandalism.",summary:"vandalism",auto:n,templates:[{name:"1",template:"uw-vandalism1"},{name:"2",template:"uw-vandalism2"},{name:"3",template:"uw-vandalism3"},{name:"4",template:"uw-vandalism4"},{name:"4im",template:"uw-vandalism4im"}]},{reportable:!0,queueType:["edit"],title:"Subtle vandalism",name:"subtle vandalism",icon:"fas fa-user-secret",description:"Warning for subtle vandalism.",summary:"subtle vandalism",auto:n,templates:[{name:"1",template:"uw-subtle1"},{name:"2",template:"uw-subtle2"},{name:"3",template:"uw-subtle3"},{name:"4",template:"uw-subtle4"}]},{reportable:!0,queueType:["edit"],title:"Image vandalism",name:"image vandalism",icon:"fas fa-image",description:"Warning for image vandalism.",summary:"image vandalism",auto:n,templates:[{name:"1",template:"uw-image1"},{name:"2",template:"uw-image2"},{name:"3",template:"uw-image3"},{name:"4",template:"uw-image4"},{name:"4im",template:"uw-image4im"}]},{reportable:!0,queueType:["edit"],title:"Sandbox",name:"[[WP:BADSAND|inappropriate]] sandbox use",icon:"fas fa-vial",description:"Warning for vandalism, libelous, or defamatory content added to sandbox",summary:"[[WP:BADSAND|inappropriate]] sandbox use",auto:n,templates:[{name:"1",template:"uw-sandbox1"},{name:"2",template:"uw-sandbox2"},{name:"3",template:"uw-sandbox3"},{name:"4",template:"uw-sandbox4"},{name:"4im",template:"uw-sandbox4im"}]},{reportable:!0,queueType:["edit"],title:"Deliberate errors",name:"deliberate errors",icon:"fas fa-bug",description:"Adding deliberate errors to articles.",summary:"deliberate errors",auto:n,templates:[{name:"1",template:"uw-error1"},{name:"2",template:"uw-error2"},{name:"3",template:"uw-error3"},{name:"4",template:"uw-error4"}]}]},Disruption:{title:"Disruption",icon:"fas fa-exclamation",description:"Warnings for different types of disruptive behavior.",warnings:[{reportable:!0,queueType:["edit"],title:"Disruptive editing",name:"[[WP:DE|disruptive editing]]",icon:"fas fa-exclamation",description:"Default warning for making disruptive edits but may be good faith.",summary:"[[WP:DE|disruptive editing]]",auto:n,templates:[{name:"1",template:"uw-disruptive1"},{name:"2",template:"uw-disruptive2"},{name:"3",template:"uw-disruptive3"},{name:"4",template:"uw-generic4",generic:"''Disruptive editing. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Editing tests",name:"editing tests",icon:"fas fa-flask",description:"Making test edits on live articles.",summary:"test edits",auto:n,templates:[{name:"1",template:"uw-test1"},{name:"2",template:"uw-test2"},{name:"3",template:"uw-test3"},{name:"4",template:"uw-generic4",generic:"''Test edits. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Commentary",name:"commentary",icon:"fas fa-comment-alt",description:"Adding opinion or commentary to articles.",summary:"commentary / talking in article",auto:n,templates:[{name:"1",template:"uw-talkinarticle1"},{name:"2",template:"uw-talkinarticle2"},{name:"3",template:"uw-talkinarticle3"},{name:"4",template:"uw-generic4",generic:"''Adding commentary to articles. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Inappropriate jokes",name:"inappropriate humor",icon:"fas fa-grin-squint",description:"Adding inappropriate humor to an article.",summary:"inappropriate humor",auto:n,templates:[{name:"1",template:"uw-joke1"},{name:"2",template:"uw-joke2"},{name:"3",template:"uw-joke3"},{name:"4",template:"uw-joke4"},{name:"4im",template:"uw-joke4im"}]},{reportable:!0,queueType:["edit"],title:"Deleting",name:"unexplained deletion",icon:"fas fa-trash",description:"Used when a user does not explain deletion of part of an article.",summary:"unexplained deletion",auto:n,templates:[{name:"1",template:"uw-delete1"},{name:"2",template:"uw-delete2"},{name:"3",template:"uw-delete3"},{name:"4",template:"uw-delete4"},{name:"4im",template:"uw-delete4im"}]}]},"Content Issues":{title:"Content Issues",icon:"fas fa-file-alt",description:"Warnings for different types of content issues.",warnings:[{reportable:!0,queueType:["edit"],title:"Unsourced",name:"unsourced changes",icon:"fas fa-question",description:"Warning for unsourced content.",summary:"unsourced changes",auto:n,templates:[{name:"1",template:"uw-unsourced1"},{name:"2",template:"uw-unsourced2"},{name:"3",template:"uw-unsourced3"},{name:"4",template:"uw-unsourced4"}]},{reportable:!0,queueType:["edit"],title:"Unsourced (BLP)",name:"unsourced [[WP:BLP|biographies of living persons']] changes",icon:"fas fa-person-circle-question",description:"Warning for unsourced BLP content.",summary:"unsourced [[WP:BLP|biographies of living persons']] changes",auto:n,templates:[{name:"1",template:"uw-biog1"},{name:"2",template:"uw-biog2"},{name:"3",template:"uw-biog3"},{name:"4",template:"uw-biog4"},{name:"4im",template:"uw-biog4im"}]},{reportable:!0,queueType:["edit"],title:"Unsourced genre",name:"unsourced genre changes",icon:"fas fa-music",description:"Warning for unsourced genre changes.",summary:"unsourced genre changes",auto:n,templates:[{name:"1",template:"uw-genre1"},{name:"2",template:"uw-genre2"},{name:"3",template:"uw-genre3"},{name:"4",template:"uw-genre4"}]},{reportable:!0,queueType:["edit"],title:"Original research",name:"[[WP:OR|original research]]",icon:"fas fa-lightbulb",description:"Adding original research or synthesis.",summary:"[[WP:OR|original research]]",auto:n,templates:[{name:"1",template:"uw-nor1"},{name:"2",template:"uw-nor2"},{name:"3",template:"uw-nor3"},{name:"4",template:"uw-nor4"}]},{reportable:!0,queueType:["edit"],title:"POV",name:"[[WP:NPOV|non-neutral changes]]",icon:"fas fa-balance-scale-left",description:"Adding content which violates the neutral point of view policy.",summary:"[[WP:NPOV|non-neutral changes]]",auto:n,templates:[{name:"1",template:"uw-npov1"},{name:"2",template:"uw-npov2"},{name:"3",template:"uw-npov3"},{name:"4",template:"uw-npov4"}]},{reportable:!0,queueType:["edit"],title:"Censoring",name:"[[WP:NOTCENSORED|censoring content]]",icon:"fas fa-ban",description:"Censoring topically-relevant content.",summary:"[[WP:NOTCENSORED|censoring content]]",auto:n,templates:[{name:"1",template:"uw-notcensored1"},{name:"2",template:"uw-notcensored2"},{name:"3",template:"uw-notcensored3"},{name:"4",template:"uw-notcensored4"}]},{reportable:!0,queueType:["edit"],title:"AI-generated",name:"[[WP:LLM|AI-generated content]]",icon:"fas fa-robot",description:"Adding AI-generated content.",summary:"[[WP:LLM|AI-generated content]]",auto:n,templates:[{name:"1",template:"uw-ai1"},{name:"2",template:"uw-ai2"},{name:"3",template:"uw-ai3"},{name:"4",template:"uw-ai4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==0}},{reportable:!0,queueType:["edit"],title:"AI-generated (talk)",name:"[[WP:LLM|AI-generated content]] in a discussion",icon:"fas fa-robot",description:"Writing an AI-generated comment.",summary:"[[WP:LLM|AI-generated content]] in a discussion",auto:n,templates:[{name:"1",template:"uw-aitalk1"},{name:"2",template:"uw-aitalk2"},{name:"3",template:"uw-aitalk3"},{name:"4",template:"uw-aitalk4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==1}},{reportable:!0,queueType:["edit"],title:"MOS violation",name:"[[WP:MOS|manual of style]] violation",icon:"fas fa-spell-check",description:"Not following the Manual of Style.",summary:"[[WP:MOS|manual of style]] violation",auto:n,templates:[{name:"1",template:"uw-mos1"},{name:"2",template:"uw-mos2"},{name:"3",template:"uw-mos3"},{name:"4",template:"uw-mos4"}]},{reportable:!1,queueType:["edit"],title:"English variant",name:"[[WP:ENGVAR|different English variant]]",icon:"fas fa-globe",description:"Content added in a different English variant than the rest of the article.",summary:"[[WP:ENGVAR|different English variant]]",auto:"notice",templates:[{name:"notice",template:"uw-engvar"}]},{reportable:!1,queueType:["edit"],title:"Not English",name:"non-English content",icon:"fas fa-language",description:"Content added in a language other than English.",summary:"non-English content",auto:"notice",templates:[{name:"notice",template:"uw-lang-noteng"}]}]},Conduct:{title:"Conduct",icon:"fas fa-user-shield",description:"Warnings for different types of conduct issues.",warnings:[{reportable:!0,queueType:["edit"],title:"Personal attacks",name:"[[WP:NPA|personal attacks]]",icon:"fas fa-bomb",description:"Personal attacks towards another user.",summary:"[[WP:NPA|personal attacks]]",auto:n,templates:[{name:"1",template:"uw-npa1"},{name:"2",template:"uw-npa2"},{name:"3",template:"uw-npa3"},{name:"4",template:"uw-npa4"},{name:"4im",template:"uw-npa4im"}]},{reportable:!0,queueType:["edit"],title:"Harassment",name:"[[WP:HARASS|harassment]]",icon:"fas fa-shield-alt",description:"Harassment of another user.",summary:"[[WP:HARASS|harassment]] of another user",auto:n,templates:[{name:"1",template:"uw-harass1"},{name:"2",template:"uw-harass2"},{name:"3",template:"uw-harass3"},{name:"4",template:"uw-harass4"},{name:"4im",template:"uw-harass4im"}]},{reportable:!0,queueType:["edit"],title:"TPO",name:"[[WP:TPO|removing or editing]] others' posts",icon:"fas fa-hand-paper",description:"Removing or editing others' posts.",summary:"[[WP:TPO|removing or editing]] others' posts",auto:n,templates:[{name:"1",template:"uw-tpo1"},{name:"2",template:"uw-tpo2"},{name:"3",template:"uw-tpo3"},{name:"4",template:"uw-tpo4"},{name:"4im",template:"uw-tpo4im"}]},{reportable:!0,queueType:["edit"],title:"Chatting",name:"inappropriate use of article talk pages",icon:"fas fa-comments",description:"Using article talk pages for inappropriate discussion.",summary:"inappropriate use of article talk pages",auto:n,templates:[{name:"1",template:"uw-chat1"},{name:"2",template:"uw-chat2"},{name:"3",template:"uw-chat3"},{name:"4",template:"uw-chat4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==1}},{reportable:!0,queueType:["edit"],title:"Owning",name:"assuming [[WP:OWN|ownership of articles]]",icon:"fas fa-user-shield",description:"Assuming ownership of articles.",summary:"assuming [[WP:OWN|ownership of articles]]",auto:n,templates:[{name:"1",template:"uw-own1"},{name:"2",template:"uw-own2"},{name:"3",template:"uw-own3"},{name:"4",template:"uw-own4"}]},{reportable:!0,queueType:["edit"],title:"AfD removal",name:"removing AfD templates or comments",icon:"fas fa-gavel",description:"Removing AfD templates or other users' comments from AfD discussions.",summary:"removing AfD templates or comments",auto:n,templates:[{name:"1",template:"uw-afd1"},{name:"2",template:"uw-afd2"},{name:"3",template:"uw-afd3"},{name:"4",template:"uw-afd4"}]},{reportable:!1,queueType:["edit"],title:"Edit warring",name:"[[WP:EW|edit warring]]",icon:"fas fa-jet-fighter",description:"Engaging in edit warring.",summary:"[[WP:EW|edit warring]]",auto(e){var t;return+(null==e||null===(t=e.user)||void 0===t?void 0:t.edits)<500?"notice":"warning"},templates:[{name:"notice",template:"uw-ew-soft",color:"grey"},{name:"warning",template:"uw-ew",color:"#ff4500"}]},{reportable:!0,queueType:["edit"],title:"Gaming the system",name:"[[WP:GAME|gaming the system]]",icon:"fas fa-chess-knight",description:"Attempting to game Wikipedia's policies or guidelines.",summary:"[[WP:GAME|gaming the system]]",auto:n,templates:[{name:"1",template:"uw-gaming1"},{name:"2",template:"uw-gaming2"},{name:"3",template:"uw-gaming3"},{name:"4",template:"uw-gaming4"},{name:"4im",template:"uw-gaming4im"}]}]},Promotional:{title:"Promotional",icon:"fas fa-bullhorn",description:"Warnings for promotional content.",warnings:[{reportable:!0,queueType:["edit"],title:"Advertising",name:"[[WP:PROMO|advertising or promotion]]",icon:"fas fa-ad",description:"Adding advertising or promotional content.",summary:"[[WP:PROMO|advertising or promotion]]",auto:n,templates:[{name:"1",template:"uw-advert1"},{name:"2",template:"uw-advert2"},{name:"3",template:"uw-advert3"},{name:"4",template:"uw-advert4"},{name:"4im",template:"uw-advert4im"}]},{reportable:!0,queueType:["edit"],title:"Spam links",name:"adding [[WP:ELNO|inappropriate links]]",icon:"fas fa-link",description:"Adding spam or promotional links.",summary:"adding [[WP:ELNO|inappropriate links]]",auto:n,templates:[{name:"1",template:"uw-spam1"},{name:"2",template:"uw-spam2"},{name:"3",template:"uw-spam3"},{name:"4",template:"uw-spam4"},{name:"4im",template:"uw-spam4im"}]},{reportable:!1,queueType:["edit"],title:"COI Edit",name:"editing with a [[WP:COI|conflict of interest]]",icon:"fas fa-user-tie",description:"Editing with a conflict of interest.",summary:"editing with a [[WP:COI|conflict of interest]]",auto:"notice",templates:[{name:"notice",template:"uw-coi"},{name:"warning",template:"uw-coi-warn"},{name:"username",template:"uw-coi-username"}]},{reportable:!1,queueType:["logevent"],title:"COI Log",name:"apparent [[WP:COI|conflict of interest]]",icon:"fas fa-user-tie",description:"Apparent conflict of interest.",summary:"apparent [[WP:COI|conflict of interest]]",auto:"username",templates:[{name:"username",template:"uw-coi-username"}]}]},"Abuse Log":{title:"Abuse Log",icon:"fas fa-shield-virus",description:"Warnings for triggering edit filters.",warnings:[{reportable:!0,queueType:["abuselog"],title:"Attempt",name:"triggering an edit filter",icon:"fas fa-vial",description:"Triggering an edit filter.",auto:n,templates:[{name:"1",template:"uw-attempt1"},{name:"2",template:"uw-attempt2"},{name:"3",template:"uw-attempt3"},{name:"4",template:"uw-attempt4"},{name:"4im",template:"uw-attempt4im"}],show:e=>!Boolean(null==e?void 0:e.revid)}]},"Edit Summary":{title:"Edit Summary",icon:"fas fa-pen-alt",description:"Warnings for inappropriate edit summaries.",warnings:[{reportable:!1,queueType:["edit"],title:"No edit summary",name:"no [[WP:ES|edit summary]] provided",icon:"fas fa-pen-nib",description:"Making an edit without providing an edit summary.",summary:"no [[WP:ES|edit summary]] provided",auto(e){var t;return+(null==e||null===(t=e.user)||void 0===t?void 0:t.edits)<500?"newcomer":"experienced"},templates:[{name:"notice",template:"uw-es"},{name:"experienced",template:"uw-es2"}]},{reportable:!0,queueType:["edit","logevent","abuselog"],title:"Inappropriate edit summary",name:"inappropriate [[WP:ES|edit summary]]",icon:"fas fa-pen-alt",description:"Using an inappropriate edit summary.",summary:"inappropriate [[WP:ES|edit summary]]",auto:n,templates:[{name:"1",template:"uw-bes1"},{name:"2",template:"uw-bes2"},{name:"3",template:"uw-bes3"},{name:"4",template:"uw-bes4"},{name:"4im",template:"uw-bes4im"}]},{reportable:!0,queueType:["edit","logevent","abuselog"],title:"Misleading edit summary",name:"misleading [[WP:ES|edit summary]]",icon:"fas fa-mask",description:"Using a misleading edit summary.",summary:"misleading [[WP:ES|edit summary]]",auto:n,templates:[{name:"1",template:"uw-mislead1"},{name:"2",template:"uw-mislead2"},{name:"3",template:"uw-mislead3"},{name:"4",template:"uw-generic4",generic:"''Misleading edit summary. ([[WP:WikiShield|WS]])''"}]},{reportable:!1,queueType:["edit","abuselog"],title:"Minor edit abuse",name:"improper use of [[WP:ME|minor edit]] checkbox",icon:"fas fa-minus",description:"Non-minor edit marked as minor",summary:"improper use of [[WP:ME|minor edit]] checkbox",auto:"notice",templates:[{name:"notice",template:"uw-minor"}]}]}},i={};for(const[e,t]of Object.entries(s)){const e=t.warnings.length;for(let n=0;n<e;n++){const e=t.warnings[n];i[e.title]=e}}const a=t.warningsLookup=i},863(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.welcomes=void 0;const n=t.welcomes={Auto:{title:"Auto",template:e=>{}},Default:{title:"Default",template:"Welcome",sign:!0},Basic:{title:"Basic",template:"W-basic",sign:!1},"Non-Latin":{title:"Non-Latin",template:"Welcome-non-latin",sign:!0},"Vandalism fighter":{title:"Vandalism fighter",template:"Welcome-vandalism fighter",sign:!1},Personal:{title:"Personal",template:"Welcome-personal",sign:!0},Cookie:{title:"Cookie",template:"Welcome cookie",sign:!0},Kitten:{title:"Kitten",template:"Welcome kitten",sign:!1},Graphical:{title:"Graphical",template:"W-graphical",sign:!1},Screen:{title:"Screen",template:"W-screen",sign:!1},Autobiography:{title:"Autobiography",template:"Welcome-auto",sign:!0},COI:{title:"COI",template:"Welcome-COI",sign:!0}};n.Auto.template=e=>!n["Non-Latin"].hide&&/[^\u0000-\u007F]/.test(e.name)?"Non-Latin":"Default"},4153(e,t,n){var s=n(8878);void 0===window.electron?(window.isElectron=!1,window.electron={mwapiLoader:()=>{window.dispatchEvent(new CustomEvent("mwapi-loaded",{detail:{server:window.location.host,username:mw.user.getName(),pendingChangesServers:s.MediaWikiAPI.pendingChangesServer,dev:!1}}))},mwapiLoaded:e=>window.addEventListener("mwapi-loaded",t=>{const{server:n,username:s,pendingChangesServers:i,dev:a}=t.detail;e(n,s,i,a)}),mwapi:()=>Promise.reject(new Error("Not running in Electron environment")),menuEnabler:()=>{},setBadgeCount:()=>{},sendNotification:()=>Promise.reject(new Error("Not running in Electron environment")),localStorage:{get:e=>localStorage.getItem(e),set:(e,t)=>localStorage.setItem(e,t),delete:e=>localStorage.removeItem(e)},copyToClipboard:async e=>{if(navigator.clipboard&&navigator.clipboard.writeText)await navigator.clipboard.writeText(e);else{const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}},log:e=>console.debug(e),info:e=>console.info(e),warn:e=>console.warn(e),error:e=>console.error(e),errorbox:(e,t)=>alert(`${e}\n\n${t}`),closePopup:e=>e.close(),openExternal:e=>window.open(e,"_blank"),openInBrowser:async e=>{const t=.8*window.screen.availWidth,n=.8*window.screen.availHeight,s=window.screenX+(window.outerWidth-t)/2,i=window.screenY+(window.outerHeight-n)/2,a=window.open(e,"myPopup",`width=${t},height=${n},left=${s},top=${i},resizable=false,scrollbars=true,menubar=false,toolbar=false,location=false,status=false`);return a.focus(),a.addEventListener("beforeunload",()=>{a.closed&&window.dispatchEvent(new CustomEvent("popup-closed",{detail:a}))}),a},onPopupClosed:e=>window.addEventListener("popup-closed",t=>e(t.detail)),onBeforeunload:()=>{},unloaded:()=>{},saveAccount:()=>{},disable:(e,t)=>{alert(`${e}\n\n${t}`),location.reload()}}):window.isElectron=!0,document.querySelectorAll("[data-electron]").forEach(e=>{"false"===e.dataset.electron&&window.isElectron?e.remove():"true"!==e.dataset.electron||window.isElectron||e.remove()})},7411(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{constructor(){super(),e(this,"handleDragStart",(e,t)=>{this.draggedIndex=e,this.placeholderIndex=e,t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e),requestAnimationFrame(()=>{this.updateDragState()})}),e(this,"handleDragOver",(e,t)=>{if(t.preventDefault(),null===this.draggedIndex||e===this.placeholderIndex)return;const n=[...this.items],s=n[this.draggedIndex];n.splice(this.draggedIndex,1),n.splice(e,0,s),this.items=n,this.draggedIndex=e,this.placeholderIndex=e,this.render()}),e(this,"handleDragEnd",()=>{this.dispatchEvent(new CustomEvent("reorder",{detail:{keys:this.items.map(e=>e.key)},bubbles:!0})),this.draggedIndex=null,this.placeholderIndex=null,this.updateDragState()}),this.items=[],this.draggedIndex=null,this.placeholderIndex=null,this.itemWrappers=[]}connectedCallback(){this.className="draggable-order-list",this.syncItemsFromChildren()}syncItemsFromChildren(){const e=Array.from(this.children);this.items=e.map((e,t)=>({child:e,key:e.dataset.key||e.getAttribute("key")||t})),this.render()}addItem(e,t){this.items.push({child:e,key:t||this.items.length}),this.render()}clearItems(){this.items=[],this.render()}updateDragState(){const e=null!==this.draggedIndex;this.classList.toggle("is-dragging",e),this.itemWrappers.forEach((e,t)=>{e.classList.toggle("dragging",this.draggedIndex===t)})}render(){this.innerHTML="",this.itemWrappers=[],this.items.forEach((e,t)=>{const n=document.createElement("div");n.className="draggable-order-item-wrapper",n.draggable=!0,n.dataset.key=e.key,n.addEventListener("dragstart",e=>this.handleDragStart(t,e)),n.addEventListener("dragover",e=>this.handleDragOver(t,e)),n.addEventListener("dragend",this.handleDragEnd),n.appendChild(e.child.cloneNode?e.child.cloneNode(!0):e.child),this.appendChild(n),this.itemWrappers.push(n)}),this.updateDragState()}}class n extends HTMLElement{static get observedAttributes(){return["name","enabled"]}constructor(){super(),e(this,"handleToggle",e=>{e.stopPropagation(),this._enabled=!this._enabled,this.updateEnabledState(),this.dispatchEvent(new CustomEvent("toggle",{detail:{enabled:this._enabled},bubbles:!0}))}),this._name="",this._enabled=!0}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"name":this._name=n||"",this.nameSpan&&(this.nameSpan.textContent=this._name);break;case"enabled":this._enabled="false"!==n&&"0"!==n,this.updateEnabledState()}}get name(){return this._name}set name(e){this.setAttribute("name",e)}get enabled(){return this._enabled}set enabled(e){this.setAttribute("enabled",e)}updateEnabledState(){this.classList.toggle("disabled",!this._enabled),this.toggle&&(this.toggle.title=this._enabled?"Click to disable":"Click to enable")}render(){this.className="draggable-order-item",this.innerHTML="",this.nameSpan=document.createElement("span"),this.nameSpan.className="draggable-order-item-name",this.nameSpan.textContent=this._name,this.toggle=document.createElement("div"),this.toggle.className="draggable-order-item-toggle",this.toggle.addEventListener("click",this.handleToggle),this.appendChild(this.nameSpan),this.appendChild(this.toggle),this.updateEnabledState()}}customElements.define("draggable-order-list",t),customElements.define("draggable-order-item",n)},7732(e,t,n){var s=n(3241);class i extends HTMLElement{constructor(){super(),this.duration={years:0,months:0,weeks:0,days:0,hours:0,minutes:0,seconds:0},this.isInfinite=!1}connectedCallback(){this.render(),this.attachEventListeners()}render(){this.innerHTML=`\n <label class="infinity-label">\n <span>Infinite Duration</span>\n </label>\n <div class="duration-inputs">\n ${[{key:"years",label:"Years"},{key:"months",label:"Months"},{key:"weeks",label:"Weeks"},{key:"days",label:"Days"},{key:"hours",label:"Hours"},{key:"minutes",label:"Minutes"},{key:"seconds",label:"Seconds"}].map(e=>`\n <label>\n <span>${e.label}</span>\n <input\n type="number"\n min="0"\n data-unit="${e.key}"\n value="0"\n step="1"\n placeholder="0"\n />\n </label>\n `).join("")}\n </div>\n `}attachEventListeners(){const e=this.querySelector(".infinity-label");e.addEventListener("click",()=>{this.isInfinite=!this.isInfinite,e.classList.toggle("selected",this.isInfinite),this.dispatchChangeEvent()}),this.querySelectorAll('input[type="number"]').forEach(e=>{e.addEventListener("input",e=>{const t=e.target.dataset.unit;this.duration[t]=parseInt(e.target.value,10)||0,this.dispatchChangeEvent()})})}dispatchChangeEvent(){this.dispatchEvent(new CustomEvent("change",{detail:this.getDurationString(),bubbles:!0}))}get value(){return this.getDurationString()}getDurationString(){if(this.isInfinite)return"infinite";let e="";const t={years:"Y",months:"M",weeks:"W",days:"D",hours:"H",minutes:"M",seconds:"S"};for(const[n,s]of Object.entries(this.duration))s>0&&(e+=`${s}${t[n]}`);return e||"0S"}set value(e){if("infinite"===e||"infinity"===e||"∞"===e){this.isInfinite=!0;const e=this.querySelector(".infinity-label");return void(e&&e.classList.add("selected"))}this.isInfinite=!1;const t=this.querySelector(".infinity-label");t&&t.classList.remove("selected");const n=s.expiryRegex.exec(e);if(n)for(const e of Object.keys(this.duration)){const t=n.groups[e];this.duration[e]=t?parseInt(t,10):0;const s=this.querySelector(`input[data-unit="${e}"]`);s&&(s.value=this.duration[e])}}}customElements.define("duration-input",i)},1914(e,t,n){n(7732),n(2784),n(5155),n(7411),n(1731)},5155(e,t){function n(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.NumericInput=void 0;class s extends HTMLElement{static get observedAttributes(){return["value","min","max","step"]}constructor(){super(),n(this,"handleMinus",()=>{const e=Number(this.inputValue),t=Math.round(100*Math.max(e-this.step,this.min))/100;this.updateValue(t)}),n(this,"handlePlus",()=>{const e=Number(this.inputValue),t=Math.round(100*Math.min(e+this.step,this.max))/100;this.updateValue(t)}),n(this,"handleInputChange",()=>{const e=this.input.value;if(isNaN(Number(e)))return void(this.input.value=this.inputValue);let t=Math.round(100*Math.min(Math.max(Number(e),this.min),this.max))/100;t=this.step>=1?Math.round(t):t,this.updateValue(t)}),n(this,"handleKeyUp",e=>{"enter"===e.key.toLowerCase()&&(this.handleInputChange(),e.target.blur())}),n(this,"handleInput",e=>{this.inputValue=e.target.value}),this.inputValue=0,this._min=-1/0,this._max=1/0,this._step=1}connectedCallback(){this.render(),this.setupEventListeners()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"value":this.inputValue=Number(n)||0,this.input&&(this.input.value=this.inputValue);break;case"min":this._min=Number(null!=n?n:-1/0);break;case"max":this._max=Number(null!=n?n:1/0);break;case"step":this._step=Number(null!=n?n:1)}}get value(){return this.inputValue}set value(e){this.setAttribute("value",e)}get min(){return this._min}get max(){return this._max}get step(){return this._step}updateValue(e){this.inputValue=e,this.input.value=e,this.dispatchEvent(new CustomEvent("change",{detail:{value:e},bubbles:!0}))}setupEventListeners(){this.minusBtn.addEventListener("click",this.handleMinus),this.plusBtn.addEventListener("click",this.handlePlus),this.input.addEventListener("input",this.handleInput),this.input.addEventListener("blur",this.handleInputChange),this.input.addEventListener("keyup",this.handleKeyUp),this.input.addEventListener("wheel",e=>{e.preventDefault(),e.deltaY<0?this.handlePlus():e.deltaY>0&&this.handleMinus()})}render(){this.className="numeric-input-container",this.minusBtn=document.createElement("span"),this.minusBtn.className="fa fa-minus numeric-input-button",this.input=document.createElement("input"),this.input.type="text",this.input.className="numeric-input",this.input.value=this.inputValue,this.input.autocomplete="off",this.plusBtn=document.createElement("span"),this.plusBtn.className="fa fa-plus numeric-input-button",this.appendChild(this.minusBtn),this.appendChild(this.input),this.appendChild(this.plusBtn)}}t.NumericInput=s,customElements.define("numeric-input",s)},2784(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{static get observedAttributes(){return["value","checked"]}constructor(){super(),e(this,"handleClick",()=>{this._value=!this._value,this.updateState(),this.dispatchEvent(new CustomEvent("change",{detail:{value:this._value,checked:this._value},bubbles:!0}))}),this._value=!1}connectedCallback(){this.render(),this.updateState()}attributeChangedCallback(e,t,n){t!==n&&("value"!==e&&"checked"!==e||(this._value="true"===n||"1"===n||""===n,this.updateState()))}get value(){return this._value}set value(e){this._value=!!e,this.setAttribute("value",this._value),this.updateState()}get checked(){return this._value}set checked(e){this.value=e}updateState(){this.classList.toggle("active",this._value)}render(){this.classList.add("settings-toggle"),this.innerHTML="";const e=document.createElement("div");e.className="toggle-switch";const t=document.createElement("div");t.className="toggle-slider",e.appendChild(t),this.appendChild(e),this.addEventListener("click",this.handleClick)}}customElements.define("toggle-input",t)},1731(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{static get observedAttributes(){return["title","description","value"]}constructor(){super(),e(this,"handleVolumeChange",e=>{const t=Math.max(0,Math.min(1,parseFloat(e.target.value)));this._value=t,this.slider.value=t,this.input.value=t.toFixed(2),this.dispatchEvent(new CustomEvent("change",{detail:{value:t},bubbles:!0}))}),this._title="",this._description="",this._value=.5,this._sound="",this._preview=null}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"title":this._title=n||"",this.titleEl&&(this.titleEl.textContent=this._title);break;case"description":this._description=n||"",this.descEl&&(this.descEl.textContent=this._description);break;case"value":this._value=Math.max(0,Math.min(1,parseFloat(n))),this.slider&&(this.slider.value=this._value),this.input&&(this.input.value=this._value.toFixed(2))}}get title(){return this._title}set title(e){this.setAttribute("title",e)}get value(){return this._value}set value(e){this.setAttribute("value",e)}setPreview(e,t){this._preview={audio:e,path:t},this.render()}render(){this.className="volume-control",this.innerHTML="";const e=document.createElement("div");e.className="volume-control-header";const t=document.createElement("div");if(t.className="volume-control-info",this.titleEl=document.createElement("div"),this.titleEl.className="volume-control-title",this.titleEl.textContent=this._title,this.descEl=document.createElement("div"),this.descEl.className="volume-control-desc",this.descEl.textContent=this._description,t.appendChild(this.titleEl),t.appendChild(this.descEl),e.appendChild(t),this._preview){const t=document.createElement("button");t.className="volume-control-preview",t.title="Preview sound",t.addEventListener("click",()=>{if(t.classList.contains("playing"))return;t.classList.add("playing");const e=t.querySelector("i");e&&(e.className="fa fa-stop");const n=new AbortController;t.onclick=()=>n.abort(),this._preview.audio.stopPreviews(),this._preview.audio.playSound(this._preview.path,n.signal,!0).finally(()=>{t.onclick=null,t.classList.remove("playing"),e&&(e.className="fa fa-play")})});const n=document.createElement("i");n.className="fa fa-play",t.appendChild(n),e.appendChild(t)}this.appendChild(e);const n=document.createElement("div");n.className="volume-control-slider-container",this.slider=document.createElement("input"),this.slider.type="range",this.slider.className="volume-control-slider",this.slider.min="0",this.slider.max="1",this.slider.step="0.01",this.slider.value=this._value,this.slider.autocomplete="off",this.slider.addEventListener("input",this.handleVolumeChange),n.appendChild(this.slider),this.input=document.createElement("input"),this.input.type="number",this.input.className="volume-control-input",this.input.min="0",this.input.max="1",this.input.step="0.01",this.input.value=this._value.toFixed(2),this.input.autocomplete="off",this.input.addEventListener("input",this.handleVolumeChange),n.appendChild(this.input),this.appendChild(n)}}customElements.define("volume-control",t)},8816(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.run=r,n(4153),n(1914);var s=n(7054),i=n(9501),a=n(691);function r(){addEventListener("wheel",e=>{e.target.closest(".no-scroll")||"INPUT"===e.target.tagName&&"number"===e.target.type&&(e.stopPropagation(),e.target.value=Number(e.target.value)+(e.deltaY<0?1:-1),e.target.dispatchEvent(new Event("input")))},{passive:!0}),electron.menuEnabler(),electron.mwapiLoaded(async(e,t,n,r)=>{if(i.StorageManager.okay(null,electron)){var o;document.querySelector("#rollback-needed .request-link").href=null!==(o=await fetch("https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q7765871&props=sitelinks/urls&format=json&origin=*").then(e=>e.json()).then(t=>{var n;return(null===(n=Object.values(t.entities.Q7765871.sitelinks).find(t=>t.url.startsWith(`https://${e}/wiki/`)))||void 0===n?void 0:n.url)||null}).catch(()=>null))&&void 0!==o?o:"https://www.wikidata.org/wiki/Q7765871";const i=new s.WikiShield(e,t,n,r);electron.onOpenBrowser(()=>i.open(null,!1)),electron.onOpenUrl(e=>i.open(e,!1)),electron.onOpenNotification(e=>{const t=new URL(e);if(t.searchParams.has("markasread")){const e=i.notifications.find(null,+t.searchParams.get("markasread"));e&&i.notifications.read(e.type,e.notification)}i.open(e)}),electron.menuEnabler({browser:!0}),i.on("ready",()=>{electron.onBeforeunload(async()=>{await i.save(),electron.unloaded()}),window.addEventListener("beforeunload",async()=>await i.save());const e=new a.Killswitch(i);e.on("kill",()=>{alert("WikiShield has been temporarily disabled. Please contact the development team for more information."),window.close()}),e.on("force-update",()=>{alert("The current version of WikiShield is no longer supported. Please update to the latest version to continue using WikiShield."),window.close()}),e.on("update",()=>{electron.sendNotification({title:"WikiShield Update",body:"A new version of WikiShield is available. Please update to the latest version for the best experience."},"")}),e.on("unsafe",()=>{alert("Could not verify the integrity of WikiShield. Make sure you are connected to the internet. If the problem persists, please contact the development team."),window.close()}),e.on("okay",async()=>{addEventListener("keydown",e=>i.controller(e)),addEventListener("keyup",e=>i.controller(e)),await i.init()},{once:!0}),e.check().then(()=>e.monitor(1e4))},{once:!0})}else alert("An error has occurred with the WikiShield storage system that could lead to data loss. For that reason, WikiShield has been automatically disabled. Please report this immediately to the development team."),window.close()}),electron.mwapiLoader().catch(e=>{alert(`An error occurred while loading the WikiShield API:\n\n${e.stack||e}`),window.close()})}window.isElectron&&r()},317(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AutoScroll=function(){document.querySelectorAll(".auto-scroll").forEach(e=>{e.dataset.autoScrollInitialized||(e.parentElement.addEventListener("wheel",t=>{e.dataset.autoScrollFreeze=750,e.dataset.autoScrollLastTime=performance.now();let n=parseFloat(e.dataset.autoScrollOffset)||0;const s=Math.abs(t.deltaX),i=Math.abs(t.deltaY),a=Math.abs(t.deltaZ),r=s+i+a;if(0===r)return;let o;switch(Math.max(s,i,a)){case s:o=Math.sign(t.deltaX);break;case i:o=Math.sign(t.deltaY);break;case a:o=Math.sign(t.deltaZ)}n+=o*r,e.dataset.autoScrollOffset=n},{passive:!0}),e.dataset.autoScrollInitialized=!0);let t=parseFloat(e.dataset.autoScrollOffset)||0;if("autoScrollFreeze"in e.dataset){const n=parseFloat(e.dataset.autoScrollLastTime)||performance.now(),s=performance.now();t+=s-n,e.dataset.autoScrollOffset=t,e.dataset.autoScrollLastTime=s;const i=parseFloat(e.dataset.autoScrollFreeze);i>0?e.dataset.autoScrollFreeze=i-s+n:(delete e.dataset.autoScrollFreeze,delete e.dataset.autoScrollLastTime)}const s=parseFloat(e.dataset.autoScrollSpeed)||1;let i=parseFloat(e.dataset.autoScrollCarry)||0;i+=s;const a=Math.floor(i);e.dataset.autoScrollCarry=(i-a).toString();let r=e.querySelectorAll(":scope > .auto-scroll-item").length;if(0===r){const t=e.innerHTML;e.innerHTML="";const n=document.createElement("span");n.className="auto-scroll-item",n.innerHTML=t,e.appendChild(n),r=1}const o=e.querySelector(":scope > .auto-scroll-item"),l=getComputedStyle(o),d=o.clientWidth+(parseFloat(l.marginLeft)||0)+(parseFloat(l.marginRight)||0),c=e.clientWidth;if(d<c)return void e.querySelectorAll(":scope > .auto-scroll-item:not(:first-child)").forEach(e=>e.remove());const u=Math.ceil(c/d)+1-r;if(u>0)for(let e=0;e<u;e++){const e=o.cloneNode(!0);o.parentNode.insertBefore(e,o.nextSibling)}else if(u<0){const t=e.querySelectorAll(":scope > .auto-scroll-item");for(let e=0;e<-u;e++){var p;null===(p=t[e])||void 0===p||p.remove()}}const g=(performance.now()-t)/1e3*60*s%d;e.scrollLeft=g;const h=(e,t,n)=>{(async function(e,t,n,s=()=>!0){if(0===t)return Promise.resolve([0,0]);const i=e.scrollLeft,a=i+t,r=performance.now()+n;let o;const l=new Promise(e=>o=e),d=()=>{const l=performance.now(),c=i+Math.min(1,(l-(r-n))/n)*t;l>=r?(e.scrollLeft=a,o([0,0])):s(e,c)?(e.scrollLeft=c,requestAnimationFrame(d)):o([t-c+i,Math.max(0,r-l)])};return requestAnimationFrame(d),l})(e,t,n,(e,t)=>{var n;const s=d;return!(t>=s)||null!==(n=void(e.scrollLeft=t%s))&&void 0!==n&&n}).then(([t,n])=>{t>0&&h(e,t,n)})};s>0&&h(e,a,1e3*n)})};const n=1/60},4784(e,t){function n(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function s(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Dialog=void 0;var i=new WeakSet;function a(e){null!=e&&e.parentElement&&(e.classList.add("hidden"),setTimeout(()=>{e.parentElement&&e.remove()},300))}async function r(){if(this.dialogs.processing||0===this.dialogs.queue.length)return;this.dialogs.processing=!0;const{fn:e,resolve:t,reject:n}=this.dialogs.queue.shift();try{this.dialogs.active=!0;const n=await e();this.dialogs.active=null,t(n)}catch(e){this.dialogs.active=null,n(e)}finally{this.dialogs.processing=!1,requestAnimationFrame(()=>s(i,this,r).call(this))}}function o(e,t=!1){return new Promise((n,a)=>{t&&this.dialogs.active?e().then(n).catch(a):(this.dialogs.queue.push({fn:e,child:t,resolve:n,reject:a}),s(i,this,r).call(this))})}function l(e,t,n="",s=""){return new Promise(i=>{const a=document.createElement("div");a.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal"),a.appendChild(r);const o=document.createElement("div");o.classList.add("confirmation-modal-header"),r.appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal-title"),l.textContent=e,o.appendChild(l);const d=document.createElement("div");d.classList.add("confirmation-modal-body"),d.innerHTML=t,r.appendChild(d);const c=document.createElement("input");c.type="text",c.classList.add("confirmation-modal-input"),c.placeholder=n,c.value=s,d.appendChild(c),c.focus(),c.select();const u=document.createElement("div");u.classList.add("confirmation-modal-footer"),r.appendChild(u);const p=document.createElement("button");p.classList.add("confirmation-modal-button","confirmation-modal-button-cancel"),p.style.setProperty("--background","211, 51, 51"),p.textContent="Cancel",u.appendChild(p);const g=document.createElement("button");g.classList.add("confirmation-modal-button","confirmation-modal-button-submit"),g.style.setProperty("--background","51, 153, 211"),g.textContent="Submit",u.appendChild(g);const h=e=>{document.removeEventListener("keydown",m,!0),a.classList.add("closing"),r.classList.add("closing"),setTimeout(()=>{a.remove(),i(e)},200)},m=e=>{if("Enter"===e.key)return e.preventDefault(),e.stopPropagation(),h(c.value),!1;if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),h(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",m,!0),p.addEventListener("click",()=>h(null)),g.addEventListener("click",()=>h(c.value)),a.addEventListener("click",e=>{e.target===a&&h(null)})})}function d(e){return new Promise(t=>{const n=e=>{document.removeEventListener("keydown",s,!0),i.classList.add("closing"),a.classList.add("closing"),setTimeout(()=>{i.remove(),t(e)},200)},s=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),n(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",s,!0);const i=document.createElement("div");i.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(i);const a=document.createElement("div");a.classList.add("confirmation-modal"),i.appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal-header"),a.appendChild(r);const o=document.createElement("div");o.classList.add("confirmation-modal-title"),o.textContent="Report to UAA",r.appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal-body"),l.innerHTML="Select reason for reporting <span class='confirmation-modal-username'></span> to UAA:",a.appendChild(l),l.querySelector(".confirmation-modal-username").textContent=e;const d=document.createElement("div");d.classList.add("confirmation-modal-footer","confirmation-modal-footer-vertical"),a.appendChild(d),["Disruptive","Offensive","Promotional","Misleading"].forEach(e=>{const t=`${e} username`,s=document.createElement("button");s.classList.add("confirmation-modal-button","confirmation-modal-button-reason"),s.textContent=t,s.addEventListener("click",()=>n(t)),d.appendChild(s)});const c=document.createElement("button");c.classList.add("confirmation-modal-button","confirmation-modal-button-cancel"),c.style.setProperty("--background","211, 51, 51"),c.textContent="Cancel",c.addEventListener("click",()=>n(null)),d.appendChild(c),i.addEventListener("click",e=>{e.target===i&&n(null)})})}function c(e,t,n=null,s=!1){return new Promise(i=>{const a=e=>{document.removeEventListener("keydown",r,!0),o.classList.add("closing"),l.classList.add("closing"),setTimeout(()=>{o.remove(),i(e)},200)},r=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),a(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",r,!0);const o=document.createElement("div");o.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal"),o.appendChild(l);const d=document.createElement("div");d.classList.add("confirmation-modal-header"),l.appendChild(d);const c=document.createElement("div");c.classList.add("confirmation-modal-title"),c.textContent=e,d.appendChild(c);const u=document.createElement("div");u.classList.add("confirmation-modal-body"),u.innerHTML=t,l.appendChild(u);const p=document.createElement("div");if(p.classList.add("confirmation-modal-footer"),l.appendChild(p),n&&!s){const s=document.createElement("button");s.classList.add("confirmation-modal-button","confirmation-modal-button-uaa"),s.style.setProperty("--background","211, 51, 51"),s.textContent="Report to UAA",p.appendChild(s),s.addEventListener("click",()=>{document.removeEventListener("keydown",r,!0),o.classList.add("closing"),l.classList.add("closing"),setTimeout(async()=>{o.remove();const s=await this.UAA(n,!0);s?this.ws.execute({name:"reportToUAA",params:{reportMessage:s}},void 0,void 0,{user:{name:n}}):i(await this.confirm(e,t,n,!1,!0))},200)})}const g=document.createElement("div");g.classList.add("confirmation-modal-footer-right"),p.appendChild(g);const h=document.createElement("button");h.classList.add("confirmation-modal-button","confirmation-modal-button-no"),h.textContent="No",h.addEventListener("click",()=>a(!1)),g.appendChild(h);const m=document.createElement("button");m.classList.add("confirmation-modal-button","confirmation-modal-button-yes"),m.style.setProperty("--background","51, 102, 204"),m.textContent="Yes",m.addEventListener("click",()=>a(!0)),g.appendChild(m),o.addEventListener("click",e=>{e.target===o&&a(null)}),requestAnimationFrame(()=>m.focus())})}function u(e,t){return new Promise(async n=>{const s=document.createElement("div");s.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(s);const i=document.createElement("div");i.classList.add("confirmation-modal"),s.appendChild(i);const a=document.createElement("div");a.classList.add("confirmation-modal-header"),a.textContent=e,i.appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal-body"),r.innerHTML='<div class="dialog-loading">\n <div class="dialog-spinner"></div>\n <div class="dialog-loading-text">Loading...</div>\n </div>',i.appendChild(r);const o=()=>{document.removeEventListener("keydown",l,!0),s.classList.add("closing"),i.classList.add("closing"),setTimeout(()=>{s.remove(),n()},200)},l=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),o(),!1};document.addEventListener("keydown",l,!0),s.addEventListener("click",e=>{e.target===s&&o()}),t instanceof Promise?t.then(e=>{r&&(r.innerHTML=e)}).catch(()=>{r&&(r.innerHTML="Failed to load content")}):r.innerHTML=t})}t.Dialog=class{constructor(e){n(this,i),this.ws=e,this.dialogs={processing:!1,active:null,queue:[]},this.popups=[],addEventListener("focus",()=>{this.popups.length>0&&(this.popups.forEach(e=>electron.closePopup(e)),this.popups=[],requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())}))}),electron.onPopupClosed(e=>{const t=this.popups.indexOf(e);-1!==t&&this.popups.splice(t,1),0===this.popups.length&&requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())})})}controller(e){}check(){if(0===this.popups.length)return requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())});requestAnimationFrame(()=>this.check())}toast(e,t,n="default",r=5e3){const o=this.ws.store.settings.zen_mode;if(o.enabled&&!o.toasts.enabled)return!1;const l=document.createElement("div");l.classList.add("toast-alert",n);const d=document.createElement("div");d.classList.add("toast-icon"),l.appendChild(d);const c=document.createElement("i");switch(c.classList.add("fa"),d.appendChild(c),n){case"success":c.classList.add("fa-check");break;case"warning":c.classList.add("fa-exclamation-triangle");break;case"error":c.classList.add("fa-xmark");break;default:c.classList.add("fa-info-circle")}const u=document.createElement("div");u.classList.add("toast-content"),l.appendChild(u);const p=document.createElement("div");p.classList.add("toast-title"),p.textContent=e,u.appendChild(p);const g=document.createElement("div");g.classList.add("toast-message"),g.textContent=t,u.appendChild(g);const h=document.createElement("div");h.classList.add("toast-close"),h.addEventListener("click",()=>{s(i,this,a).call(this,l)}),l.appendChild(h);const m=document.createElement("i");return m.classList.add("fa","fa-xmark"),h.appendChild(m),document.body.querySelector("#app").appendChild(l),setTimeout(()=>{this.ws.audio.playSound(["notification","toast"]),l.classList.add("show")},10),r>0&&setTimeout(()=>s(i,this,a).call(this,l),r),!0}input(e,t,n="",a="",r=!1){return s(i,this,o).call(this,()=>s(i,this,l).call(this,e,t,n,a),r)}UAA(e,t=!1){return s(i,this,o).call(this,()=>s(i,this,d).call(this,e),t)}confirm(e,t,n=null,a=!1,r=!1){return s(i,this,o).call(this,()=>s(i,this,c).call(this,e,t,n,a),r)}show(e,t){return s(i,this,o).call(this,()=>s(i,this,u).call(this,e,t))}}},8469(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.GUI=void 0;var s=n(4192),i=n(4041),a=n(7054),r=n(2069),o=n(4784),l=n(8921),d=n(9117),c=n(372),u=n(955),p=n(7698),g=n(317);function h(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function m(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var v=new WeakSet;class f{constructor(e){h(this,v),this.ws=e,this.dialog=new o.Dialog(this.ws),this.events=new l.EventManager(this.ws),this.settings=new d.Settings(this.ws),this.intervals={DEFCON:null,outdated:null},this.controllers={current:null}}async build(){this.updateDEFCON(),document.documentElement.style.colorScheme={light:"only light",auto:"light dark",dark:"only dark"}[this.ws.store.UI.theme.app]||"light dark";const e={code:["ArrowUp","ArrowUp","ArrowDown","ArrowDown","ArrowLeft","ArrowRight","ArrowLeft","ArrowRight","b","a"],index:0,function:t=>{t.key!==e.code[e.index]?e.index=t.key===e.code[0]?1:0:++e.index===e.code.length&&(e.index=0,this.ws.open("https://ws.luni.me/konami-easter-egg","force"))}};addEventListener("keydown",e.function),this.updateAccessibility(),document.querySelector("#initial").classList.remove("hidden"),document.querySelectorAll(".VERSION").forEach(e=>e.textContent=a.WikiShield.config.version),Math.random()<.01&&(document.querySelector("#wikishield-sikiwhield").textContent="SikiWhield");const t=new AbortController;let n;const s=new Promise(e=>n=e);let i;this.ws.audio.playSound(["startup"],t.signal,!1,()=>n()),await s;const r=this.ws.store.settings.performance.startup;if("always_off"!==r){const e=document.getElementById("dots-canvas"),t=e.getContext("2d"),n=Math.min(devicePixelRatio||1,2);class s{constructor(){m(this,"radius",2),this.x=Math.random()*e.width,this.y=Math.random()*e.height,this.vx=.5*(Math.random()-.5),this.vy=.5*(Math.random()-.5),this.color=s.colors[Math.random()*s.colors.length|0],this.fill=`rgba(${this.color}, 0.8)`,this.shadow=`rgba(${this.color}, 0.8)`}update(){this.x+=this.vx,this.y+=this.vy,this.x<0?this.x=e.width:this.x>e.width&&(this.x=0),this.y<0?this.y=e.height:this.y>e.height&&(this.y=0)}draw(){t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.fillStyle=this.fill,t.fill()}}m(s,"dots",[]),m(s,"target",0),m(s,"colors",["102, 126, 234","240, 147, 251","118, 75, 162","217, 70, 239"]);let a=null;const o=()=>{a||(a=requestAnimationFrame(()=>{a=null;const i=e.width,r=e.height;e.width=Math.floor(innerWidth*n),e.height=Math.floor(innerHeight*n),e.style.width=`${innerWidth}px`,e.style.height=`${innerHeight}px`,t.setTransform(1,0,0,1,0,0),t.scale(n,n);const o=e.width/(i||e.width),l=e.height/(r||e.height);if(s.dots.forEach(e=>{e.x*=o,e.y*=l}),s.target=Math.floor(innerWidth*innerHeight/7e3),s.target=Math.max(40,Math.min(250,s.target)),s.target>s.dots.length)for(let e=s.dots.length;e<s.target;e++)s.dots.push(new s);else s.target<s.dots.length&&(s.dots.length=s.target)}))};o(),addEventListener("resize",o);const l=160,d=30,c=500;let u=null,p=performance.now();const g=new Array(15).fill(1e3/60),h=()=>{{const n=performance.now(),a=n-p;p=n,g.shift(),g.push(a);const o=[...g].sort((e,t)=>e-t).slice(2,-2),l=1e3/(o.reduce((e,t)=>e+t,0)/o.length);if("adaptive"===r){if(l<d){if(null===u&&(u=n),n-u>=c)return i&&cancelAnimationFrame(i),i=null,void t.clearRect(0,0,e.width,e.height)}else u=null;l<45&&s.dots.length>60&&(s.dots.length=Math.max(60,Math.floor(.9*s.dots.length)),s.target=s.dots.length)}}t.clearRect(0,0,e.width,e.height),s.dots.forEach(e=>{e.update(),e.draw()});const n=Math.ceil(innerWidth/l),a=Math.ceil(innerHeight/l),o=new Array(n*a);for(let e=0;e<o.length;e++)o[e]=[];s.dots.forEach((e,t)=>{const s=Math.max(0,Math.min(n-1,Math.floor(e.x/l))),i=Math.max(0,Math.min(a-1,Math.floor(e.y/l)));o[i*n+s].push(t)});const m=innerWidth/2,v=innerHeight/2,f=(e,n,s,i,a)=>{const r=[0];Math.max(e,s)>innerWidth&&r.push(-innerWidth),Math.min(e,s)<0&&r.push(innerWidth);const o=[0];Math.max(n,i)>innerHeight&&o.push(-innerHeight),Math.min(n,i)<0&&o.push(innerHeight),t.lineWidth=1,t.strokeStyle=a;for(const a of r)for(const r of o)t.beginPath(),t.moveTo(e+a,n+r),t.lineTo(s+a,i+r),t.stroke()};for(let e=0;e<a;e++)for(let t=0;t<n;t++){const i=o[e*n+t];if(0!==i.length)for(let r=-1;r<=1;r++){const l=(e+r+a)%a;for(let e=-1;e<=1;e++){const a=o[l*n+(t+e+n)%n];if(0!==a.length)for(let e=0;e<i.length;e++){const t=s.dots[i[e]];for(let n=0;n<a.length;n++){const r=a[n];if(r<=i[e])continue;const o=s.dots[r];let l=t.x-o.x,d=t.y-o.y;l>m&&(l-=innerWidth),l<-m&&(l+=innerWidth),d>v&&(d-=innerHeight),d<-v&&(d+=innerHeight);const c=l*l+d*d;if(c<22500){const e=.4*(1-Math.sqrt(c)/150),n=t.color.split(","),s=o.color.split(","),i=(parseInt(n[0])+parseInt(s[0]))/2,a=(parseInt(n[1])+parseInt(s[1]))/2,r=(parseInt(n[2])+parseInt(s[2]))/2;f(t.x,t.y,t.x-l,t.y-d,`rgba(${i}, ${a}, ${r}, ${e})`)}}}}}}i=requestAnimationFrame(h)};h()}this.ws.rights.rollback||"LuniZunie"===this.ws.api.username?(document.querySelector("#rollback-needed").classList.add("hidden"),document.querySelector("#start-button").classList.remove("hidden")):(document.querySelector("#rollback-needed").classList.remove("hidden"),document.querySelector("#start-button").classList.add("hidden")),document.querySelector("#start-button").addEventListener("click",()=>{window.removeEventListener("keydown",e.function),t.abort(),this.ws.audio.playSound(["ui","click"]),i&&cancelAnimationFrame(i),this.ws.start()}),window.addEventListener("click",e=>{[...document.querySelectorAll(".tooltip.buttons")].forEach(e=>e.remove());const t=e.target.closest("[href]");if(t){const n=new URL(t.href,location.href);if(n.origin===location.origin&&n.pathname===location.pathname)return;if(t.dataset.multipleHrefs)try{const[e,n=""]=t.dataset.multipleHrefs.split(";"),s=Object.fromEntries(n.split("&").map(e=>{const[t,n]=e.split("=");return[t,decodeURIComponent(n)]}));switch(e){case"page":{const e=s.title,n=+s.id;this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Revision",i.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:Permalink/${n}`),e.altKey),t.remove()}),t.appendChild(i);const a=document.createElement("div");a.classList.add("button"),a.innerText="Diff",a.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:Diff/${n}`),e.altKey),t.remove()}),t.appendChild(a)})}break;case"page-abuse":{const e=s.title,n=+s.id;this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Details",i.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:AbuseLog/${n}`),e.altKey),t.remove()}),t.appendChild(i);const a=document.createElement("div");a.classList.add("button"),a.innerText="Examine",a.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:AbuseFilter/examine/log/${n}`),e.altKey),t.remove()}),t.appendChild(a)})}break;case"log":{const e=s.title,n=JSON.parse(s.log);this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Log",i.addEventListener("click",s=>{const i=this.ws.page(`Special:Log/${encodeURIComponent(n.user)}?page=${encodeURIComponent(e)}&type=${n.type}&wptime=${n.timestamp}&limit=1`,!1,!1),a=this.ws.open(i,s.altKey);t.remove(),a.addEventListener("load",()=>{a.scroll({behavior:"smooth",top:a.document.body.scrollHeight})},{once:!0})}),t.appendChild(i)})}break;case"user":{const e=s.name;this.createTooltip(t,"buttons",null,null,null,t=>{const n=document.createElement("div");n.classList.add("button"),n.innerText="User talk",n.addEventListener("click",n=>{this.ws.open(this.ws.page(`User talk:${e}`),n.altKey),t.remove()}),t.appendChild(n);const s=document.createElement("div");s.classList.add("button"),s.innerText="User contribs",s.addEventListener("click",n=>{this.ws.open(this.ws.page(`Special:Contribs/${e}`),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="User page",i.addEventListener("click",n=>{this.ws.open(this.ws.page(`User:${e}`),n.altKey),t.remove()}),t.appendChild(i)})}break;case"email":this.createTooltip(t,"buttons",null,null,null,e=>{const t=document.createElement("div");t.classList.add("button"),t.innerText="Emergency",t.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Emergency"),t.altKey),e.remove()}),e.appendChild(t);const n=document.createElement("div");n.classList.add("button"),n.innerText="ArbCom",n.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Arbitration Committee"),t.altKey),e.remove()}),e.appendChild(n);const s=document.createElement("div");s.classList.add("button"),s.innerText="Oversight",s.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Oversight"),t.altKey),e.remove()}),e.appendChild(s)})}}catch(n){this.ws.open(t.getAttribute("href"),e.altKey)}finally{e.preventDefault()}else this.ws.open(t.getAttribute("href"),e.altKey);e.preventDefault()}}),document.querySelector("#loading").classList.add("hidden")}async start(){this.intervals.DEFCON=setInterval(this.updateDEFCON.bind(this),6e4),document.querySelector("#DEFCON").addEventListener("click",e=>{this.ws.open("https://en.wikipedia.org/w/index.php?tagfilter=mw-manual-revert%7Cmw-rollback%7Cmw-undo&title=Special%3ARecentChanges&urlversion=2",e.altKey)}),this.settings.start(),document.querySelector("#app").classList.remove("hidden"),document.querySelector("#initial").classList.add("hidden"),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const n=e.closest(".bottom-tool-item"),s=document.querySelector(`#${n.dataset.menu}-menu`),i=s.classList.contains("show");switch(n.dataset.menu){case"revert":s.innerHTML="",this.createWarnMenu("reverts",s,this.ws.queue.current.item);break;case"warn":s.innerHTML="",this.createWarnMenu("warnings",s,this.ws.queue.current.item);break;case"page":{var a;const e=this.ws.queue.current.item,t=!0===(null==e||null===(a=e.page)||void 0===a?void 0:a.watched);document.querySelector("#page-watch").classList.toggle("hidden",t),document.querySelector("#page-unwatch").classList.toggle("hidden",!t)}}this.closeMenus(),i||(s.classList.add("show"),e.classList.add("active"),this.positionBottomMenu(n,s))})}),document.querySelectorAll(".submenu-trigger").forEach(e=>{let t=(0,s.generateRandomUUID)();e.addEventListener("mouseenter",()=>{t=null;const n=e.closest(".bottom-tool-menu");n&&n.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show"));const s=e.querySelector(".submenu");s&&(this.events.submenu(s,s.dataset.eventName),s.classList.add("show"),this.positionSubmenu(s,e))}),e.addEventListener("mouseleave",()=>{const n=(0,s.generateRandomUUID)();t=n,setTimeout(()=>{if(t!==n)return;const s=e.querySelector(".submenu");s&&s.classList.remove("show")},500)})}),document.querySelectorAll(".menu-option:not(.submenu-trigger)").forEach(e=>{e.addEventListener("click",()=>this.closeMenus())}),document.querySelectorAll(".submenu").forEach(e=>{e.addEventListener("click",e=>e.stopPropagation())}),document.querySelectorAll("#queue-tabs > .queue-tab").forEach(e=>this.addTooltipListener(e));{const e=["alert","message"];e.forEach(e=>{const t=document.querySelector(`#${e}s-icon`);this.addTooltipListener(t),t.addEventListener("click",()=>{const t=document.querySelector(`#${e}s-panel`);t.classList.toggle("show"),t.classList.contains("show")&&this.ws.notifications.seen(e)}),document.querySelector(`#mark-all-${e}s-read`).addEventListener("click",t=>{this.ws.notifications.read(e)})}),document.addEventListener("click",t=>{for(const n of e){const e=document.querySelector(`#${n}s-panel`),s=document.querySelector(`#${n}s-icon`);null!=e&&e.contains(t.target)||null!=s&&s.contains(t.target)||null==e||e.classList.remove("show")}t.target.closest(".bottom-tool-menu")||t.target.closest(".confirmation-modal-overlay")||this.closeMenus()})}const e=document.querySelector("#latest-edits-tab");e.addEventListener("click",()=>this.updateDiffDisplay(this.ws.queue.current.item,!1)),this.addTooltipListener(e);const t=document.querySelector("#consecutive-edits-tab");t.addEventListener("click",()=>this.updateDiffDisplay(this.ws.queue.current.item,!0)),this.addTooltipListener(t),document.querySelector("#pending-changes-container > .accept").addEventListener("click",async e=>{await this.ws.gui.settings.waitForClose();const t=await this.dialog.input("Accept Pending Changes","Enter an optional edit summary for accepting this change:","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"next-item",params:{}},{name:"accept-pending-edit",params:{summary:t}}]})}),document.querySelector("#pending-changes-container > .reject").addEventListener("click",async e=>{await this.ws.gui.settings.waitForClose();const t=await this.dialog.input("Reject Pending Changes","Enter an optional edit summary for rejecting this change:","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"next-item",params:{}},{name:"reject-pending-edit",params:{summary:t}}]})}),document.querySelectorAll("#bottom-tools [data-tooltip]").forEach(e=>this.addTooltipListener(e));{const e=document.querySelector("#queue");{const t=this.ws.store.UI.queue.width;t&&(e.style.width=t,document.querySelector("#right-container").style.width=`calc(100% - ${t})`)}const t=document.querySelector("#right-details");{const e=this.ws.store.UI.details.width;e&&(t.style.width=e,document.querySelector("#main-container").style.width=`calc(100% - ${e})`)}const n={active:null,section:null,x:null,width:null,windowWidth:null},s=(e,t,s)=>{s.preventDefault(),n.active=e,n.section=t,n.x=s.clientX,n.width=t.getBoundingClientRect().width,n.windowWidth=innerWidth},i=document.querySelector("#queue-width-adjust");i.addEventListener("pointerdown",t=>s(i,e,t));const a=document.querySelector("#details-width-adjust");a.addEventListener("pointerdown",e=>s(a,t,e)),addEventListener("pointerup",()=>{n.active===i?this.ws.store.UI.queue.width=e.style.width:n.active===a&&(this.ws.store.UI.details.width=t.style.width),n.active=null,n.section=null}),addEventListener("pointermove",e=>{if(!n.active)return;const t=e.clientX-n.x;let s;n.active===i?s=n.width+t:n.active===a&&(s=n.width-t);const r=.1*n.windowWidth,o=.3*n.windowWidth;s=Math.max(r,Math.min(o,s));const l=s/n.windowWidth*100;n.section.style.width=`${l}vw`,n.active===i?document.querySelector("#right-container").style.width=`calc(100% - ${l}vw)`:n.active===a&&(document.querySelector("#main-container").style.width=`calc(100% - ${l}vw)`)})}const n=a.WikiShield.config.changelog.version;var i,r;(n.endsWith("!")||n!==this.ws.store.changelog)&&(this.ws.store.changelog=n.replace(/!$/,""),null===(i=(r=electron).open)||void 0===i||i.call(r,"changelog"));this.addTooltipListener(document.querySelector("#settings-icon")),document.querySelectorAll("#queue-top-right > span").forEach(e=>this.addTooltipListener(e)),this.updateZenMode(),this.reorderQueues(),this.newCurrentItem(null),document.querySelector("#settings-icon").addEventListener("click",()=>{this.settings.open()}),this.events.button(document.querySelector("#clear-queue"),"clear-queue"),this.events.button(document.querySelector("#previous-item-button"),"previous-item"),this.events.button(document.querySelector("#next-item-button"),"next-item"),this.events.button(document.querySelector("#user-open-user-page"),"open-user-page"),this.events.button(document.querySelector("#user-open-user-talk"),"open-user-talk"),this.events.button(document.querySelector("#user-view-contribs"),"open-user-contributions"),this.events.button(document.querySelector("#user-view-filter-log"),"open-filter-log"),this.events.button(document.querySelector("#user-whitelist"),"whitelist-user"),this.events.button(document.querySelector("#user-unwhitelist"),"unwhitelist-user"),this.events.button(document.querySelector("#user-highlight"),"highlight-user"),this.events.button(document.querySelector("#user-unhighlight"),"unhighlight-user"),this.events.submenu(document.querySelector("#user-welcome .submenu"),"welcome-user"),this.events.submenu(document.querySelector("#user-report-aiv .submenu"),"report-user-to-aiv"),this.events.submenu(document.querySelector("#user-report-uaa .submenu"),"report-user-to-uaa"),this.events.submenu(document.querySelector("#user-request-global-block .submenu"),"request-global-block"),this.events.submenu(document.querySelector("#user-request-global-lock .submenu"),"request-global-lock"),this.events.submenu(document.querySelector("#user-new-talk-topic .submenu"),"send-message-to-user-talk"),this.events.button(document.querySelector("#page-open-page"),"open-page"),this.events.button(document.querySelector("#page-open-talk"),"open-page-talk"),this.events.button(document.querySelector("#page-watch"),"watch-page"),this.events.button(document.querySelector("#page-unwatch"),"unwatch-page"),this.events.button(document.querySelector("#page-whitelist"),"whitelist-page"),this.events.button(document.querySelector("#page-unwhitelist"),"unwhitelist-page"),this.events.button(document.querySelector("#page-highlight"),"highlight-page"),this.events.button(document.querySelector("#page-unhighlight"),"unhighlight-page"),this.events.submenu(document.querySelector("#page-request-protection .submenu"),"request-page-protection"),this.events.button(document.querySelector("#page-view-history"),"open-page-history"),this.events.submenu(document.querySelector("#page-new-talk-topic .submenu"),"send-message-to-page-talk"),this.events.button(document.querySelector("#edit-view-revision"),"open-revision"),this.events.button(document.querySelector("#edit-view-diff"),"open-diff"),this.events.button(document.querySelector("#edit-thank-user"),"thank-user"),this.events.submenu(document.querySelector("#edit-rollback .submenu"),"rollback-edit"),this.events.submenu(document.querySelector("#edit-rollback-goodfaith .submenu"),"rollback-goodfaith-edit"),this.events.submenu(document.querySelector("#edit-undo .submenu"),"undo-edit"),this.events.button(document.querySelector("#copy-link"),"copy-link"),this.events.button(document.querySelector("#refresh-user-contributions"),"refresh-user-contributions"),this.events.button(document.querySelector("#user-contributions > .footer"),"open-user-contributions"),this.events.button(document.querySelector("#refresh-page-history"),"refresh-page-history"),this.events.button(document.querySelector("#page-history > .footer"),"open-page-history"),c.Queue.types.forEach(e=>{this.events.button(document.querySelector(`#queue-tab-${e}`),`switch-to-${e}-queue`)}),this.animation(),this.update(),this.renderQueue(),electron.menuEnabler({browser:!0,settings:{preferences:!0},help:{changelog:!0}})}animation(){try{(0,g.AutoScroll)()}catch(e){console.error("Error in animation loop:",e)}requestAnimationFrame(()=>this.animation())}update(){try{const e=new Date;document.querySelectorAll("[data-time]").forEach(t=>{const n=new Date(t.dataset.time);switch(t.dataset.timeFormat){case"notification":t.textContent=this.ws.util.formatNotificationTime(n,"timeNow"in t.dataset?new Date(t.dataset.timeNow):e)+(t.dataset.timePostfix||"");break;case"duration":t.textContent=this.ws.util.formatDuration(n,"timeNow"in t.dataset?new Date(t.dataset.timeNow):e)+(t.dataset.timePostfix||"")}})}catch(e){console.error("Error updating time elements:",e)}setTimeout(()=>this.update(),1e3)}async updateDEFCON(){var e;const t=await this.ws.getDEFCON(),n=document.querySelector("#DEFCON");n.title=`DEFCON-${null!==t.level?t.level:"N/A"} (${t.info?`${t.info} revert${1===+t.info?"":"s"} per minute`:"No data"})`;const s=n.querySelector(".dot");s.className="dot",null!==t.level&&s.classList.add(`DEFCON-${t.level}`),document.querySelector(".DEFCON-RPM").textContent=null!==(e=t.info)&&void 0!==e?e:"N/A"}generateItemHTML(e,t=!1){const n=this.getORESColor(e.ores),s="sizediff"in e?this.ws.util.getChangeColor(e.sizediff):void 0,a=(0,i.CreateDOMElement)("div");{const t=(0,i.CreateDOMElement)("div",{class:"item-color",style:{"--ores-color":n},dataset:{ores:e.ores}});a.appendChild(t)}{var r,o,l;const t=(0,i.CreateDOMElement)("div",{class:"item-body",style:{"--ores-color":n,"--diff-color":s},datset:{ores:e.ores}});a.appendChild(t);{const n=(0,i.CreateDOMElement)("div",{class:"header"});t.appendChild(n);{const t=this.ws.store.highlight.pages.has(e.page.title),s=(0,i.CreateDOMElement)("span",{class:"page-title"+(t?" highlighted":""),content:e.page.title,dataset:t?{tooltip:"Page is highlighted",tooltipDelay:500}:{}});this.addTooltipListener(s),n.appendChild(s);const a=(0,i.CreateDOMElement)("i",{class:"fas fa-file-lines"});s.prepend(a)}{const t=(0,i.CreateDOMElement)("span",{class:"timestamp"});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-clock",style:{"font-size":"11px"}});t.appendChild(s);const a=(0,i.CreateDOMElement)("span",{content:this.ws.util.formatNotificationTime(new Date(e.timestamp)),dataset:{tooltip:new Date(e.timestamp).toLocaleString(),tooltipDelay:500,time:e.timestamp,timeFormat:"notification"}});this.addTooltipListener(a),t.appendChild(a)}}{var d;const n=(0,i.CreateDOMElement)("div",{class:"meta"});t.appendChild(n);const s=null!==(d=e.performer)&&void 0!==d?d:e.user;{const t=s.blocked,a=this.ws.util.expiryToDate(null==t?void 0:t.expiry),r=this.ws.store.highlight.users.has(s.name),o=void 0===s.talk,l=(0,i.CreateDOMElement)("span",{class:"user-chip"+(!1===(null==t?void 0:t.partial)?" blocked":"")+(r?" highlighted":"")+(o?" empty-talk":""),content:e.user.name,dataset:!1===(null==t?void 0:t.partial)?{tooltip:`Blocked ${a===1/0?"indefinitely":`until ${a.toLocaleString()}`} (${t.reason})`,tooltipDelay:500}:r?{tooltip:"User is highlighted",tooltipDelay:500}:o?{tooltip:"User has an empty talk page",tooltipDelay:500}:{}});this.addTooltipListener(l),n.appendChild(l);const d=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(s.anon?"user-secret":"user"),style:{"font-size":"11px"}});l.prepend(d)}{const t=(0,i.CreateDOMElement)("div",{class:"chips"});if(n.appendChild(t),"abuselog"===e.type){const n=["disallow","warn","showcaptcha","tag","none"],s=n.length;let a=s-1;for(let t=0;t<s;t++)if(e.origin.result.has(n[t])){a=t;break}const r=(0,i.CreateDOMElement)("span",{class:"ores-chip",dataset:{tooltip:`Action taken: ${n[a]}`,tooltipDelay:500}});this.addTooltipListener(r),t.appendChild(r);const o=(0,i.CreateDOMElement)("i",{class:`fas fa-${["ban","exclamation-triangle","robot","tag","check"][a]}`,style:{"font-size":"11px"}});r.prepend(o)}else{const n=(0,i.CreateDOMElement)("span",{class:"ores-chip",content:Number.isNaN(e.ores)?"-":Math.round(100*e.ores),dataset:{tooltip:"Score",tooltipDelay:500}});this.addTooltipListener(n),t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-fire",style:{"font-size":"11px"}});n.prepend(s)}{const n=(0,i.CreateDOMElement)("div",{class:"diff-chips"});if(t.appendChild(n),e.minor){const e=(0,i.CreateDOMElement)("span",{class:"minor-chip",dataset:{tooltip:"Minor edit",tooltipDelay:500}});this.addTooltipListener(e),n.appendChild(e);const t=(0,i.CreateDOMElement)("i",{class:"fas fa-m",style:{"font-size":"11px"}});e.appendChild(t)}if("sizediff"in e){const t=(0,i.CreateDOMElement)("span",{class:"diff-chip",content:Math.abs(e.sizediff).toLocaleString(),dataset:{tooltip:"Size difference",tooltipDelay:500}});if(this.addTooltipListener(t),n.appendChild(t),0!==e.sizediff){const n=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.sizediff>0?"plus":"minus"),style:{"font-size":"11px"}});t.prepend(n)}}}}}if(e.has_comment){const n=(0,i.CreateDOMElement)("div",{class:"item-comment"});t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"11px"}});n.appendChild(s);const a=(0,i.CreateDOMElement)("span",{class:"text",html:e.comment,dataset:{tooltip:e.comment,tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(a),n.appendChild(a)}const c=null!==(r=null!==(o=e.tags)&&void 0!==o?o:null===(l=e.filters)||void 0===l?void 0:l.map(e=>`${e.filter} (${"-1"===e.id?"private":e.id})`))&&void 0!==r?r:[];if(c.length>0){const e=(0,i.CreateDOMElement)("div",{class:"item-tags"});t.appendChild(e),c.forEach(t=>{const n=(0,i.CreateDOMElement)("span",{class:"tag",content:t});e.appendChild(n)})}}if(t){const e=(0,i.CreateDOMElement)("div",{class:"remove-button"});a.appendChild(e);const t=(0,i.CreateDOMElement)("i",{class:"fas fa-xmark"});e.appendChild(t)}return a.innerHTML}generateEditDetails(e,t=!1){if(!e)return void(document.querySelector("#edit-details").innerHTML="<div class='central'>Nothing selected</div>");const n="edit"===c.Queue.groups[e.type]?this.ws.queue.pending.get(e.id):null,s=document.querySelector("#edit-details");s.style.setProperty("--diff-color","sizediff"in e?this.ws.util.getChangeColor(e.sizediff):void 0),s.innerHTML="";{const t=(0,i.CreateDOMElement)("div",{class:"header"});s.appendChild(t);{const n=this.ws.store.highlight.pages.has(e.page.title),s=(0,i.CreateDOMElement)("span",{class:"page-title"+(n?" highlighted":""),dataset:n?{tooltip:"Page is highlighted",tooltipDelay:500}:{}});this.addTooltipListener(s),t.appendChild(s);const a=(0,i.CreateDOMElement)("i",{class:"fas fa-file-lines"});let r;switch(s.appendChild(a),c.Queue.groups[e.type]){case"edit":r="page";break;case"logevent":r="log";break;case"abuselog":r="page-abuse"}const o=(0,i.CreateDOMElement)("a",{content:e.page.title,dataset:{multipleHrefs:`${r};title=${encodeURIComponent(e.page.title)}&${"log"===r?`log=${JSON.stringify(e)}`:`id=${e.id}`}`,tooltip:e.page.title,tooltipDelay:500},attributes:{href:null}});this.addTooltipListener(o),s.appendChild(o)}{var a;const s=(0,i.CreateDOMElement)("div",{class:"meta"});t.appendChild(s);const l=null!==(a=e.performer)&&void 0!==a?a:e.user;{var o;const e=Object.keys(null!==(o=null==n?void 0:n.users)&&void 0!==o?o:{}).filter(e=>e!==l.name),t=l.blocked,a=this.ws.util.expiryToDate(null==t?void 0:t.expiry),d=this.ws.store.highlight.users.has(l.name),c=void 0===l.talk,u=(0,i.CreateDOMElement)("span",{class:"user-chip"+(!1===(null==t?void 0:t.partial)?" blocked":"")+(d?" highlighted":"")+(c?" empty-talk":""),dataset:!1===(null==t?void 0:t.partial)?{tooltip:`Blocked ${a===1/0?"indefinitely":`until ${a.toLocaleString()}`} (${t.reason})`,tooltipDelay:500}:d?{tooltip:"User is highlighted",tooltipDelay:500}:c?{tooltip:"User has an empty talk page",tooltipDelay:500}:{}});this.addTooltipListener(u),s.appendChild(u);const p=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.length>0?"users":l.anon?"user-secret":"user")});u.appendChild(p);const g=(0,i.CreateDOMElement)("a",{content:l.name,dataset:{multipleHrefs:`user;name=${encodeURIComponent(l.name)}`,tooltip:l.name,tooltipDelay:500},attributes:{href:null}});if(this.addTooltipListener(g),u.appendChild(g),e.length>0){const t=(0,i.CreateDOMElement)("span",{class:"other-users",content:` and ${e.length} ${r.Text.pluralize("other",e.length)}`,dataset:{tooltip:e.join(", "),tooltipDelay:500}});this.addTooltipListener(t),u.appendChild(t)}}}}{var l;const a=(0,i.CreateDOMElement)("div",{class:"subheader"});if(s.appendChild(a),(null==n?void 0:n.count)>1||t&&(null===(l=e.consecutive)||void 0===l?void 0:l.count)>1){const t=(0,i.CreateDOMElement)("div",{class:"item-comment"});a.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comments",style:{"font-size":"11px"}});t.appendChild(s);const o=null!=n?n:e.consecutive,l=(0,i.CreateDOMElement)("span",{class:"text",content:`${o.count} ${r.Text.pluralize("edit",o.count)} over the course of `,dataset:{tooltip:o.edits.map(e=>{const t=(0,i.CreateDOMElement)("div",{style:{display:"flex","flex-direction":"column",gap:"6px"}});{const n=(0,i.CreateDOMElement)("div",{style:{display:"flex","align-items":"center",gap:"6px",width:"100%","justify-content":"space-between","font-size":"13px"}});t.appendChild(n);{const t=(0,i.CreateDOMElement)("span",{style:{display:"flex","align-items":"center",gap:"4px","font-weight":"500"},content:e.user});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.anon?"user-secret":"user"),style:{"font-size":"11px",opacity:"0.7"}});t.prepend(s)}{const t=(0,i.CreateDOMElement)("span",{style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",opacity:"0.75"},content:this.ws.util.formatNotificationTime(new Date(e.timestamp)),dataset:{time:e.timestamp,timeFormat:"notification"}});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-clock",style:{"font-size":"10px",opacity:"0.7"}});t.prepend(s)}}{const n=(0,i.CreateDOMElement)("div",{style:{display:"flex","align-items":"flex-start",gap:"4px","font-size":"12px",opacity:"0.85",padding:"2px 0"},content:e.comment||"No edit summary"});t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"10px",opacity:"0.7","flex-shrink":"0","margin-top":"2px"}});n.prepend(s)}return t.outerHTML}).join("<br>"),tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(l),t.appendChild(l);const d=(0,i.CreateDOMElement)("span",{class:"time",content:this.ws.util.formatDuration(new Date(o.timestamp.old),new Date(o.timestamp.new)),dataset:{tooltip:`${new Date(o.timestamp.old).toLocaleString()}&mdash;${new Date(o.timestamp.new).toLocaleString()}`,tooltipHtml:!0,tooltipDelay:500,time:o.timestamp.old,timeNow:o.timestamp.new,timeFormat:"duration"}});this.addTooltipListener(d),t.appendChild(d)}else if(e.has_comment){const t=(0,i.CreateDOMElement)("div",{class:"item-comment"});a.appendChild(t);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"11px"}});t.appendChild(n);const s=(0,i.CreateDOMElement)("span",{class:"text",html:e.comment,dataset:{tooltip:e.comment,tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(s),t.appendChild(s)}else{const e=(0,i.CreateDOMElement)("div",{class:"item-comment none",content:"No edit summary"});a.appendChild(e)}{const t=(0,i.CreateDOMElement)("div",{class:"meta"});if(a.appendChild(t),e.minor){const e=(0,i.CreateDOMElement)("span",{class:"minor-chip",dataset:{tooltip:"Minor edit",tooltipDelay:500}});this.addTooltipListener(e),t.appendChild(e);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-m",style:{"font-size":"11px"}});e.appendChild(n)}if("sizediff"in e){const n=(0,i.CreateDOMElement)("span",{class:"diff-chip",content:Math.abs(e.sizediff).toLocaleString(),dataset:{tooltip:"Size difference",tooltipDelay:500}});if(this.addTooltipListener(n),t.appendChild(n),0!==e.sizediff){const t=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.sizediff>0?"plus":"minus"),style:{"font-size":"11px"}});n.prepend(t)}}}}}renderQueue(e=null,t=null,n=null){var s,a,r;if(document.querySelector("#previous-item-button").classList.toggle("disabled",!this.ws.queue.canGoPrevious()),document.querySelector("#next-item-button").classList.toggle("disabled",!this.ws.queue.canGoNext()),null!=e||(e=this.ws.queue.current.queue),null!=t||(t=this.ws.queue.current.item),null!=n||(n=this.ws.queue.current.type),this.updateQueueTabs(),n!==this.ws.queue.current.type)return;const o=document.querySelector("#queue-items");if(0===e.length){var l,d;const e=document.createElement("div");return e.classList.add("queue-empty"),e.textContent="No items in queue",o.innerHTML=e.outerHTML,void((null===(l=this.ws.queue.queues[n].previous)||void 0===l?void 0:l.id)!==(null===(d=t)||void 0===d?void 0:d.id)&&(this.ws.queue.queues[n].previous=t,this.newCurrentItem(t)))}o.querySelectorAll(".queue-empty").forEach(e=>e.remove());const c=new Map;for(const e of o.children)c.set(+e.dataset.id,e);let u=null;for(const s of e){var p;let i=c.get(s.id);var g;if(!i)i=document.createElement("div"),i.classList.add("queue-item"),i.dataset.id=s.id,i.dataset.type=n,i.innerHTML=this.generateItemHTML(s,"pending"!==n),null===(g=i.querySelector(".remove-button"))||void 0===g||g.addEventListener("click",i=>{i.stopPropagation();const a=e.findIndex(e=>e.id===s.id);var r;a>=0&&(s.id===(null===(r=t)||void 0===r?void 0:r.id)?this.ws.queue.next():(e.splice(a,1),this.ws.queue.queues[n].history.push({...s,history:performance.now()}),this.removeQueueItem(n,s.id),this.renderQueue()))}),s.mentions.has&&this.ws.store.settings.username_highlighting.enabled&&(i.classList.add("mentions-me"),i.dataset.tooltip="This queue item contains your username",this.addTooltipListener(i)),i.addEventListener("click",()=>{this.ws.queue.queues[n].item=s,this.ws.current=this.ws.queue.queues[n],this.renderQueue()}),o.appendChild(i),c.set(s.id,i),i.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e));null===u?i!==o.firstChild&&o.insertBefore(i,o.firstChild):i.previousSibling!==u&&o.insertBefore(i,u.nextSibling),i.classList.toggle("current",s.id===(null===(p=t)||void 0===p?void 0:p.id)),u=i}for(const[t,n]of c.entries())e.some(e=>e.id===t)||n.remove();let h=null;for(const t of e){if(!1===t.history)break;h=t}if(null===(s=o.querySelector(".historical-bar"))||void 0===s||s.remove(),null!==h){const e=(0,i.CreateDOMElement)("div",{class:"historical-bar"});o.insertBefore(e,c.get(h.id).nextSibling);const t=(0,i.CreateDOMElement)("span",{class:"label"});e.appendChild(t);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-box-archive",attributes:{title:"All items above this line have been viewed"}});t.appendChild(n)}(null===(a=this.ws.queue.queues[n].previous)||void 0===a?void 0:a.id)!==(null===(r=t)||void 0===r?void 0:r.id)&&(this.ws.queue.queues[n].previous=t,this.newCurrentItem(t))}removeQueueItem(e,t){const n=document.querySelector(`.queue-item[data-type="${e}"][data-id="${t}"]`);n&&(n.remove(),this.updateQueueTabs([e]))}clearQueueItems(){document.querySelector("#queue-items").innerHTML="",this.renderQueue()}updateHiddenItems(e){if(void 0===e&&(e=this.ws.queue.current.item),null===e)return this.ws.store.UI.hide_tools,document.querySelectorAll("[data-queue-type]").forEach(e=>e.classList.add("hidden"));let t=e.type;"abuselog"===t&&e.revid&&(t="edit");const n=c.Queue.groups[t];document.querySelectorAll("[data-queue-type]").forEach(e=>{const t=e.dataset.queueType||"*";"*"===t?e.classList.remove("hidden"):e.classList.toggle("hidden",!t.split(",").includes(n))})}async newCurrentItem(e=null,t=!1){var n,s;null===(n=this.controllers.current)||void 0===n||n.abort();const a=new AbortController;this.controllers.current=a,null!==e&&(this.updateDiffDisplay("loading"),await this.ws.queue.propagate(e,!0)),this.stopOutdatedCheck(),this.toggleEditWarNotice((null==e?void 0:e.reverts)>=3,(null==e?void 0:e.reverts)||0),this.toggleOutdatedNotice(!1),this.togglePendingNotice(!1),this.closeMenus(),this.removeTooltips(),document.querySelectorAll("#right-top > div > :not(.hidden)").forEach(e=>e.classList.add("hidden"));const r=document.querySelector("#user-contributions > .queue-list");r.innerHTML="";const o=document.querySelector("#page-history > .queue-list");if(o.innerHTML="",document.querySelector("#user-contributions > .header > .pills").innerHTML="",document.querySelector("#page-history > .header > .pills").innerHTML="",document.querySelector("#pending-changes-container").classList.toggle("hidden",!(this.ws.rights.review&&this.ws.queue.pending.has(null==e?void 0:e.id))),this.updateHiddenItems(e),null===e)return this.generateEditDetails(),document.querySelector("#diff-container").innerHTML="",document.querySelector("#diff-scroll-up").classList.add("hidden"),document.querySelector("#diff-scroll-down").classList.add("hidden"),document.querySelector("#ai-analysis-container").classList.add("hidden"),void([...document.querySelectorAll("#queue-tabs > .queue-tab")].every(e=>"none"===getComputedStyle(e).display)&&(document.querySelector("#diff-container").innerHTML='\n\t\t\t\t\t<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: grey;">\n\t\t\t\t\t\t<div style="font-size: 48px; margin-bottom: 16px;">\n\t\t\t\t\t\t\t<i class="fas fa-shield-alt"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 24px; margin-bottom: 8px; text-align: center;">\n\t\t\t\t\t\t\tNo queues are enabled\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 14px; text-align: center; max-width: 100%; margin-top: 10px;">\n\t\t\t\t\t\t\tI heard there was a WikiShield,<br>\n\t\t\t\t\t\t\tWhich entered an oversaturated field,<br>\n\t\t\t\t\t\t\tBut you don&rsquo;t ever use Huggle, do you?<br>\n\t\t\t\t\t\t\tWell it simplifies any AIV,<br>\n\t\t\t\t\t\t\tBut superintendence matters to me\n\t\t\t\t\t\t\t<span style="display: block; margin-top: 8px;">&mdash; User:WikiMacaroons</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t'));const l=e.type,d=c.Queue.groups[l];if(!t&&"abuselog"===l&&!e.revid){const t=async()=>{a.signal.aborted||this.ws.api.getAbuseLogRevid(e.id).then(n=>{var s,i;n&&(e.revid=n,e.id===(null===(i=this.ws.queue.current.item)||void 0===i?void 0:i.id)&&this.newCurrentItem(this.ws.queue.current.item,!0));e.id===(null===(s=this.ws.queue.current.item)||void 0===s?void 0:s.id)&&setTimeout(()=>t(),1e3)})};t()}const u=null==e||null===(s=e.page)||void 0===s?void 0:s.watched;if(document.querySelector("#page-watch").classList.toggle("hidden",!0===u),document.querySelector("#page-unwatch").classList.toggle("hidden",!0!==u),document.querySelector("#user-report-uaa").classList.toggle("hidden",null==e?void 0:e.user.anon),document.querySelector("#user-request-global-lock").classList.toggle("hidden",null==e?void 0:e.user.anon),this.ws.AI){const t=this.ws.store;null===e.AI.edit&&t.settings.AI.edit_analysis.enabled&&this.ws.AI.analyze.edit(e).then(t=>{e.AI.edit=t}).catch(t=>{e.AI.edit={error:t.message}}).finally(()=>{var t;e.id===(null===(t=this.ws.queue.current.item)||void 0===t?void 0:t.id)&&this.updateAIAnalysisDisplay(e.AI.edit)}),null!==e.AI.username||e.user.anon||t.whitelist.users.has(e.user)||!t.settings.AI.username_analysis.enabled||this.ws.AI.analyze.username(e).then(t=>{e.AI.username=t,t.flag&&this.ws.queue.promptUAA(e,t)}).catch(t=>{e.AI.username={error:t.message}})}if(this.updateAIAnalysisDisplay(e.AI.edit),!e.seen)switch(e.seen=!0,this.ws.store.statistics.edits_reviewed.total++,this.ws.queue.current.type){case"recent":this.ws.store.statistics.recent_changes_reviewed.total++;break;case"pending":this.ws.store.statistics.pending_changes_reviewed.total++;break;case"watchlist":this.ws.store.statistics.watchlist_changes_reviewed.total++;break;case"users":this.ws.store.statistics.users_reviewed.total++}{const t=(0,i.CreateDOMElement)("div",{class:"pill",content:`${e.user.edits.toLocaleString()} edit${1===e.user.edits?"":"s"}`});document.querySelector("#user-contributions > .header > .pills").appendChild(t)}if("0"!==e.user.warning){const t=(0,i.CreateDOMElement)("div",{class:`pill uw-${e.user.warning}`});document.querySelector("#user-contributions > .header > .pills").appendChild(t),t.textContent=`uw-${e.user.warning}`;const n=e.user.warnings;if(n.length>0){const s=document.createElement("div"),i=document.createElement("div");i.classList.add("tooltip-title"),i.textContent=`Warnings for ${e.user.name}`,s.appendChild(i);for(const e of n){const t=document.createElement("div");t.classList.add("tooltip-item","user-warnings"),s.appendChild(t);const n=document.createElement("span");n.classList.add("tooltip-item-level"),n.textContent=`${e.template}${e.level}`,t.appendChild(n);const i=document.createElement("div");i.classList.add("tooltip-item-details"),t.appendChild(i);const a=document.createElement("span");a.classList.add("tooltip-item-user"),a.textContent=e.username?`by User:${e.username}`:"by Unknown",i.appendChild(a),i.appendChild(document.createElement("br"));const r=document.createElement("span");r.classList.add("tooltip-item-date"),i.appendChild(r),e.timestamp?(r.dataset.time=e.timestamp,r.dataset.timeFormat="notification",r.textContent=this.ws.util.formatNotificationTime(new Date(e.timestamp))):r.textContent="Date unknown"}t.dataset.tooltip=s.innerHTML,t.dataset.tooltipHtml=!0}this.addTooltipListener(t)}const p=e.user.blocks;if(p.length>0){const t=(0,i.CreateDOMElement)("div",{class:"pill ub"});document.querySelector("#user-contributions > .header > .pills").appendChild(t);const n=document.createElement("div"),s=document.createElement("div");s.classList.add("tooltip-title"),s.textContent=`Blocks for ${e.user.name}`,n.appendChild(s);for(const e of p){var g;const t=document.createElement("div");t.classList.add("tooltip-item","user-blocks"),n.appendChild(t);const s=document.createElement("span");s.classList.add("tooltip-item-level"),s.innerHTML=e.parsedcomment||"No reason provided",t.appendChild(s);const i=document.createElement("div");i.classList.add("tooltip-item-details"),t.appendChild(i);const a=document.createElement("span");a.classList.add("tooltip-item-user"),a.textContent=e.user?`by User:${e.user}`:"by Unknown",i.appendChild(a),i.appendChild(document.createElement("br"));const r=document.createElement("span");r.classList.add("tooltip-item-time"),i.appendChild(r);const o=document.createElement("span");e.timestamp?(o.dataset.time=e.timestamp,o.dataset.timeFormat="notification",o.textContent=this.ws.util.formatNotificationTime(new Date(e.timestamp))):o.textContent="Date unknown",r.appendChild(o);const l=document.createElement("span");l.textContent=`(for ${(null===(g=e.params)||void 0===g?void 0:g.duration)||"an unknown duration"})`,r.appendChild(l)}t.classList.remove("hidden"),t.textContent=`${p.length} block${1===p.length?"":"s"}`,t.dataset.tooltip=n.innerHTML,t.dataset.tooltipHtml=!0,this.addTooltipListener(t)}{const t=document.querySelector("#user-whitelist"),n=document.querySelector("#user-unwhitelist");if(t&&n){const s=()=>{const s=this.ws.store.whitelist.users.has(e.user.name);t.classList.toggle("hidden",s),n.classList.toggle("hidden",!s)};t.onclick=s,n.onclick=s,s()}const s=document.querySelector("#user-highlight"),i=document.querySelector("#user-unhighlight");if(s&&i){const t=()=>{const t=this.ws.store.highlight.users.has(e.user.name);s.classList.toggle("hidden",t),i.classList.toggle("hidden",!t)};s.onclick=t,i.onclick=t,t()}}{const t=document.querySelector("#page-whitelist"),n=document.querySelector("#page-unwhitelist");if(t&&n){const s=()=>{const s=this.ws.store.whitelist.pages.has(e.page.title);t.classList.toggle("hidden",s),n.classList.toggle("hidden",!s)};t.onclick=s,n.onclick=s,s()}const s=document.querySelector("#page-highlight"),i=document.querySelector("#page-unhighlight");if(s&&i){const t=()=>{const t=this.ws.store.highlight.pages.has(e.page.title);s.classList.toggle("hidden",t),i.classList.toggle("hidden",!t)};s.onclick=t,i.onclick=t,t()}}(async t=>{const n=e.user.contributions;for(const e of n){var s;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(s=this.ws.queue.current.item.revid)&&void 0!==s?s:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML({page:{title:e.title},user:{name:e.user},comment:"Loading...",timestamp:e.timestamp,sizediff:0,ores:NaN,tags:e.tags||[],type:"edit"}),r.appendChild(t),requestAnimationFrame(()=>t.classList.remove("no-transition"))}if(e.page.cached_contributions){const s=await e.page.cached_contributions;if(t.aborted)return;n.some((e,t)=>{var n;return e.id!==(null===(n=s[t])||void 0===n?void 0:n.id)})&&delete e.page.cached_contributions}e.user.cached_contributions||(e.user.cached_contributions=this.ws.queue.generate("edit",n,!0));const i=await e.user.cached_contributions;if(!t.aborted){r.innerHTML="";for(const e of i.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp))){var a;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(a=this.ws.queue.current.item.revid)&&void 0!==a?a:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML(e),r.appendChild(t),t.addEventListener("mouseover",()=>this.ws.queue.propagate(e,!0)),t.addEventListener("click",()=>this.ws.queue.loadFromItem(e)),t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e)),requestAnimationFrame(()=>t.classList.remove("no-transition"))}}})(a.signal).catch(e=>{a.signal.aborted||console.error("Error loading contributions:",e)});switch(d){case"edit":{var h;if(this.startOutdatedCheck(e),!this.ws.queue.pending.has(e.id))(null===(h=e.consecutive)||void 0===h?void 0:h.count)>=2&&(document.querySelector("#latest-edits-tab").classList.remove("hidden"),document.querySelector("#consecutive-edits-tab").classList.remove("hidden"));const t=e.page.protection;if(t.protected||this.ws.queue.pending.has(e.id)){const n=(0,i.CreateDOMElement)("div",{class:"pill"});if(document.querySelector("#page-history > .header > .pills").appendChild(n),t.protected){let e,s;switch(t.level){case"sysop":e="F",s="Requires sysop right to edit";break;case"template":e="T",s="Requires template editor to edit";break;case"extendedconfirmed":e="EC",s="Requires extended confirmed right to edit";break;case"autoconfirmed":e="AC",s="Requires autoconfirmed right to edit";break;default:e="?",s="Uknown protection level"}n.innerHTML=`<i class="fas fa-lock"></i> <span class="protection-icon" data-tooltip="${s}">${e}</span>`,this.addTooltipListener(n.querySelector("[data-tooltip]"))}else if(this.ws.queue.pending.has(e.id)){var m;const t=(null===(m=this.ws.queue.pending.get(e.id).pending.stability)||void 0===m?void 0:m.parsedcomment)||"No comment provided",s=document.createElement("span");s.classList.add("protection-icon"),s.innerHTML="<i class='fas fa-lock'></i> PC",s.dataset.tooltip=t,s.dataset.tooltipHtml=!0,n.appendChild(s),this.addTooltipListener(n.querySelector("[data-tooltip]"))}}for(const t of e.page.metadata){const e=(0,i.CreateDOMElement)("div",{class:"pill",content:t});document.querySelector("#page-history > .header > .pills").appendChild(e)}}break;case"logevent":break;case"abuselog":{e.revid&&this.startOutdatedCheck(e);const t=document.querySelector("#protection-indicator");if(t){const n=e.page.protection;if(n.protected){let e,s;switch(n.level){case"sysop":e="P",s="Requires sysop right to edit";break;case"extendedconfirmed":e="X",s="Requires extended confirmed right to edit";break;case"autoconfirmed":e="A",s="Requires autoconfirmed right to edit";break;default:e="?",s="Uknown protection level"}t.innerHTML=`<span class="protection-icon" data-tooltip="${s}">${e}</span>`,this.addTooltipListener(t.querySelector("[data-tooltip]"))}else if(this.ws.queue.pending.has(e.id)){var v;const n=(null===(v=this.ws.queue.pending.get(e.id).pending.stability)||void 0===v?void 0:v.parsedcomment)||"No comment provided",s=document.createElement("span");s.classList.add("protection-icon"),s.textContent="PC",s.dataset.tooltip=n,s.dataset.tooltipHtml=!0,t.appendChild(s),this.addTooltipListener(t.querySelector("[data-tooltip]"))}else t.innerHTML=""}}}if("edit"===d||"abuselog"===d){(async t=>{const n=e.page.history;for(const e of n){var s;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(s=this.ws.queue.current.item.revid)&&void 0!==s?s:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML({page:{title:e.title},user:{name:e.user},comment:"Loading...",timestamp:e.timestamp,sizediff:0,ores:NaN,tags:e.tags||[],type:"edit"}),o.appendChild(t),requestAnimationFrame(()=>t.classList.remove("no-transition"))}if(e.page.cached_history){const s=await e.page.cached_history;if(t.aborted)return;n.some((e,t)=>{var n;return e.id!==(null===(n=s[t])||void 0===n?void 0:n.id)})&&delete e.page.cached_history}e.page.cached_history||(e.page.cached_history=this.ws.queue.generate("edit",n,!0));const i=await e.page.cached_history;if(!t.aborted){o.innerHTML="";for(const e of i.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp))){var a;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(a=this.ws.queue.current.item.revid)&&void 0!==a?a:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML(e),o.appendChild(t),t.addEventListener("mouseover",()=>this.ws.queue.propagate(e,!0)),t.addEventListener("click",()=>this.ws.queue.loadFromItem(e)),t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e)),requestAnimationFrame(()=>t.classList.remove("no-transition"))}}})(a.signal).catch(e=>{a.signal.aborted||console.error("Error loading history:",e)})}this.updateDiffDisplay(e,!1)}updateDiffDisplay(e,t){var n;const s=document.querySelector("#diff-container");if(!e)return document.querySelector("#diff-scroll-up").classList.add("hidden"),void document.querySelector("#diff-scroll-down").classList.add("hidden");if("loading"===e){const e=document.createElement("div");e.className="loading-container";const t=document.createElement("div");t.className="loading-spinner",e.appendChild(t);const n=document.createElement("i");n.className="fas fa-spinner fa-spin",t.appendChild(n);const i=document.createElement("div");return i.className="loading-text animate-loading-dots",i.textContent="Loading edit",e.appendChild(i),void(s.innerHTML=e.outerHTML)}switch(document.querySelectorAll("#right-top > .tabs > .tab.selected").forEach(e=>e.classList.remove("selected")),this.generateEditDetails(e,t),c.Queue.groups[e.type]){case"edit":var i,a;if(this.ws.queue.pending.get(e.id))s.innerHTML=`<table>${null!==(i=e.diff)&&void 0!==i?i:"<em>No diff available</em>"}</table>`;else if(t&&(null===(a=e.consecutive)||void 0===a?void 0:a.count)>1){var r,o;document.querySelector("#consecutive-edits-tab").classList.add("selected"),null===(r=e.consecutive.diff)||void 0===r||r?s.innerHTML=`<table>${null!==(o=e.consecutive.diff)&&void 0!==o?o:"<em>No diff available</em>"}</table>`:s.innerHTML="<table><em>No difference</em></table>"}else{var l;document.querySelector("#latest-edits-tab").classList.add("selected"),s.innerHTML=`<table>${null!==(l=e.diff)&&void 0!==l?l:"<em>No diff available</em>"}</table>`}if(this.ws.store.settings.username_highlighting.enabled){const t=this.ws.api.username;t&&(e.mentions.diff&&s.querySelectorAll("td").forEach(e=>{e.textContent&&this.ws.util.match(t,e.textContent)&&e.classList.add("ws-username-highlight")}),e.mentions.comment&&e.comment&&this.ws.util.match(t,e.comment)&&document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"))}break;case"logevent":if("users"===e.type){s.innerHTML="";const t=e.user.profanity,n=document.createElement("div");n.classList.add("profanity"),s.appendChild(n);const i=document.createElement("div");{i.classList.add("profanity-header"),n.appendChild(i);const e=document.createElement("div");{e.classList.add("profanity-score"),i.appendChild(e);const n=document.createElement("span");n.classList.add("score-label"),n.textContent="Profanity Score:",e.appendChild(n);const s=document.createElement("span");s.classList.add("score-value"),s.textContent=t.finalScore,e.appendChild(s)}const s=document.createElement("div");{s.classList.add("profanity-risk",`risk-${t.risk.toLowerCase()}`),i.appendChild(s);const e=document.createElement("span");switch(e.classList.add("fa"),t.risk){case"No":e.classList.add("fa-smile");break;case"Low":e.classList.add("fa-thumbs-up");break;case"Medium":e.classList.add("fa-meh");break;case"High":e.classList.add("fa-thumbs-down");break;case"Critical":e.classList.add("fa-skull-crossbones")}s.appendChild(e);const n=document.createElement("span");n.textContent=`${t.risk} risk`,s.appendChild(n)}}const a=t.matches;if(a.length>0){const e=document.createElement("div");e.classList.add("profanity-matches-header"),n.appendChild(e);const t=document.createElement("span");t.classList.add("fa","fa-search"),e.appendChild(t);const s=document.createElement("span");s.textContent=`Matched Terms (${a.length})`,e.appendChild(s);const i=document.createElement("div");i.classList.add("profanity-matches-list"),n.appendChild(i);for(const e of a){const t=document.createElement("div");{t.classList.add("profanity-match"),i.appendChild(t);const n=document.createElement("div");{n.classList.add("match-header"),t.appendChild(n);const s=document.createElement("span");s.classList.add("match-text"),s.textContent=e.match,n.appendChild(s);const i=document.createElement("span");i.classList.add("fa","fa-arrow-right"),n.appendChild(i);const a=document.createElement("span");a.classList.add("match-name"),a.textContent=e.name,n.appendChild(a)}const s=document.createElement("div");{s.classList.add("match-details"),t.appendChild(s);const n=document.createElement("div");{n.classList.add("match-stat"),s.appendChild(n);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Confidence",n.appendChild(t);const i=document.createElement("span");i.classList.add("stat-value"),i.dataset.tooltip="How certain we are this is a match.",i.dataset.tooltipDelay=500,i.textContent=`${Math.round(100*e.confidence)}%`,n.appendChild(i)}const i=document.createElement("div");{i.classList.add("match-stat"),s.appendChild(i);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Obfuscation",i.appendChild(t);const n=document.createElement("span");n.classList.add("stat-value"),n.dataset.tooltip="How much the term was altered from its original form.",n.dataset.tooltipDelay=500,n.textContent=`${Math.round(100*e.obfuscation)}%`,i.appendChild(n)}const a=document.createElement("div");{a.classList.add("match-stat"),s.appendChild(a);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Severity",a.appendChild(t);const n=document.createElement("span");n.classList.add("stat-value",`severity-${e.severity}`),n.dataset.tooltip="How severe this term is considered.",n.dataset.tooltipDelay=500,n.textContent=e.severity,a.appendChild(n)}}if(e.note){const n=document.createElement("div");{n.classList.add("match-note"),t.appendChild(n);const s=document.createElement("span");s.classList.add("fa","fa-info-circle"),n.appendChild(s);const i=document.createElement("span");i.classList.add("note-text"),i.textContent=e.note,n.appendChild(i)}}}t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e))}}else{const e=document.createElement("div");e.classList.add("profanity-no-matches"),n.appendChild(e);const t=document.createElement("span");t.classList.add("fa","fa-check-circle"),e.appendChild(t);const s=document.createElement("span");s.textContent="No profanity detected.",e.appendChild(s)}}break;case"abuselog":var d;if(s.innerHTML=`<table>${null!==(d=e.diff)&&void 0!==d?d:"<em>No diff available</em>"}</table>`,this.ws.store.settings.username_highlighting.enabled){const t=this.ws.api.username;t&&(e.mentions.diff&&s.querySelectorAll("td").forEach(e=>{e.textContent&&this.ws.util.match(t,e.textContent)&&e.classList.add("ws-username-highlight")}),e.mentions.comment&&e.comment&&this.ws.util.match(t,e.comment)&&document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"))}}s.querySelectorAll(":is(.mw-diff-movedpara-left, .mw-diff-movedpara-right)").forEach(e=>{const t=e.href.split("#")[1];delete e.href,e.innerHTML=e.classList.contains("mw-diff-movedpara-left")?">":"<",e.addEventListener("click",e=>{e.preventDefault();const n=s.querySelector(`a[name="${t}"]`);if(n){const e=n.getBoundingClientRect(),t=s.getBoundingClientRect(),i=e.top-t.top+s.scrollTop-(t.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),s.querySelectorAll(".flash-highlight").forEach(e=>e.classList.remove("flash-highlight"));const a=n.parentElement.parentElement;a.classList.add("flash-highlight"),setTimeout(()=>{var e;return null==a||null===(e=a.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)}})});const u=s.querySelectorAll(".diff-addedline, .diff-deletedline"),p=null!==(n=s.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange")[0])&&void 0!==n?n:u[0];p?requestAnimationFrame(()=>{const e=p.getBoundingClientRect(),t=s.getBoundingClientRect(),n=e.top-t.top+s.scrollTop-(t.height-e.height)/2;function i(){const e=s.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange");let t=null,n=null;const i=s.getBoundingClientRect();for(const s of e){let e=!1,a=!1;const r=s.getBoundingClientRect();r.bottom<i.top&&(e=!0),r.top>i.bottom&&(a=!0),e&&a||(e&&(t=s),null===n&&a&&(n=s))}const a=document.querySelector("#diff-scroll-up");a.classList.toggle("hidden",!t),a.onclick=()=>{const e=t.getBoundingClientRect(),n=s.getBoundingClientRect(),i=e.top-n.top+s.scrollTop-(n.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),t.classList.add("flash-highlight"),setTimeout(()=>{var e;return null===(e=t)||void 0===e||null===(e=e.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)};const r=document.querySelector("#diff-scroll-down");r.classList.toggle("hidden",!n),r.onclick=()=>{const e=n.getBoundingClientRect(),t=s.getBoundingClientRect(),i=e.top-t.top+s.scrollTop-(t.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),n.classList.add("flash-highlight"),setTimeout(()=>{var e;return null===(e=n)||void 0===e||null===(e=e.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)}}s.scrollTo({top:Math.max(0,n),behavior:"smooth"}),i(),s.onscroll=()=>requestAnimationFrame(i),window.onresize=()=>requestAnimationFrame(i)}):(document.querySelector("#diff-scroll-up").classList.add("hidden"),document.querySelector("#diff-scroll-down").classList.add("hidden"))}updateAIAnalysisDisplay(e){const t=document.querySelector("#ai-analysis-container");if(!t||!e)return t.classList.add("hidden");if(t.classList.remove("hidden"),e.error){const n=t.querySelector(":scope > .header > .assessment");n.textContent="Error",n.className="assessment error",t.querySelector(":scope > .header > .confidence").textContent="",t.querySelector(":scope > .explanation").textContent=e.error;t.querySelector(":scope > .issues").innerHTML=""}else{const n=t.querySelector(":scope > .header > .assessment");n.textContent=e.assessment,n.className=`assessment ${e.assessment.toLowerCase().replace(/\s+/g,"-")}`,t.querySelector(":scope > .header > .confidence").textContent=`${Math.round(100*(e.confidence||0))}% confidence`;const s=function(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}(v,this,b).call(this,e.explanation||"No explanation provided.");t.querySelector(":scope > .explanation").innerHTML=s;const i=t.querySelector(":scope > .issues");i.innerHTML="";for(const t of e.issues||[]){const e=document.createElement("div");e.classList.add("issue",t.severity.toLowerCase().replace(/\s+/g,"-")),e.textContent=t.policy,i.appendChild(e)}t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e))}}async outdated(e){let t=e.type,n=e.id;if("abuselog"===t&&e.revid&&(t="edit",n=e.revid),"edit"!==c.Queue.groups[t])return this.toggleOutdatedNotice(!1),void this.togglePendingNotice(!1);if("pending"===e.type)return this.togglePendingNotice(!this.ws.queue.pending.has(n),!0);if(!e.pending&&"pending"===this.ws.queue.type)return this.togglePendingNotice(!0,!1);try{var s;const t=(await this.ws.api.getLatestIds([e.page.title]))[e.page.title];(null===(s=this.ws.queue.current.item)||void 0===s?void 0:s.id)===e.id&&this.toggleOutdatedNotice(t>n,t,e.page.title,n)}catch(e){console.error("Error checking if edit is outdated:",e),this.toggleOutdatedNotice(!1)}}startOutdatedCheck(e){this.stopOutdatedCheck(),this.outdated(e),this.intervals.outdated=setInterval(()=>{var t;e.id===(null===(t=this.ws.queue.current.item)||void 0===t?void 0:t.id)?this.outdated(e):this.stopOutdatedCheck()},1e3)}stopOutdatedCheck(){this.intervals.outdated&&(clearInterval(this.intervals.outdated),this.intervals.outdated=null),this.toggleOutdatedNotice(!1),this.togglePendingNotice(!1)}toggleEditWarNotice(e,t){const n=document.querySelector("#edit-war-notice");if(null!=e||(e=!n),e!==Boolean(n))if(e){const e=document.createElement("div");e.id="edit-war-notice",e.classList.add("notice","edit-war");const n=document.createElement("span");n.classList.add("fa","fa-warning"),e.appendChild(n);const s=document.createElement("span");s.classList.add("text"),s.innerHTML=`<b>3RR:</b> You have made ${t} reverts on this page in the last 24 hours.`,e.appendChild(s);const i=document.querySelector("#diff-container");i.parentElement.insertBefore(e,i)}else{const e=document.querySelector("#edit-war-notice");e&&e.remove()}}toggleOutdatedNotice(e,t,n,s){const i=document.querySelector("#outdated-notice");if(null!=e||(e=!i),e!==Boolean(i))if(e){const e=document.createElement("div");e.id="outdated-notice",e.classList.add("notice","outdated"),e.dataset.id=t,e.dataset.page=n;const s=document.createElement("span");s.classList.add("fa","fa-clock-rotate-left"),e.appendChild(s);const i=document.createElement("span");i.classList.add("text"),i.textContent="Newer revision available on this page.",e.appendChild(i);const a=document.createElement("span");a.classList.add("button"),a.innerHTML="<i class='fas fa-redo restore'></i> Restore this revision",a.addEventListener("click",async e=>{e.preventDefault();const t=await this.dialog.input("Restore Edit","Are you sure you want to restore this revision? This will create a new edit that reverts the page to this revision.","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"restore-edit",params:{summary:t}}]})}),e.appendChild(a);const r=document.createElement("span");r.classList.add("button"),r.innerHTML="View latest <i class='fas fa-arrow-right'></i>",r.addEventListener("click",t=>{t.preventDefault();const n=e.dataset.page,s=+e.dataset.id;n&&s&&this.ws.queue.loadFromRevision(n,s)}),e.appendChild(r);const o=document.querySelector("#diff-container");o.parentElement.insertBefore(e,o)}else{const e=document.querySelector("#outdated-notice");e&&e.remove()}else i&&(i.dataset.id=t,i.dataset.page=n)}togglePendingNotice(e,t){const n=document.querySelector("#pending-notice");if(null!=e||(e=!n),e!==Boolean(n))if(e){const e=document.createElement("div");e.id="pending-notice",e.classList.add("notice","outdated","pending");const n=document.createElement("span");n.classList.add("fa","fa-shield-alt"),e.appendChild(n);const s=document.createElement("span");s.classList.add("text"),s.textContent=t?"This revision cannot be reviewed because it is outdated":"This revision cannot be reviewed because it is not pending review",e.appendChild(s);const i=document.querySelector("#diff-container");i.parentElement.insertBefore(e,i)}else{const e=document.querySelector("#pending-notice");e&&e.remove()}}getORESColor(e){if(isNaN(e)||e<0)return"rgba(128, 128, 128, .5)";e=Math.min(Math.max(e||0,0),1);const t=f.palettes[this.ws.store.UI.theme.palette];return t[e*(t.length-1)|0]}updatePalette(){document.querySelectorAll("[data-ores]").forEach(e=>{e.style.setProperty("--ores-color",this.getORESColor(parseFloat(e.dataset.ores)))})}updateZenMode(){this.ws.notifications.count();const e=this.ws.store.settings.zen_mode;e.enabled&&e.music.enabled?this.ws.audio.zengine.start():this.ws.audio.zengine.stop(),document.querySelectorAll("[data-zen-show]").forEach(t=>{const n=t.dataset.zenShow.split(",");e.enabled&&!n.some(t=>{var n;return null===(n=e[t])||void 0===n?void 0:n.enabled})?t.style.display="none":t.style.display=""})}updateAccessibility(){document.body.classList.toggle("colorblind-mode",this.ws.store.settings.accessibility.colorblind),document.body.classList.toggle("dyslexia-font",this.ws.store.settings.accessibility.dyslexia),document.body.classList.toggle("high-contrast",this.ws.store.settings.accessibility.high_contrast),document.body.classList.toggle("reduce-motion",this.ws.store.settings.accessibility.reduce_motion)}reorderQueues(){var e;const t=c.Queue.types.map(e=>({name:e,...this.ws.store.settings.queue[e]}));t.sort((e,t)=>e.order-t.order),t.forEach(e=>{const t=document.querySelector(`#queue-tab-${e.name}`);t&&(t.style.display=e.enabled?"":"none",t.parentElement.appendChild(t))});const n=t.find(e=>e.name===this.ws.queue.current.type)?this.ws.queue.current.type:null===(e=t.find(e=>e.enabled))||void 0===e?void 0:e.name;if(n)this.ws.queue.switch(n);else{const e=document.createElement("div");e.classList.add("queue-empty"),e.textContent="No items in queue",document.querySelector("#queue-items").innerHTML=e.outerHTML,this.newCurrentItem(null),this.ws.queue.switch("void")}}updateQueueTabs(e=c.Queue.types){const t=this.ws.queue.queues;e.forEach(e=>{const n=document.querySelector(`#queue-tab-${e}`);if(!n||!t[e])return;const s=n.querySelector(":scope > span > .icon-count"),i=t[e].queue.length;s.classList.toggle("hidden",0===i),s.textContent=i,n.classList.toggle("mentions-me",this.ws.store.settings.username_highlighting.enabled&&t[e].queue.some(e=>e.mentions.has))})}createTooltip(e,t="",n="",s=!1,i=10,a=null){const r=document.createElement("div");r.className=`tooltip ${t}`,r.style.opacity=0,s?r.innerHTML=n:r.textContent=n,document.body.querySelector("#app").appendChild(r),"function"==typeof a&&a(r),r.offsetHeight;const o=r.getBoundingClientRect(),l=o.width,d=o.height,c=e.getBoundingClientRect(),u=innerWidth,p=innerHeight,g=[["bottom",(c.left+c.right)/2-l/2,c.bottom+10,!0],["top",(c.left+c.right)/2-l/2,c.top-d-10,!0],["right",c.right+10,(c.top+c.bottom)/2-d/2,!0],["left",c.left-l-10,(c.top+c.bottom)/2-d/2,!0]];let h=null,m=-1/0;for(const[e,t,n,s]of g){let e=t,i=n;if(e>=0&&e+l<=u&&i>=0&&i+d<=p){m=100,h=[e,i];break}if(s){const s=Math.max(0,Math.min(e,u-l)),a=Math.max(0,Math.min(i,p-d)),r=!(s+l<=c.left||s>=c.right||a+d<=c.top||a>=c.bottom),o=Math.abs(s-t)+Math.abs(a-n),g=r?-50-o:50-o/10;g>m&&(m=g,h=[s,a])}}return h?(r.style.left=`${h[0]}px`,r.style.top=`${h[1]}px`):(r.style.left=`${Math.max(0,Math.min((c.left+c.right)/2-l/2,u-l))}px`,r.style.top=`${Math.max(0,Math.min((c.top+c.bottom)/2-d/2,p-d))}px`),e.addEventListener("mousewheel",e=>r.scrollBy({left:e.deltaX,top:e.deltaY,behavior:"smooth"})),setTimeout(()=>r.style.opacity=1,i),r}removeTooltips(){document.querySelectorAll(".tooltip").forEach(e=>e.remove())}addTooltipListener(e){if(!e.dataset.tooltip)return;let t;e.addEventListener("mouseenter",()=>{e.dataset.tooltip&&(t&&t.remove(),t=this.createTooltip(e,"",e.dataset.tooltip,"true"===e.dataset.tooltipHtml,+e.dataset.tooltipDelay||100))}),e.addEventListener("mouseleave",()=>{t&&(t.remove(),t=null)})}positionBottomMenu(e,t){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="";const n=()=>{if(!t.classList.contains("show"))return;const s=t.getBoundingClientRect(),i=e.getBoundingClientRect(),a=innerWidth,r=innerHeight;i.left+s.width<=a?(t.style.left=`${i.left}px`,t.style.right="auto"):(t.style.right=a-i.right+"px",t.style.left="auto");i.top>=s.height?(t.style.bottom=r-i.top+"px",t.style.top="auto"):(t.style.top=`${i.bottom}px`,t.style.bottom="auto"),requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionSubmenu(e,t){e.style.left="",e.style.right="",e.style.top="",e.style.bottom="";const n=()=>{if(!e.classList.contains("show"))return;const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left;o<s.width+20&&l>o&&(e.style.left="auto",e.style.right="calc(100% + 4px)");const d=r-i.bottom,c=i.top;s.bottom>r&&c>d&&(e.style.top="auto",e.style.bottom="0"),requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionLevelsMenu(e,t){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="";const n=()=>{if(!t.classList.contains("show"))return;const s=t.getBoundingClientRect(),i=e.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left,d=o>=s.width+8,c=l>=s.width+8;d?(t.style.left=`${i.right+8}px`,t.style.right="auto"):c?(t.style.right=a-i.left+8+"px",t.style.left="auto"):o>l?(t.style.left=`${i.right+8}px`,t.style.right="auto"):(t.style.right=a-i.left+8+"px",t.style.left="auto");const u=Math.max(Math.min(i.top+(i.height-s.height)/2,r-s.height-8),8);t.style.top=`${u}px`,t.style.bottom="auto",requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionWarningSubmenu(e,t){e.style.left="",e.style.right="",e.style.top="",e.style.bottom="";const n=()=>{if(!e.classList.contains("show"))return;const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left,d=o>=s.width+8,c=l>=s.width+8;d?(e.style.left=`${i.right+8}px`,e.style.right="auto"):c?(e.style.right=a-i.left+8+"px",e.style.left="auto"):o>l?(e.style.left=`${i.right+8}px`,e.style.right="auto"):(e.style.right=a-i.left+8+"px",e.style.left="auto");const u=Math.max(Math.min(i.top+(i.height-s.height)/2,r-s.height-8),8);e.style.top=`${u}px`,e.style.bottom="auto",requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}createWarningItem(e,t,n,s,i=!1){const a=this.ws.store.favorite[s],r=document.createElement("div");r.classList.add("warning-menu-item"),i?(r.draggable=!0,r.classList.add("favorite-item")):r.classList.add("submenu-option"),r.dataset.warning=e.title;const o=document.createElement("span");o.classList.add("favorite-star"),a.includes(e.title)?(o.classList.add("favorited"),o.innerHTML="<i class='fas fa-star'></i>"):o.innerHTML="<i class='fa-regular fa-star'></i>",r.appendChild(o),o.addEventListener("click",t=>{t.stopPropagation();const n=a.indexOf(e.title),l="reverts"===s?document.querySelector("#revert-menu > .warning-menu"):document.querySelector("#warn-menu > .warning-menu");if(-1===n){a.push(e.title),o.classList.add("favorited","spin"),o.innerHTML="<i class='fas fa-star'></i>";let t=l.querySelector(".favorites-section");if(!t){t=document.createElement("div"),t.className="favorites-section";const e=document.createElement("div");e.className="favorites-header",e.innerHTML='<span class="icon fas fa-star"></span><span>Favorites</span>',t.appendChild(e);const n=document.createElement("div");n.className="favorites-container",t.appendChild(n),l.insertBefore(t,l.firstChild);const s=document.createElement("div");s.className="favorites-separator",l.insertBefore(s,t.nextSibling)}const n=l.__executeCallbacks__;n&&t.querySelector(".favorites-container").appendChild(this.createWarningItem(e,n.executeWithWarn,n.executeNoWarn,s,!0))}else if(a.splice(n,1),o.classList.remove("favorited"),o.classList.add("spin"),o.innerHTML="<i class='fa-regular fa-star'></i>",i){r.remove();const t=l.querySelector(".favorites-section");var d;if(0===(null==t?void 0:t.querySelector(".favorites-container").children.length))t.remove(),null===(d=l.querySelector(".favorites-separator"))||void 0===d||d.remove();const n=document.body.querySelector(`.warning-menu-item:not(.favorite-item)[data-warning="${e.title}"]`);if(n){const e=n.querySelector(".favorite-star");e.classList.remove("favorited"),e.innerHTML="<i class='fa-regular fa-star'></i>",e.classList.add("spin"),setTimeout(()=>e.classList.remove("spin"),500)}}else{const t=l.querySelector(".favorites-section");if(t){const n=t.querySelector(`[data-warning="${e.title}"]`);var c;if(n)if(n.remove(),0===t.querySelector(".favorites-container").children.length)t.remove(),null===(c=l.querySelector(".favorites-separator"))||void 0===c||c.remove()}}setTimeout(()=>o.classList.remove("spin"),500)});const l=document.createElement("span");l.className=`icon ${e.icon}`,r.appendChild(l);const d=document.createElement("span");d.className="warning-menu-title",d.textContent=e.title,r.appendChild(d);const c=document.createElement("span");if(c.className="fas fa-circle-question",c.dataset.tooltip=`${e.description} (click for template preview)`,r.appendChild(c),this.addTooltipListener(c),c.addEventListener("click",async t=>{t.preventDefault(),t.stopPropagation();const n=this.ws;this.dialog.show(e.title,async function(){return(await Promise.allSettled(e.templates.map(e=>{const t=n.queue.current.item;return n.api.parse(`{{${e.template}|${t.page.title}}}`,`User:${t.user.name}`,!0)}))).map(e=>{let t="";t="fulfilled"===e.status?e.value:`<em>Error loading template preview: ${e.reason}</em>`;const s=(new DOMParser).parseFromString(t,"text/html").body;return s.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${n.server}`).href)}),s.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${n.server}`).href)}),s.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,s]=e.trim().split(/\s+/,2),i=new URL(t,`https://${n.server}`).href;return s?`${i} ${s}`:i}).join(", ");e.setAttribute("srcset",t)}),s.innerHTML}).join("<div style='height: 1px; background: #0004; margin: 8px 0;'></div>")}())}),!i){const i=document.createElement("div");if(i.classList.add("warning-menu-buttons"),"reverts"===s){const t=document.createElement("span");t.className="warning-menu-button warning-menu-no-warn-button",t.textContent="no warn",i.appendChild(t),t.addEventListener("click",async t=>{t.stopPropagation(),await n(e.title)})}const a=document.createElement("span");a.className="warning-menu-button warning-menu-levels-button",a.textContent="advanced",i.appendChild(a),r.appendChild(i);const o=document.createElement("div");o.className="levels-menu";for(const n of e.templates){if(n.generic)continue;const s=document.createElement("span");s.className=`levels-menu-item colorize-level colorize-level-${n.name}`,s.textContent=n.name,o.appendChild(s),s.addEventListener("click",async()=>await t(e.title,n.name))}document.body.querySelector("#app").appendChild(o),a.addEventListener("click",e=>{e.stopPropagation();const t=o.classList.contains("show");document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show")),t||(o.classList.add("show"),this.positionLevelsMenu(a,o))})}return r.addEventListener("click",async n=>{n.target.closest(".warning-menu-button")||n.target.closest(".favorite-star")||await t(e.title,"auto")}),i&&(r.addEventListener("dragstart",t=>{t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e.title),r.classList.add("dragging")}),r.addEventListener("dragend",()=>{r.classList.remove("dragging")}),r.addEventListener("dragover",e=>{e.preventDefault(),e.dataTransfer.dropEffect="move";const t=document.querySelector(".dragging");if(t&&t!==r){const n=r.getBoundingClientRect(),s=n.top+n.height/2;e.clientY<s?r.parentNode.insertBefore(t,r):r.parentNode.insertBefore(t,r.nextSibling)}}),r.addEventListener("drop",e=>{e.preventDefault();const t=Array.from(r.closest(".favorites-section").querySelectorAll(".favorite-item"));this.ws.store.favorite[s]=t.map(e=>e.dataset.warning)})),r}createWarnMenu(e,t,n){var s,i,a;removeEventListener("keydown",this.warningMenuKeyListener),document.querySelectorAll(".levels-menu").forEach(e=>e.remove()),document.querySelectorAll(".warning-submenu").forEach(e=>e.remove());const r=document.createElement("div");r.className="warning-menu",t.appendChild(r),r.addEventListener("click",e=>{e.target.closest(".warning-submenu")||document.body.querySelectorAll(".warning-submenu.show").forEach(e=>e.classList.remove("show")),e.target.closest(".levels-menu")||document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show"))});const o=async(t,n)=>{const s=(0,u.getWarningFromLookup)(t),i=this.ws.store.settings.auto_report;await this.ws.execute({actions:[{name:"next-item",params:{}},"reverts"===e?{name:"rollback-edit",params:{summary:s.summary}}:{},{name:"warn-user",params:{warning:t,level:n}},{name:"highlight-user",params:{}}].concat(i.enabled&&s.reportable&&i.for.has(t)?[{name:"if",condition:{name:"user-final-warning"},actions:[{name:"report-user-to-aiv",params:{reportMessage:"Vandalism past final warning"}}]}]:[])})},l=async e=>{const t=(0,u.getWarningFromLookup)(e);await this.ws.execute({actions:[{name:"next-item",params:{}},{name:"rollback-edit",params:{summary:t.summary}}]})},d=null!==(s=null===(i=this.ws.queue.current.item)||void 0===i?void 0:i.type)&&void 0!==s?s:this.ws.queue.current.type;let p=c.Queue.groups[d];if("abuselog"===d&&null!==(a=this.ws.queue.current.item)&&void 0!==a&&a.revid&&(p="edit"),r.__executeCallbacks__={executeWithWarn:o,executeNoWarn:l},this.ws.store.favorite.reverts.length>0){const t=document.createElement("div");t.className="favorites-section";const s=document.createElement("div");s.className="favorites-header",s.innerHTML='<span class="icon fas fa-star"></span><span>Favorites</span>',t.appendChild(s);const i=document.createElement("div");i.className="favorites-container",t.appendChild(i);const a=Object.values(u.warningsLookup).filter(e=>e.queueType.includes(p)&&(!n||"function"!=typeof e.show||e.show(n)));for(const t of this.ws.store.favorite[e]){const n=a.find(e=>e.title===t);if(n){const t=this.createWarningItem(n,o,l,e,!0);i.appendChild(t)}}r.appendChild(t);const d=document.createElement("div");d.className="favorites-separator",r.appendChild(d)}let g=0;for(const[,t]of Object.entries(u.warnings)){let s=0;const i=[];for(const e of t.warnings)("function"!=typeof e.show||e.show(n))&&e.queueType.includes(p)&&(i.push(e),s++,g++);if(0===s)continue;const a=document.createElement("div");a.className="menu-option submenu-trigger";const d=document.createElement("span");d.className=`icon ${t.icon}`,a.appendChild(d);const c=document.createElement("span");c.textContent=t.title,a.appendChild(c);const u=document.createElement("span");u.className="submenu-arrow fas fa-chevron-right",a.appendChild(u),r.appendChild(a);const h=document.createElement("div");h.className="warning-submenu submenu",document.body.querySelector("#app").appendChild(h);for(const t of i){const n=this.createWarningItem(t,o,l,e,!1);h.appendChild(n)}a.addEventListener("click",e=>{e.stopPropagation();const t=h.classList.contains("show");document.body.querySelectorAll(".warning-submenu.show").forEach(e=>{e!==h&&(e.classList.remove("show"),document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show")))}),t?(a.classList.remove("focus-opened"),h.classList.remove("show"),document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show"))):(a.classList.add("focus-opened"),h.classList.add("show"),this.positionWarningSubmenu(h,a))})}if(0===g){const e=document.createElement("div");e.className="warning-menu-no-items",e.textContent="No warnings available for this edit.",r.appendChild(e)}addEventListener("keydown",this.warningMenuKeyListener)}warningMenuKeyListener(e){if("Tab"===e.key){const t=document.querySelector("#warn-menu.show, #revert-menu.show");if(t){if(t.querySelector(":scope > div > .menu-option.focus-opened")){const t=document.body.querySelector(".submenu.show");if(t){const n=t.querySelectorAll(":scope > .warning-menu-item");if(n.length>0){const s=(Array.from(n).indexOf(t.querySelector(".focus-visible"))+(e.shiftKey?-1:1)+n.length)%n.length;document.querySelectorAll(".focus-visible").forEach(e=>e.classList.remove("focus-visible")),n[s].classList.add("focus-visible"),e.preventDefault()}}}else{const n=t.querySelectorAll(":scope > div > .favorites-section > .favorites-container > .warning-menu-item,\n\t\t\t\t\t\t :scope > div > .menu-option");if(n.length>0){const s=(Array.from(n).indexOf(t.querySelector(".focus-visible"))+(e.shiftKey?-1:1)+n.length)%n.length;document.querySelectorAll(".focus-visible").forEach(e=>e.classList.remove("focus-visible")),n[s].classList.add("focus-visible"),e.preventDefault()}}}}else if("Enter"===e.key){if(document.querySelector("#warn-menu.show, #revert-menu.show")){const t=document.querySelector(".focus-visible");t&&(t.click(),e.preventDefault())}}else if("Escape"===e.key){if(document.querySelector("#warn-menu.show, #revert-menu.show")){const t=document.querySelector(".focus-opened");t?(t.classList.remove("focus-opened"),t.classList.add("focus-visible"),t.click()):(document.querySelectorAll(".bottom-tool-menu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".levels-menu").forEach(e=>e.classList.remove("show"))),e.preventDefault()}}}closeMenus(){document.querySelectorAll(".bottom-tool-menu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".levels-menu").forEach(e=>e.classList.remove("show"))}}function b(e){const t=new Set(["B","I","EM","STRONG","CODE","SPAN","BR"]),n=document.createElement("div");n.innerHTML=e;const s=e=>{const n=[...e.childNodes];for(const e of n)if(e.nodeType===Node.ELEMENT_NODE)if(t.has(e.tagName)){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name);s(e)}else e.replaceWith(...e.childNodes)};return s(n),n.innerHTML}t.GUI=f,m(f,"palettes",{traffic:(0,p.BuildPalette)(1e3,"#78c675","#fdff7a","#fcff54","#fbff12","#ffc619","#ff8812","#f56214","#f73214","#fc0303","#fc0303"),magma:(0,p.BuildPalette)(1e3,"#000004","#1b0c41","#4a0c6b","#781c6d","#a52c60","#cf4446","#ed6925","#fb9b06","#f7d13d","#fcffa4"),plasma:(0,p.BuildPalette)(1e3,"#0d0887","#46039f","#7201a8","#9c179e","#bd3786","#d8576b","#ed7953","#fb9f3a","#fdca26","#f0f921"),viridis:(0,p.BuildPalette)(1e3,"#440154","#3b528b","#21918c","#5ec962","#fde725"),natural:(0,p.BuildPalette)(1e3,"#ffffff","#18ff18"),cool:(0,p.BuildPalette)(1e3,"#ffffff","#1818ff"),heat:(0,p.BuildPalette)(1e3,"#ffffff","#ff1818"),grey:(0,p.BuildPalette)(1e3,"#000000","#ffffff")})},4674(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Notifications=void 0;t.Notifications=class{constructor(e){this.ws=e,this.first={},["alert","message"].forEach(e=>{this[e]=[],this.update(e),this.first[e]=!0,this.load(e)})}find(e,t){if(!1===(null!=e&&e)){let e=this.alert.find(e=>e.id===t);return e?{type:"alert",notification:e}:(e=this.message.find(e=>e.id===t),e?{type:"message",notification:e}:void 0)}return this[e].find(e=>e.id===t)}async load(e){try{const t=(await this.ws.api.continuous({action:"query",meta:"notifications",notlimit:"max",notprop:"list",notfilter:"!read",notsections:e,notformat:"model"})).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.notifications)||void 0===t?void 0:t.list)||[]});await Promise.all(t.map(async e=>this.ws.api.parse(e["*"].body).then(t=>{var n;return null!==(n=void(e["*"].parsed=t))&&void 0!==n?n:e})));let n=!1;for(const s of t)this[e].some(e=>e.id===s.id&&e.read===s.read)||(this[e].unshift(s),n=!0);if(n){const t=this.ws.store.settings.zen_mode;t.enabled&&!t[`${e}s`].enabled||this.ws.audio.playSound(["notification",e]),this.update(e)}}finally{setTimeout(()=>this.load(e),1e4)}}update(e){this.count();const t=this[e],n=t.filter(e=>!e.read),s=this.ws.store.settings.zen_mode;s.enabled&&!s[`${e}s`].enabled||n.filter(e=>!e.seen&&!e.notified).forEach(t=>{t.notified=!0,this.first[e]||electron.sendNotification({title:this.ws.util.textify(t["*"].header),body:this.ws.util.textify(t["*"].body)},t["*"].links.primary.url)}),this.first[e]=!1;const i=document.querySelector(`#${e}s-count`),a=document.querySelector(`#${e}s-list`);i.textContent=n.length,i.classList.toggle("hidden",0===n.length),0===t.length?a.innerHTML=`<div class="notifications-empty">No new ${e}s</div>`:(a.innerHTML="",t.forEach(t=>{const n=t["*"];{const s=document.createElement("div");s.classList.add("notification"),s.classList.add(t.read?"read":"unread"),s.addEventListener("click",()=>{this.read(e,t),this.ws.open(n.links.primary.url)});{const e=document.createElement("div");e.classList.add("notification-icon"),e.innerHTML=`<img src="${new URL(n.iconUrl,`https://${this.ws.server}/`).toString()}" alt="icon">`,s.appendChild(e)}{const e=document.createElement("div");e.classList.add("notification-content"),s.appendChild(e);{const t=document.createElement("div");t.classList.add("notification-header"),t.innerHTML=this.ws.util.truncate(n.header,100),e.appendChild(t)}{const t=document.createElement("div");t.classList.add("notification-body"),t.innerHTML=n.parsed,e.appendChild(t),t.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,n]=e.trim().split(/\s+/,2),s=new URL(t,`https://${this.ws.server}`).href;return n?`${s} ${n}`:s}).join(", ");e.setAttribute("srcset",t)}),t.querySelectorAll("a").forEach(e=>{e.target="_blank"})}{const t=document.createElement("div");t.classList.add("notification-links"),n.links.secondary.forEach(e=>{const n=document.createElement("a");n.href=e.url,n.target="_blank",n.textContent=e.label,t.appendChild(n)}),e.appendChild(t)}}{const n=document.createElement("div");if(n.classList.add("notification-right"),s.appendChild(n),!t.read){const s=document.createElement("div");s.classList.add("notification-unread-indicator"),s.addEventListener("click",n=>{n.stopPropagation(),this.read(e,t)}),n.appendChild(s)}{const e=document.createElement("div");e.classList.add("notification-timestamp"),e.dataset.time=t.timestamp.utciso8601,e.dataset.timeFormat="notification",e.textContent=this.ws.util.formatNotificationTime(new Date(t.timestamp.utciso8601)),n.appendChild(e)}}a.appendChild(s)}}))}seen(e){this.ws.api.postWithToken({action:"echomarkseen",type:e}),this[e].forEach(e=>e.seen=!0)}read(e,t){t?(t.read=!0,this.update(e),this.ws.api.postWithToken({action:"echomarkread",sections:e,list:t.id})):(this[e].forEach(e=>e.read=!0),this.update(e),this.ws.api.postWithToken({action:"echomarkread",sections:e,all:!0}))}count(){var e,t;const n=this.ws.store.settings.zen_mode;let s=0;n.enabled&&!n.alerts.enabled||(s+=(null===(e=this.alert)||void 0===e?void 0:e.filter(e=>!e.read).length)||0),n.enabled&&!n.messages.enabled||(s+=(null===(t=this.message)||void 0===t?void 0:t.filter(e=>!e.read).length)||0),electron.setBadgeCount(s),document.title=s>0?`(${s}) WikiShield`:"WikiShield"}}},6151(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ProgressBar=void 0;t.ProgressBar=class{constructor(){this.$bar=document.createElement("div"),this.$bar.classList.add("progress-bar"),this.$bar.style.opacity=1,document.querySelector("#progress-bar-container").appendChild(this.$bar),this.$overlay=document.createElement("div"),this.$overlay.classList.add("progress-bar-overlay"),this.$overlay.style.width="0%",this.$bar.appendChild(this.$overlay),this.$text=document.createElement("div"),this.$text.classList.add("progress-bar-text"),this.$bar.appendChild(this.$text)}set(e,t,n){this.$text.textContent=e,this.$overlay.style.width=100*Math.min(Math.max(t,0),1)+"%",this.$bar.classList.toggle("error",n),t>=1&&setTimeout(()=>{this.$bar.style.opacity=0,setTimeout(()=>this.$bar.remove(),300)},1700)}}},9117(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Settings=void 0;var s=n(8678),i=n(870),a=n(9808),r=n(985),o=n(372),l=n(7054),d=n(4018),c=(n(9501),n(955)),u=n(5564),p=n(2069),g=n(8469);function h(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function m(e,t,n){return e.set(f(e,t),n),n}function v(e,t){return e.get(f(e,t))}function f(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var b=new WeakMap,w=new WeakMap,y=new WeakMap;t.Settings=class{constructor(e){h(this,b,void 0),h(this,w,void 0),h(this,y,void 0),this.ws=e,this.ws.api.getTags().then(e=>{this.wikipediaTags=e})}get active(){return document.querySelector("#settings-container > .settings > .settings-right > div:not(.hidden)")}controller(e){const t=e.key.toLowerCase();if(v(b,this)){if("escape"===t)return v(b,this).call(this,"escape",!0);if("control"===t||"shift"===t||"alt"===t||a.controls.has(t))switch(e.preventDefault(),e.type){case"keydown":v(b,this).call(this,(0,a.buildShortcut)(e),!1);break;case"keyup":v(b,this).call(this,(0,a.buildShortcut)(e),!0)}}else"escape"===t&&"keydown"===e.type&&this.close()}collapsible(e,t,n,s=!0){const i=document.createElement("div");i.className="settings-section collapsible",e.appendChild(i);const a=document.createElement("div");a.className="settings-section-header collapse-title",a.textContent=t(s),i.appendChild(a);const r=document.createElement("div");r.className="collapse-content collapsible",i.appendChild(r);const o=document.createElement("div");o.className="settings-section-desc",o.textContent=n,r.appendChild(o),s?(r.style.height="0px",r.style.opacity=0,r.style.overflow="hidden",i.classList.add("collapsed")):(r.style.height="auto",r.style.opacity=1,r.style.overflow="visible",i.classList.remove("collapsed"));let l,d,c,u,p,g,h=!1;const m=e=>{d||(d=e);const t=e-d,n=Math.min(t/300,1),i=(a=n)<.5?2*a*a:(4-2*a)*a-1;var a;const o=c+(p-c)*i,v=u+(g-u)*i;r.style.height=`${o}px`,r.style.opacity=v,n<1?l=requestAnimationFrame(m):(s?r.style.overflow="hidden":(r.style.height="auto",r.style.overflow="visible"),h=!1,l=null,d=null)};return a.addEventListener("click",()=>{if(h){cancelAnimationFrame(l);const e=r.getBoundingClientRect().height;c=e,u=parseFloat(getComputedStyle(r).opacity)}else c=s?0:r.scrollHeight,u=s?0:1;s=!s,a.textContent=t(s),i.classList.toggle("collapsed",s),r.style.overflow="hidden",s?(p=0,g=0):(p=r.scrollHeight,g=1),h=!0,d=null,l=requestAnimationFrame(m)}),r}start(){electron.onOpenChangelog(()=>{var e;return null!==(e=void this.open())&&void 0!==e?e:this.changelog()});let e=0;document.querySelector("#settings-container").addEventListener("click",t=>{"settings-container"!==t.target.id||(e=Math.max(0,e))||this.close()}),document.querySelector("#settings-general-button").addEventListener("click",this.general.bind(this)),document.querySelector("#settings-audio-button").addEventListener("click",this.audio.bind(this)),document.querySelector("#settings-controls-button").addEventListener("click",this.controls.bind(this)),document.querySelector("#settings-zen-button").addEventListener("click",this.zen.bind(this)),document.querySelector("#settings-app-button").addEventListener("click",this.app.bind(this)),document.querySelector("#settings-queue-button").addEventListener("click",this.queue.bind(this)),document.querySelector("#settings-accessibility-button").addEventListener("click",this.accessibility.bind(this)),document.querySelector("#settings-AI-button").addEventListener("click",this.AI.bind(this)),document.querySelector("#settings-auto-reporting-button").addEventListener("click",this.autoReporting.bind(this)),document.querySelector("#settings-gadgets-button").addEventListener("click",this.gadgets.bind(this)),document.querySelector("#settings-whitelist-users-button").addEventListener("click",this.whitelist.bind(this,"user")),document.querySelector("#settings-whitelist-pages-button").addEventListener("click",this.whitelist.bind(this,"page")),document.querySelector("#settings-whitelist-tags-button").addEventListener("click",this.whitelist.bind(this,"tag")),document.querySelector("#settings-highlight-users-button").addEventListener("click",this.highlight.bind(this,"user")),document.querySelector("#settings-highlight-pages-button").addEventListener("click",this.highlight.bind(this,"page")),document.querySelector("#settings-highlight-tags-button").addEventListener("click",this.highlight.bind(this,"tag")),document.querySelector("#settings-statistics-button").addEventListener("click",this.statistics.bind(this)),document.querySelector("#settings-save-button").addEventListener("click",this.save.bind(this)),document.querySelector("#settings-changelog-button").addEventListener("click",this.changelog.bind(this)),document.querySelector("#settings-about-button").addEventListener("click",this.about.bind(this));{const t=document.querySelector("#settings-ores-bias"),n=t.querySelector(".settings-slider-track"),s=t.querySelector(".settings-slider-thumb"),i=t.querySelector(".settings-slider-label-left"),a=i.querySelector(".percent"),r=t.querySelector(".settings-slider-label-right"),o=r.querySelector(".percent"),l=e=>{this.ws.store.settings.queue.ores_bias=+e.toFixed(2),e=Math.max(0,Math.min(100,Math.round(100*e))),s.style.left=`${e}%`,n.style.setProperty("--fill",`${e}%`);const t=100-e;a.textContent=`${t}%`,i.classList.toggle("active",t>0);const l=e;o.textContent=`${l}%`,r.classList.toggle("active",l>0)},d=e=>{const t=n.getBoundingClientRect();return(e.clientX-t.left)/t.width};n.addEventListener("click",e=>l(d(e)));let c=!1;s.addEventListener("mousedown",t=>{t.preventDefault(),c=!0,e++,s.classList.add("dragging")}),window.addEventListener("mousemove",e=>{c&&l(d(e))}),window.addEventListener("mouseup",()=>{c&&(c=!1,e--,s.classList.remove("dragging"))}),l(this.ws.store.settings.queue.ores_bias)}{const e=document.querySelector("#settings-maximum-edit-count");e.value=this.ws.store.settings.queue.max_edits,e.addEventListener("change",e=>{const t=+e.target.value;this.ws.store.settings.queue.max_edits=t;for(const[e,n]of this.ws.queue.bypass.entries())n<=t&&this.ws.queue.bypass.delete(e)});const t=document.querySelector("#settings-maximum-queue-size");t.value=this.ws.store.settings.queue.max_size,t.addEventListener("change",e=>this.ws.store.settings.queue.max_size=+e.target.value);const n=document.querySelector("#settings-minimum-ores-score");n.value=this.ws.store.settings.queue.min_ores,n.addEventListener("change",e=>this.ws.store.settings.queue.min_ores=+e.target.value);const s=document.querySelector("#settings-watchlist-expiry");s.value=this.ws.store.settings.expiry.watchlist,s.addEventListener("change",e=>this.ws.store.settings.expiry.watchlist=e.target.value);const i=document.querySelector("#settings-namespaces-container");i.innerHTML="",d.namespaces.forEach(e=>{const t=document.createElement("div");t.className="namespace-item",t.dataset.namespaceId=e.id,t.innerHTML=`\n\t\t\t\t\t<label class="checkbox-box">\n\t\t\t\t\t\t<input type="checkbox" autoComplete="off">\n\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t</label>\n\t\t\t\t\t<span class="namespace-name">${e.name}</span>\n\t\t\t\t`;const n=t.querySelector("input[type=checkbox]");n.checked=this.ws.store.settings.namespaces.includes(e.id),n.addEventListener("change",t=>{if(t.target.checked)this.ws.store.settings.namespaces.includes(e.id)||this.ws.store.settings.namespaces.push(e.id);else{const t=this.ws.store.settings.namespaces.indexOf(e.id);-1!==t&&this.ws.store.settings.namespaces.splice(t,1)}}),i.appendChild(t)})}{const e=document.querySelector("#settings-ORES-alert-toggle");e.value=this.ws.store.settings.audio.ores_alert.enabled,e.addEventListener("change",t=>{this.ws.store.settings.audio.ores_alert.enabled=e.value});const t=document.querySelector("#settings-ORES-alert-threshold");t.value=this.ws.store.settings.audio.ores_alert.threshold,t.addEventListener("change",e=>{this.ws.store.settings.audio.ores_alert.threshold=+t.value});const n=document.querySelector("#settings-master-volume");n.value=this.ws.store.settings.audio.volume.master,n.addEventListener("change",e=>{this.ws.store.settings.audio.volume.master=+n.value});const s={sound:(e,t,n,s,i)=>{const a=["master",...t].join("."),r=document.createElement("volume-control");r.setAttribute("title",n),r.setAttribute("description",s),i&&r.setPreview(this.ws.audio,t),r.value=this.ws.store.settings.audio.volume[a],r.addEventListener("change",()=>{const e=this.ws.store.settings.audio.volume[a];this.ws.store.settings.audio.volume[a]=r.value,e!==r.value&&this.ws.audio.onvolumechanged()}),e.appendChild(r)},category:(e,t,n,s)=>{const i=["master",...t].join("."),a=this.collapsible(e,e=>n,s,!0),r=document.createElement("volume-control");r.setAttribute("title","Category Volume"),r.value=this.ws.store.settings.audio.volume[i],r.addEventListener("change",()=>{const e=this.ws.store.settings.audio.volume[i];this.ws.store.settings.audio.volume[i]=r.value,e!==r.value&&this.ws.audio.onvolumechanged()}),a.appendChild(r);const o=document.createElement("div");return o.className="settings-content",a.appendChild(o),o}},i=(e,t,n)=>{for(const[r,o]of Object.entries(e))switch(o.type){case"sound":var a;s.sound(n,[...t,r],o.title,o.description,null===(a=o.preview)||void 0===a||a);break;case"category":i(o.properties,[...t,r],s.category(n,[...t,r],o.title,o.description))}};i(this.ws.audio.audio,[],document.querySelector("#settings-sounds-container"))}{const e=document.querySelector("#repeat-control-scripts-toggle");e.value=this.ws.store.settings.repeat_control_scripts,e.addEventListener("change",t=>this.ws.store.settings.repeat_control_scripts=e.value),document.querySelector("#settings-new-control-script").addEventListener("click",async()=>{this.ws.store.control_scripts.unshift({keys:[],actions:[]}),this.controls()})}{const e=document.querySelector("#settings-zen-mode");e.value=this.ws.store.settings.zen_mode.enabled,e.addEventListener("change",t=>{this.ws.store.settings.zen_mode.enabled=e.value,this.ws.gui.updateZenMode()});const t=document.querySelector("#settings-zen-mode-sound");t.value=this.ws.store.settings.zen_mode.sound.enabled,t.addEventListener("change",e=>{this.ws.store.settings.zen_mode.sound.enabled=t.value,this.ws.gui.updateZenMode()});const n=document.querySelector("#settings-zen-mode-music");n.value=this.ws.store.settings.zen_mode.music.enabled,n.addEventListener("change",e=>{this.ws.store.settings.zen_mode.music.enabled=n.value,this.ws.gui.updateZenMode()});const s=document.querySelector("#settings-zen-mode-alerts");s.value=this.ws.store.settings.zen_mode.alerts.enabled,s.addEventListener("change",e=>{this.ws.store.settings.zen_mode.alerts.enabled=s.value,this.ws.gui.updateZenMode()});const i=document.querySelector("#settings-zen-mode-messages");i.value=this.ws.store.settings.zen_mode.messages.enabled,i.addEventListener("change",e=>{this.ws.store.settings.zen_mode.messages.enabled=i.value,this.ws.gui.updateZenMode()});const a=document.querySelector("#settings-zen-mode-toasts");a.value=this.ws.store.settings.zen_mode.toasts.enabled,a.addEventListener("change",e=>{this.ws.store.settings.zen_mode.toasts.enabled=a.value,this.ws.gui.updateZenMode()});const r=document.querySelector("#settings-zen-mode-badges");r.value=this.ws.store.settings.zen_mode.badges.enabled,r.addEventListener("change",e=>{this.ws.store.settings.zen_mode.badges.enabled=r.value,this.ws.gui.updateZenMode()})}if(!window.isElectron){const e=document.querySelector("#settings-launch-behavior");document.querySelectorAll("#settings-launch-behavior .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-launch-behavior [data-value=${electron.localStorage.get("WikiShield:OpenExternally")?"new_tab":"current_tab"}]`).classList.add("selected");const t=e.querySelector("[data-value=current_tab]");t.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),t.classList.add("selected"),electron.localStorage.set("WikiShield:OpenExternally",!1)});const n=e.querySelector("[data-value=new_tab]");n.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"),electron.localStorage.set("WikiShield:OpenExternally",!0)})}{const e=document.querySelector("#settings-startup-performance");document.querySelectorAll("#settings-startup-performance .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected");const t=e.querySelector("[data-value=always_off]");t.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),t.classList.add("selected"),this.ws.store.settings.performance.startup="always_off"});const n=e.querySelector("[data-value=adaptive]");n.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"),this.ws.store.settings.performance.startup="adaptive"});const s=e.querySelector("[data-value=always_on]");s.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),s.classList.add("selected"),this.ws.store.settings.performance.startup="always_on"})}{const e=document.querySelector("#settings-queues");o.Queue.types.map(e=>({type:e,data:this.ws.store.settings.queue[e]})).sort((e,t)=>e.data.order-t.data.order).forEach(t=>{var n;const s=document.createElement("draggable-order-item");s.setAttribute("key",t.type),s.setAttribute("name",null!==(n={recent:"Recent changes",pending:"Pending changes",users:"User creations",watchlist:"Watchlist",abuselog:"Abuse log"}[t.type])&&void 0!==n?n:t.type),s.enabled=t.data.enabled,e.addItem(s,t.type)}),e.addEventListener("toggle",e=>{var t;const n=null===(t=e.target.closest("draggable-order-item"))||void 0===t?void 0:t.getAttribute("key");n&&(this.ws.store.settings.queue[n].enabled=e.detail.enabled,this.ws.gui.reorderQueues())}),e.addEventListener("reorder",e=>{e.detail.keys.forEach((e,t)=>{this.ws.store.settings.queue[e].order=t,this.ws.gui.reorderQueues()})});const t=document.querySelector("#settings-palette-selector");Object.entries(g.GUI.palettes).forEach(([e,n])=>{const s=document.createElement("div");s.className="palette-option",s.classList.toggle("selected",this.ws.store.UI.theme.palette===e),s.dataset.palette=e,s.addEventListener("click",()=>{document.querySelectorAll(".palette-option.selected").forEach(e=>e.classList.remove("selected")),s.classList.add("selected"),this.ws.store.UI.theme.palette=e,this.ws.gui.updatePalette()}),t.appendChild(s);const i=document.createElement("div");i.className="palette-name",i.textContent=new p.Text(e).case(p.Text.Case.Title).get(),s.appendChild(i);const a=document.createElement("div");a.className="palette-preview",s.appendChild(a);const r=n.length,o=document.createElement("canvas");o.width=r,o.height=1;const l=o.getContext("2d"),d=l.createImageData(r,1);n.forEach((e,t)=>{const n=e.match(/\d+/g).map(e=>parseInt(e,10)),s=4*t;d.data[s]=n[0],d.data[s+1]=n[1],d.data[s+2]=n[2],d.data[s+3]=255}),l.putImageData(d,0,0),a.appendChild(o)})}{const e=document.querySelector("#settings-dyslexia-font");e.value=this.ws.store.settings.accessibility.dyslexia,e.addEventListener("change",t=>{this.ws.store.settings.accessibility.dyslexia=e.value,this.ws.gui.updateAccessibility()});const t=document.querySelector("#settings-reduce-motion");t.value=this.ws.store.settings.accessibility.reduce_motion,t.addEventListener("change",e=>{this.ws.store.settings.accessibility.reduce_motion=t.value,this.ws.gui.updateAccessibility()})}{const e=document.querySelector("#settings-AI-toggle");e.value=this.ws.store.settings.AI.enabled,e.addEventListener("change",t=>{var n;if(null===(n=this.ws.AI)||void 0===n||n.cancel.all(!0),this.ws.store.settings.AI.enabled=e.value,this.ws.store.settings.AI.enabled)if("Ollama"===this.ws.store.settings.AI.provider)this.ws.AI=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);else this.ws.AI=null;else this.ws.AI=null});const t=document.querySelector("#settings-AI-edit-analysis-toggle");t.value=this.ws.store.settings.AI.edit_analysis.enabled,t.addEventListener("change",e=>this.ws.store.settings.AI.edit_analysis.enabled=e.target.value);const n=document.querySelector("#settings-AI-username-analysis-toggle");n.value=this.ws.store.settings.AI.username_analysis.enabled,n.addEventListener("change",e=>this.ws.store.settings.AI.username_analysis.enabled=e.target.value);const i=document.querySelector("#ollama-url-input");i.value=this.ws.store.settings.AI.Ollama.server,i.addEventListener("change",e=>{this.ws.store.settings.AI.Ollama.server=i.value.trim(),"Ollama"===this.ws.store.settings.AI.provider&&this.ws.AI&&this.ws.AI.cancel.all(!0)});const a=document.querySelector("#settings-ollama-test-connection");a.addEventListener("click",async()=>{var e;if(a.disabled)return;a.disabled=!0;const t=document.querySelector("#settings-ollama-connection-status"),n=t.parentElement;let i;if(n.classList.add("testing"),n.classList.remove("connected","failed"),t.classList.add("animate-loading-dots"),t.textContent="Testing connection","Ollama"===this.ws.store.settings.AI.provider)i=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);null===(e=this.ws.AI)||void 0===e||e.cancel.all(!0),i instanceof s.AI&&await i.test()?(n.classList.add("connected"),n.classList.remove("testing","failed"),t.innerHTML="<span class='fa fa-check-circle'></span> Connected!"):(n.classList.add("failed"),n.classList.remove("testing","connected"),t.innerHTML="<span class='fa fa-times-circle'></span> Failed to connect.<br><small>Make sure you have followed the setup instructions (see below)</small>"),t.classList.remove("animate-loading-dots"),a.disabled=!1});const r=document.querySelector("#settings-ollama-refresh-models");r.addEventListener("click",async()=>{var e;if(r.disabled)return;r.disabled=!0;const t=document.querySelector("#settings-ollama-models"),n=document.querySelector("#settings-ollama-models-status"),i=n.parentElement;n.textContent="Searching",i.classList.add("searching","animate-loading-dots"),i.classList.remove("none","error"),null===(e=this.ws.AI)||void 0===e||e.cancel.all(!0);try{let e;if("Ollama"===this.ws.store.settings.AI.provider)e=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);const a=e instanceof s.AI&&await e.models()||[];a.length>0?(i.classList.remove("searching","none","error","animate-loading-dots"),n.innerHTML=`<span class="fa fa-check-circle"></span> Found ${a.length} ${new p.Text("model").get(a.length)}.`,t.innerHTML="",a.forEach(e=>{const n=e.name===this.ws.store.settings.AI.Ollama.model,s=document.createElement("div");s.className="model",s.classList.toggle("selected",n),s.dataset.model=e.name,t.appendChild(s);const i=document.createElement("div");i.className="model-top",s.appendChild(i);const a=document.createElement("span");a.className="indicator fa",a.classList.add(n?"fa-check-circle":"fa-circle"),i.appendChild(a);const r=document.createElement("span");r.className="model-name",r.textContent=e.name,i.appendChild(r);const o=document.createElement("span");o.className="psuedo-indicator fa fa-circle",i.appendChild(o);const l=document.createElement("div");l.className="model-bottom",s.appendChild(l);const d=document.createElement("span");d.className="model-size",d.textContent=this.ws.util.formatBytes(e.size),l.appendChild(d);const c=document.createElement("span");c.className="model-modified",c.textContent=new Date(e.modified_at).toLocaleDateString(),l.appendChild(c),s.addEventListener("click",()=>{var n;if(null===(n=this.ws.AI)||void 0===n||n.cancel.all(!0),"Ollama"===this.ws.store.settings.AI.provider)this.ws.store.settings.AI.Ollama.model=e.name;t.querySelectorAll(".model.selected").forEach(e=>{e.classList.remove("selected");const t=e.querySelector(".indicator");t.classList.remove("fa-circle"),t.classList.add("fa-check-circle")}),s.classList.add("selected");const i=s.querySelector(".indicator");i.classList.remove("fa-circle"),i.classList.add("fa-check-circle")})})):(i.classList.add("none"),i.classList.remove("searching","error","animate-loading-dots"),n.textContent="No models found.")}catch(e){i.classList.add("error"),i.classList.remove("searching","none","animate-loading-dots"),n.innerHTML="<span class='fa fa-times-circle'></span> Error fetching models."}r.disabled=!1})}{const e=document.querySelector("#settings-auto-reporting-toggle");e.value=this.ws.store.settings.auto_report.enabled,e.addEventListener("change",t=>{this.ws.store.settings.auto_report.enabled=e.value});const t=document.querySelector("#settings-auto-reporting-warnings-container");Object.entries(c.warningsLookup).filter(([e,t])=>t.reportable).sort((e,t)=>e[1].title.localeCompare(t[1].title)).forEach(([e,n])=>{const s=document.createElement("div");s.className="auto-reportable-warning-item",s.innerHTML=`\n\t\t\t\t\t\t<label class="checkbox-box" data-warning-key="${e}">\n\t\t\t\t\t\t\t<input type="checkbox" autoComplete="off" ${this.ws.store.settings.auto_report.for.has(e)?"checked":""}>\n\t\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<span class="checkbox-name">${n.title}</span>\n\t\t\t\t\t`,s.querySelector("input[type=checkbox]").addEventListener("change",t=>{t.target.checked?this.ws.store.settings.auto_report.for.has(e)||this.ws.store.settings.auto_report.for.add(e):this.ws.store.settings.auto_report.for.delete(e)}),t.appendChild(s)})}{const e=document.querySelector("#settings-auto-welcome-toggle");e.value=this.ws.store.settings.auto_welcome.enabled,e.addEventListener("change",t=>{this.ws.store.settings.auto_welcome.enabled=e.value});const t=document.querySelector("#settings-wikipedia-popups-toggle");t.value=this.ws.store.settings.wikipedia_popups.enabled,t.addEventListener("change",e=>{this.ws.store.settings.wikipedia_popups.enabled=t.value});const n=document.querySelector("#talk-page-thanks-for-temporary-users-toggle");n.value=this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled,n.addEventListener("change",e=>{this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled=n.value});const s=document.querySelector("#settings-username-highlighting-toggle");s.value=this.ws.store.settings.username_highlighting.enabled,s.addEventListener("change",e=>{this.ws.store.settings.username_highlighting.enabled=s.value});const i=document.querySelector("#settings-username-highlighting-fuzzy-toggle");i.value=this.ws.store.settings.username_highlighting.fuzzy,i.addEventListener("change",e=>{this.ws.store.settings.username_highlighting.fuzzy=i.value})}{const e=document.querySelector("#settings-save-status");document.querySelector("#settings-export-button").addEventListener("click",async t=>{try{const t=this.ws.export();await electron.copyToClipboard(t),e.classList.remove("hidden","error","info"),e.classList.add("success"),e.innerHTML='\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings exported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">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'}catch(t){e.classList.remove("hidden","success","info"),e.classList.add("error"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Export failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${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`}});document.querySelector("#settings-import-button").addEventListener("click",async t=>{try{const t=await this.ws.gui.dialog.input("Import Settings","Please paste the base64 string of your exported settings below:");if(!t)throw new Error("No input provided.");const n=await this.ws.noinit(t),[s,i]=n.reduce((e,t)=>(t.expected?e[0].push(t):e[1].push(t),e),[[],[]]);e.classList.remove("hidden","error","info"),e.classList.add("success"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings imported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">\n\t\t\t\t\t\t\t\t\t${i.length>0?`<br><br><strong>Encountered ${new p.Text("%n issue").get(i.length)}:</strong><br>${i.map(e=>`- ${e.message}`).join("<br>")}`:""}\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`}catch(t){e.classList.remove("hidden","success","info"),e.classList.add("error"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Import failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${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`}});document.querySelector("#settings-reset-button").addEventListener("click",async t=>{await this.ws.gui.dialog.confirm("Reset Settings","Are you sure you want to reset all settings to their default values? This action cannot be undone.","Reset Settings",!0)&&(this.ws.noinit("e30="),e.classList.remove("hidden","error","success"),e.classList.add("info"),e.innerHTML='\n\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t<i class="fa fa-info-circle status-icon"></i>\n\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t<div class="status-title">Settings reset successfully.</div>\n\t\t\t\t\t\t\t<div class="status-desc">All settings have been restored to their default values.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t')})}document.querySelectorAll("#settings-container > .settings > .settings-right > .about [data-link]").forEach(e=>{e.addEventListener("click",t=>this.ws.open(e.dataset.link,t.altKey))})}update(){document.querySelector("#settings-maximum-edit-count").value=this.ws.store.settings.queue.max_edits,document.querySelector("#settings-maximum-queue-size").value=this.ws.store.settings.queue.max_size,document.querySelector("#settings-minimum-ores-score").value=this.ws.store.settings.queue.min_ores,document.querySelector("#settings-watchlist-expiry").value=this.ws.store.settings.expiry.watchlist,document.querySelectorAll("#settings-namespaces-container .namespace-item").forEach(e=>{const t=parseInt(e.dataset.namespaceId,10);e.querySelector("input[type=checkbox]").checked=this.ws.store.settings.namespaces.includes(t)}),document.querySelector("#settings-zen-mode").value=this.ws.store.settings.zen_mode.enabled,document.querySelector("#settings-zen-mode-sound").value=this.ws.store.settings.zen_mode.sound.enabled,document.querySelector("#settings-zen-mode-music").value=this.ws.store.settings.zen_mode.music.enabled,document.querySelector("#settings-zen-mode-alerts").value=this.ws.store.settings.zen_mode.alerts.enabled,document.querySelector("#settings-zen-mode-messages").value=this.ws.store.settings.zen_mode.messages.enabled,document.querySelector("#settings-zen-mode-toasts").value=this.ws.store.settings.zen_mode.toasts.enabled,document.querySelector("#settings-zen-mode-badges").value=this.ws.store.settings.zen_mode.badges.enabled,document.querySelectorAll("#settings-startup-performance .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected");{const e=document.querySelector("#settings-queues");e.clearItems(),o.Queue.types.map(e=>({type:e,data:this.ws.store.settings.queue[e]})).sort((e,t)=>e.data.order-t.data.order).forEach(t=>{var n;const s=document.createElement("draggable-order-item");s.setAttribute("key",t.type),s.setAttribute("name",null!==(n={recent:"Recent changes",pending:"Pending changes",users:"User creations",watchlist:"Watchlist"}[t.type])&&void 0!==n?n:t.type),s.enabled=t.data.enabled,e.addItem(s,t.type)}),document.querySelectorAll(".palette-option").forEach(e=>{e.classList.toggle("selected",e.dataset.palette===this.ws.store.UI.theme.palette)})}document.querySelector("#settings-AI-toggle").value=this.ws.store.settings.AI.enabled,document.querySelector("#settings-AI-edit-analysis-toggle").value=this.ws.store.settings.AI.edit_analysis.enabled,document.querySelector("#settings-AI-username-analysis-toggle").value=this.ws.store.settings.AI.username_analysis.enabled,document.querySelector("#ollama-url-input").value=this.ws.store.settings.AI.Ollama.server;{const e=document.querySelector("#settings-ollama-connection-status"),t=e.parentElement;e.innerHTML="",t.classList.remove("testing","connected","failed")}{document.querySelector("#settings-ollama-models").querySelectorAll(".model").forEach(e=>e.remove());const e=document.querySelector("#settings-ollama-models-status"),t=e.parentElement;e.innerHTML="",t.classList.remove("searching","none","error")}document.querySelector("#settings-auto-reporting-toggle").value=this.ws.store.settings.auto_report.enabled,document.querySelectorAll("#settings-auto-reporting-warnings-container .auto-reportable-warning-item").forEach(e=>{const t=e.querySelector("label").dataset.warningKey;e.querySelector("input[type=checkbox]").checked=this.ws.store.settings.auto_report.for.has(t)}),document.querySelector("#settings-auto-welcome-toggle").value=this.ws.store.settings.auto_welcome.enabled,document.querySelector("#settings-wikipedia-popups-toggle").value=this.ws.store.settings.wikipedia_popups.enabled,document.querySelector("#settings-username-highlighting-toggle").value=this.ws.store.settings.username_highlighting.enabled,document.querySelector("#settings-username-highlighting-fuzzy-toggle").value=this.ws.store.settings.username_highlighting.fuzzy}open(){document.querySelector("#settings-container").classList.add("show"),this.general(),m(y,this,new Promise(e=>{m(w,this,e)}))}close(){this.deselect(),this.ws.audio.stopPreviews(),document.querySelector("#settings-container").classList.remove("show"),v(w,this)&&(v(w,this).call(this),m(w,this,null))}waitForClose(){return v(y,this)}deselect(){document.querySelectorAll("#settings-container > .settings > .settings-left .settings-left-menu-item.selected").forEach(e=>e.classList.remove("selected")),document.querySelectorAll("#settings-container > .settings > .settings-right > :not(.hidden)").forEach(e=>e.classList.add("hidden"))}general(){this.deselect(),document.querySelector("#settings-general-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .general").classList.remove("hidden")}performance(){this.deselect(),document.querySelector("#settings-performance-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .performance").classList.remove("hidden")}audio(){this.deselect(),document.querySelector("#settings-audio-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .audio").classList.remove("hidden")}controls(){this.deselect(),document.querySelector("#settings-controls-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .controls").classList.remove("hidden");{const e=(t,n)=>{if(n.actions.includes(t))return n;for(const s of n.actions)if("if"===s.name||"if not"===s.name){const n=e(t,s);if(n)return n}return null},t=(n,s,a,o)=>{const l=document.createElement("div");if(l.className="control-action",n.appendChild(l),"if"===s.name||"if not"===s.name){var d,c,p;l.innerHTML=`\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t\t\t${"if"===s.name?"If":"If not"} <select></select> <span class="params"></span> then:\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;const e=l.querySelector("select");Object.entries(i.conditions).forEach(([t,n])=>{e.innerHTML+="title"in n?`<option value="${t}">${n.title}</option>`:`<option value="${t}">${t}</option>`});const n=null!==(d=s.condition)&&void 0!==d?d:{name:Object.keys(i.conditions)[0],params:{}};null!==(c=n.name)&&void 0!==c||(n.name=Object.keys(i.conditions)[0]),null!==(p=n.params)&&void 0!==p||(n.params={}),e.value=n.name,e.addEventListener("change",t=>{n.name=e.value,o()});const r=new Map;for(const e of(0,u.sortDependencies)((null===(g=(h=i.conditions[n.name]).parameters)||void 0===g?void 0:g.call(h))||[])){var g,h;const t=document.createElement("div");t.className="condition-parameter",l.querySelector(".params").appendChild(t);const s={};for(const t of null!==(m=e.dependencies)&&void 0!==m?m:[]){var m;s[t]=n.params[t]}const i="function"==typeof e.default?e.default(s):e.default;let a=null;switch(e.type){case"choice":{const o=document.createElement("select");o.dataset.paramid=e.id,t.appendChild(o);const l="function"==typeof e.options?e.options(s):e.options;for(const e of null!=l?l:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(void 0!==n.params[e.id]){o.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(o.value=i,n.params[e.id]=i);a=()=>{const t={};for(const i of null!==(s=e.dependencies)&&void 0!==s?s:[]){var s;t[i]=n.params[i]}const i=o.value,a="function"==typeof e.options?e.options(t):e.options;o.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(a.includes(i))o.value=i;else{const s="function"==typeof e.default?e.default(t):e.default;o.value=s,n.params[e.id]=s}},o.addEventListener("change",()=>{n.params[e.id]=o.value;for(const t of r.get(e.id)||[])t()})}break;case"text":{const s=document.createElement("input");if(s.type="text",s.dataset.paramid=e.id,t.appendChild(s),void 0!==n.params[e.id]){s.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.value=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=s.value;for(const t of r.get(e.id)||[])t()})}break;case"boolean":{const s=document.createElement("input");if(s.type="checkbox",s.dataset.paramid=e.id,t.appendChild(s),void 0!==n.params[e.id]){s.checked=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.checked=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=s.checked;for(const t of r.get(e.id)||[])t()})}break;case"number":{const s=document.createElement("input");if(s.type="number",s.dataset.paramid=e.id,"min"in e&&(s.min=e.min),"max"in e&&(s.max=e.max),t.appendChild(s),void 0!==n.params[e.id]){s.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.value=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=parseFloat(s.value);for(const t of r.get(e.id)||[])t()})}}if("function"==typeof a)for(const t of null!==(v=e.dependencies)&&void 0!==v?v:[]){var v;r.has(t)||r.set(t,[]),r.get(t).push(a)}}for(const e of s.actions)t(l,e,a,o)}else{const e=r.events[s.name];l.innerHTML=`\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="${"icon"in e?e.icon:"fas fa-bolt"}"></span>\n\t\t\t\t\t\t\t\t${"title"in e?e.title:s.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;const t=new Map;for(const n of(0,u.sortDependencies)((null===(f=e.parameters)||void 0===f?void 0:f.call(e))||[])){var f;const e=document.createElement("div");e.className="action-parameter",e.innerHTML=`<div class="parameter-title">${n.title}</div>`,l.appendChild(e);const i={};for(const e of null!==(b=n.dependencies)&&void 0!==b?b:[]){var b;i[e]=s.params[e]}const a="function"==typeof n.default?n.default(i):n.default;let r=null;switch(n.type){case"choice":{const o=document.createElement("select");o.dataset.paramid=n.id,e.appendChild(o);const l="function"==typeof n.options?n.options(i):n.options;for(const e of null!=l?l:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(void 0!==s.params[n.id]){o.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(o.value=a,s.params[n.id]=a);r=()=>{const e={};for(const i of null!==(t=n.dependencies)&&void 0!==t?t:[]){var t;e[i]=s.params[i]}const i=o.value,a="function"==typeof n.options?n.options(e):n.options;o.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(a.includes(i))o.value=i;else{const t="function"==typeof n.default?n.default(e):n.default;o.value=t,s.params[n.id]=t}},o.addEventListener("change",()=>{s.params[n.id]=o.value;for(const e of t.get(n.id)||[])e()})}break;case"text":{const i=document.createElement("input");if(i.type="text",i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.value=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.value;for(const e of t.get(n.id)||[])e()})}break;case"boolean":{const i=document.createElement("input");if(i.type="checkbox",i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.checked=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.checked=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.checked;for(const e of t.get(n.id)||[])e()})}break;case"duration":{const i=document.createElement("duration-input");if(i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.value=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.value;for(const e of t.get(n.id)||[])e()})}}if("function"==typeof r)for(const e of null!==(w=n.dependencies)&&void 0!==w?w:[]){var w;t.has(e)||t.set(e,[]),t.get(e).push(r)}}}l.querySelector(".move-action-up").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]);const t=e(s,a),n=t.actions.indexOf(s);if(0===t.actions.indexOf(s)){if("if"!==t.name&&"if not"!==t.name)return;const i=e(t,a);i.actions.splice(i.actions.indexOf(t),0,s),t.actions.splice(n,1)}else{const e=t.actions[n-1];"if"===e.name||"if not"===e.name?(e.actions.push(s),t.actions.splice(n,1)):(t.actions.splice(n,1),t.actions.splice(n-1,0,s))}o()}),l.querySelector(".move-action-down").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]);const t=e(s,a),n=t.actions.indexOf(s);if(t.actions.indexOf(s)===t.actions.length-1){if("if"!==t.name&&"if not"!==t.name)return;const i=e(t,a);i.actions.splice(i.actions.indexOf(t)+1,0,s),t.actions.splice(n,1)}else{const e=t.actions[n+1];"if"===e.name||"if not"===e.name?(e.actions.unshift(s),t.actions.splice(n,1)):(t.actions.splice(n,1),t.actions.splice(n+1,0,s))}o()}),l.querySelector(".delete-action").addEventListener("click",async t=>{if(this.ws.audio.playSound(["ui","click"]),t.shiftKey||await this.ws.gui.dialog.confirm("Delete Action","Are you sure you want to delete this action?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>",null,!0)){const t=e(s,a);t.actions.splice(t.actions.indexOf(s),1),o()}})},n=()=>{const e=new Set,t=new Set;this.ws.store.control_scripts.forEach(n=>{n.keys.forEach(n=>{e.has(n)?t.add(n):e.add(n)})}),document.querySelectorAll(".control-keys div[data-key]").forEach(e=>{e.classList.toggle("duplicate",t.has(e.dataset.key))})},s=(e,o)=>{e.innerHTML='\n\t\t\t\t\t<div class="control-container">\n\t\t\t\t\t\t<div class="control-container-title">When these keys are pressed</div>\n\t\t\t\t\t\t<div class="control-keys"></div>\n\t\t\t\t\t\t<div class="control-container-title margin-top">Complete these actions</div>\n\t\t\t\t\t\t<div class="control-actions"></div>\n\t\t\t\t\t</div>\n\t\t\t\t';const l=e.querySelector(".control-keys");for(const t of o.keys){const i=document.createElement("div");i.dataset.key=t,i.innerHTML=`\n\t\t\t\t\t\t<span class="key-elem-title">${" "===t?"space":t}</span>\n\t\t\t\t\t\t<span class="fas fa-trash-can remove"></span>\n\t\t\t\t\t`,l.appendChild(i),i.querySelector(".remove").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),o.keys.splice(o.keys.indexOf(t),1),s(e,o),n()})}const d=document.createElement("div");d.className="add",d.innerHTML='<span class="fas fa-plus"></span>',l.appendChild(d),d.addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),document.querySelectorAll(".key-select").forEach(e=>e.remove());const t=document.createElement("div");t.className="key-select animate-loading-dots",t.textContent="Press a key",l.insertBefore(t,d);const i=()=>{t.remove(),m(b,this,null)};t.addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),i()}),m(b,this,(r,l,d)=>{if("escape"===r)i();else if(l){if(!(0,a.validateShortcut)(r))return i(),void this.ws.gui.dialog.toast("Invalid Key","The key you pressed is not a valid shortcut key.","error");o.keys.includes(r)||o.keys.push(r),i(),s(e,o),n()}else t.textContent=r||"Press a key"})});const c=e.querySelector(".control-actions");for(const e of o.actions)t(c,e,o,()=>{this.controls()});const u=document.createElement("div");u.className="control-bottom-container",u.innerHTML='\n\t\t\t\t\t<div class="add-action-button"></div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<button class="add-action-button control-delete" style="--background: 211, 51, 51;">Delete</button>\n\t\t\t\t\t</div>\n\t\t\t\t',c.appendChild(u),u.querySelector(".control-delete").addEventListener("click",async e=>{this.ws.audio.playSound(["ui","click"]),(e.shiftKey||await this.ws.gui.dialog.confirm("Delete Control Script","Are you sure you want to delete this control script? This action cannot be undone?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>",null,!0))&&(this.ws.store.control_scripts.splice(this.ws.store.control_scripts.indexOf(o),1),this.controls())});const p=()=>{const t=u.querySelector(".add-action-button");t.innerHTML='<button class="add-action-button new-button"><span class="fa fa-plus"></span> Add Action</button>',t.querySelector(".new-button").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),t.innerHTML='\n\t\t\t\t\t\t\t<select style="height: 35px;"></select>\n\t\t\t\t\t\t\t<button class="add-action-button cancel-button" style="margin-left: 10px;">Cancel</button>\n\t\t\t\t\t\t\t<button class="add-action-button create-button" style="margin-left: 10px;">Create</button>\n\t\t\t\t\t\t';const n=t.querySelector("select");n.innerHTML+='<option value="if">If Condition</option>',n.innerHTML+='<option value="if not">If Not Condition</option>',Object.entries(r.events).forEach(([e,t])=>{n.innerHTML+="title"in t?`<option value="${e}">${t.title}</option>`:`<option value="${e}">${e}</option>`}),t.querySelector(".cancel-button").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),p()}),t.querySelector(".create-button").addEventListener("click",()=>{if(this.ws.audio.playSound(["ui","click"]),"if"===n.value||"if not"===n.value||n.value in r.events){const t={name:n.value,params:{}};"if"!==n.value&&"if not"!==n.value||(t.condition={name:Object.keys(i.conditions)[0]},t.actions=[]),o.actions.push(t),s(e,o)}})})};p()},o=document.querySelector("#settings-container > .settings > .settings-right > .controls");o.querySelectorAll(".control-script-item").forEach(e=>e.remove());for(const e of this.ws.store.control_scripts){const t=document.createElement("div");t.className="settings-section control-script-item",o.appendChild(t),s(t,e)}n()}}zen(){this.deselect(),document.querySelector("#settings-zen-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .zen").classList.remove("hidden")}app(){this.deselect(),document.querySelector("#settings-app-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .app").classList.remove("hidden")}queue(){this.deselect(),document.querySelector("#settings-queue-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .queue").classList.remove("hidden")}accessibility(){this.deselect(),document.querySelector("#settings-accessibility-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .accessibility").classList.remove("hidden")}AI(){this.deselect(),document.querySelector("#settings-AI-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .AI").classList.remove("hidden")}autoReporting(){this.deselect(),document.querySelector("#settings-auto-reporting-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .auto-reporting").classList.remove("hidden")}gadgets(){this.deselect(),document.querySelector("#settings-gadgets-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .gadgets").classList.remove("hidden")}whitelist(e){this.deselect(),document.querySelector(`#settings-whitelist-${e}s-button`).classList.add("selected"),document.querySelector(`#settings-container > .settings > .settings-right > .whitelist.${e}s`).classList.remove("hidden");{const t=document.querySelector(`#settings-whitelist-${e}s-expiry`);t.value=this.ws.store.settings.expiry.whitelist[`${e}s`],t.addEventListener("change",t=>this.ws.store.settings.expiry.whitelist[`${e}s`]=t.target.value);const n=document.querySelector(`#settings-whitelist-${e}s-input`),s=()=>{const t=n.value.trim();t&&(n.value="",this.ws.store.whitelist[`${e}s`].set(t,[Date.now(),this.ws.util.expiryToDate(this.ws.store.settings.expiry.whitelist[`${e}s`]).valueOf()]),this.ws.store.statistics.items_whitelisted.total++,this.ws.store.statistics.items_whitelisted[`${e}s`]++,this.ws.gui.renderQueue(),this.whitelist(e))};if("tag"===e&&this.wikipediaTags){const e=this.wikipediaTags.map(e=>e.name).sort();for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.appendChild(e)}n.setAttribute("list",n.id+"-datalist");const t=document.createElement("datalist");t.id=n.id+"-datalist",n.parentElement.appendChild(t);for(const n of e){const e=document.createElement("option");e.value=n,t.appendChild(e)}}document.querySelector(`#settings-whitelist-${e}s-add-button`).addEventListener("click",s),n.addEventListener("keydown",e=>{"Enter"===e.key&&(s(),e.preventDefault())})}{const t=document.querySelector(`#settings-whitelist-${e}s-list`);t.innerHTML="";const n=t=>{switch(e){case"user":return this.ws.page(`Special:Contributions/${t}`);case"page":return this.ws.page(t);case"tag":return this.ws.page(`Special:Tags/${t}`)}},s=[...this.ws.store.whitelist[`${e}s`]].sort((e,t)=>t[1][1]-e[1][1]);for(const[i,a]of s){const s=document.createElement("div"),r=new Date(a[0]),o=a[1]===1/0?"Never":`${new Date(a[1]).toLocaleDateString()} ${new Date(a[1]).toLocaleTimeString()}`;s.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${n(i)}">${i}</a>\n\t\t\t\t\t\t<span>Added: ${r.toLocaleDateString()} ${r.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now()>a[1]?"expired":""}">\n\t\t\t\t\t\t\t${Date.now()>a[1]?"Expired":"Expires"}: ${o}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from whitelisted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`,s.querySelector(".remove-button").addEventListener("click",()=>{this.ws.store.whitelist[`${e}s`].delete(i),this.ws.gui.renderQueue(),this.whitelist(e)}),t.appendChild(s)}0===s.length&&(t.innerHTML=`<div class="empty">No whitelisted ${e}s.</div>`)}}highlight(e){this.deselect(),document.querySelector(`#settings-highlight-${e}s-button`).classList.add("selected"),document.querySelector(`#settings-container > .settings > .settings-right > .highlight.${e}s`).classList.remove("hidden");{const t=document.querySelector(`#settings-highlight-${e}s-expiry`);t.value=this.ws.store.settings.expiry.highlight[`${e}s`],t.addEventListener("change",t=>this.ws.store.settings.expiry.highlight[`${e}s`]=t.target.value);const n=document.querySelector(`#settings-highlight-${e}s-input`),s=()=>{const t=n.value.trim();t&&(n.value="",this.ws.store.highlight[`${e}s`].set(t,[Date.now(),this.ws.util.expiryToDate(this.ws.store.settings.expiry.highlight[`${e}s`]).valueOf()]),this.ws.store.statistics.items_highlighted.total++,this.ws.store.statistics.items_highlighted[`${e}s`]++,this.ws.gui.renderQueue(),this.highlight(e))};if("tag"===e&&this.wikipediaTags){const e=this.wikipediaTags.map(e=>e.name).sort();for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.appendChild(e)}n.setAttribute("list",n.id+"-datalist");const t=document.createElement("datalist");t.id=n.id+"-datalist",n.parentElement.appendChild(t);for(const n of e){const e=document.createElement("option");e.value=n,t.appendChild(e)}}document.querySelector(`#settings-highlight-${e}s-add-button`).addEventListener("click",s),n.addEventListener("keydown",e=>{"Enter"===e.key&&(s(),e.preventDefault())})}{const t=document.querySelector(`#settings-highlight-${e}s-list`);t.innerHTML="";const n=t=>{switch(e){case"user":return this.ws.page(`Special:Contributions/${t}`);case"page":return this.ws.page(t);case"tag":return this.ws.page(`Special:Tags/${t}`)}},s=[...this.ws.store.highlight[`${e}s`]].sort((e,t)=>t[1][1]-e[1][1]);for(const[i,a]of s){const s=document.createElement("div"),r=new Date(a[0]),o=a[1]===1/0?"Never":`${new Date(a[1]).toLocaleDateString()} ${new Date(a[1]).toLocaleTimeString()}`;s.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${n(i)}">${i}</a>\n\t\t\t\t\t\t<span>Added: ${r.toLocaleDateString()} ${r.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now()>a[1]?"expired":""}">\n\t\t\t\t\t\t\t${Date.now()>a[1]?"Expired":"Expires"}: ${o}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from highlighted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`,s.querySelector(".remove-button").addEventListener("click",()=>{this.ws.store.highlight[`${e}s`].delete(i),this.ws.gui.renderQueue(),this.highlight(e)}),t.appendChild(s)}0===s.length&&(t.innerHTML=`<div class="empty">No highlighted ${e}s.</div>`)}}statistics(){this.deselect(),document.querySelector("#settings-statistics-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .statistics").classList.remove("hidden");document.querySelector("#reset-statistics-button").addEventListener("click",async()=>{await this.ws.gui.dialog.confirm("Reset statistics","Are you sure you want to reset all statistics? This action cannot be undone.",void 0,!0)&&(this.ws.store.statistics={},this.ws.storage.load(this.ws.store),this.ws.time.load=performance.now(),this.statistics())});const e=this.ws.store.statistics;document.querySelector("#stats-total-reviewed").textContent=(e.edits_reviewed.total||0).toLocaleString();document.querySelector("#stats-thanks-percentage").textContent=(e.edits_reviewed.thanked/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-recent-changes-reviewed").textContent=(e.recent_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-recent-changes-percentage").textContent=(e.recent_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-reviewed").textContent=(e.pending_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-pending-changes-accepted").textContent=(e.pending_changes_reviewed.accepted||0).toLocaleString();document.querySelector("#stats-pending-changes-accepted-percentage").textContent=(e.pending_changes_reviewed.accepted/e.pending_changes_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-rejected").textContent=(e.pending_changes_reviewed.rejected||0).toLocaleString();document.querySelector("#stats-pending-changes-rejected-percentage").textContent=(e.pending_changes_reviewed.rejected/e.pending_changes_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-percentage").textContent=(e.pending_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-user-creations-reviewed").textContent=(e.users_reviewed.total||0).toLocaleString();document.querySelector("#stats-user-creations-percentage").textContent=(e.users_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-watchlist-changes-reviewed").textContent=(e.watchlist_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-watchlist-changes-percentage").textContent=(e.watchlist_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-abuselog-changes-reviewed").textContent=(e.abuselogs_reviewed.total||0).toLocaleString();document.querySelector("#stats-abuselog-changes-percentage").textContent=(e.abuselogs_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-reverts-made").textContent=(e.reverts_made.total||0).toLocaleString();document.querySelector("#stats-reverts-percentage").textContent=(e.reverts_made.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-goodfaith-reverts-percentage").textContent=(e.reverts_made.good_faith/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-recent-reverts-percentage").textContent=(e.reverts_made.from_recent_changes/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-pending-reverts-percentage").textContent=(e.reverts_made.from_pending_changes/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-watchlist-reverts-percentage").textContent=(e.reverts_made.from_watchlist/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-abuselog-reverts-percentage").textContent=(e.reverts_made.from_abuselogs/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-other-reverts-percentage").textContent=(e.reverts_made.from_loaded_edits/e.reverts_made.total*100||0).toFixed(2);{document.querySelector("#stats-users-welcomed").textContent=(e.users_welcomed.total||0).toLocaleString();const t=document.querySelector("#stats-users-welcomed-message");e.edits_reviewed.total===e.users_welcomed.total?t.textContent=`You welcome every user whose edit you review! (${e.users_welcomed.total.toLocaleString()})`:0===e.users_welcomed.total?t.innerHTML="For every Infinity edits you review, you still won&rsquo;t welcome a new user.":t.textContent=`For every ${(e.edits_reviewed.total/e.users_welcomed.total||0).toFixed(3)} edits you review, you welcome a new user.`}document.querySelector("#stats-warnings").textContent=(e.warnings_issued.total||0).toLocaleString();document.querySelector("#stats-warning-1-percentage").textContent=(e.warnings_issued.level_1/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-2-percentage").textContent=(e.warnings_issued.level_2/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-3-percentage").textContent=(e.warnings_issued.level_3/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-4-percentage").textContent=(e.warnings_issued.level_4/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-4im-percentage").textContent=(e.warnings_issued.level_4im/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-reports").textContent=(e.reports_filed.total||0).toLocaleString();document.querySelector("#stats-AIV-reports-percentage").textContent=(e.reports_filed.AIV/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-UAA-reports-percentage").textContent=(e.reports_filed.UAA/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-global-block-reports-percentage").textContent=(e.reports_filed.global_block/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-global-lock-reports-percentage").textContent=(e.reports_filed.global_lock/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-RFPP-reports-percentage").textContent=(e.reports_filed.RFPP/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-pages-watched").textContent=(e.watchlist.watched||0).toLocaleString();document.querySelector("#stats-pages-unwatched").textContent=(e.watchlist.unwatched||0).toLocaleString();document.querySelector("#stats-items-whitelisted").textContent=(e.items_whitelisted.total||0).toLocaleString();document.querySelector("#stats-users-whitelisted").textContent=(e.items_whitelisted.users||0).toLocaleString();document.querySelector("#stats-users-whitelisted-percentage").textContent=(e.items_whitelisted.users/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-pages-whitelisted").textContent=(e.items_whitelisted.pages||0).toLocaleString();document.querySelector("#stats-pages-whitelisted-percentage").textContent=(e.items_whitelisted.pages/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-tags-whitelisted").textContent=(e.items_whitelisted.tags||0).toLocaleString();document.querySelector("#stats-tags-whitelisted-percentage").textContent=(e.items_whitelisted.tags/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-items-highlighted").textContent=(e.items_highlighted.total||0).toLocaleString();document.querySelector("#stats-users-highlighted").textContent=(e.items_highlighted.users||0).toLocaleString();document.querySelector("#stats-users-highlighted-percentage").textContent=(e.items_highlighted.users/e.items_highlighted.total*100||0).toFixed(2);document.querySelector("#stats-pages-highlighted").textContent=(e.items_highlighted.pages||0).toLocaleString();document.querySelector("#stats-pages-highlighted-percentage").textContent=(e.items_highlighted.pages/e.items_highlighted.total*100||0).toFixed(2);document.querySelector("#stats-tags-highlighted").textContent=(e.items_highlighted.tags||0).toLocaleString();document.querySelector("#stats-tags-highlighted-percentage").textContent=(e.items_highlighted.tags/e.items_highlighted.total*100||0).toFixed(2);{const t=e.session_time+(performance.now()-this.ws.time.load);document.querySelector("#stats-session-time").textContent=(e=>{const t=Math.floor(e/1e3),n=Math.floor(t/86400),s=Math.floor(t%86400/3600),i=Math.floor(t%3600/60);let a="";return n>0&&(a+=`${n}d `),s>0&&(a+=`${s}h `),i>0&&(a+=`${i}m `),a+=t%60+"s",a.trim()})(t);document.querySelector("#stats-reports-per-day").textContent=(e.reports_filed.total/(t/864e5||1)||0).toFixed(2);document.querySelector("#stats-reverts-per-hour").textContent=(e.reverts_made.total/(t/36e5||1)||0).toFixed(2);document.querySelector("#stats-reviews-per-minute").textContent=(e.edits_reviewed.total/(t/6e4||1)||0).toFixed(2)}}save(){this.deselect(),document.querySelector("#settings-save-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .save").classList.remove("hidden"),document.querySelector("#settings-save-status").classList.add("hidden")}changelog(){this.deselect(),document.querySelector("#settings-changelog-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .changelog").classList.remove("hidden");const e=document.querySelector("#settings-container > .settings > .settings-right > .changelog > div > .changelog-content");e.innerHTML="<em class='animate-loading-dots'>Loading changelog</em>",l.WikiShield.config.changelog.HTML.then(t=>e.innerHTML=t)}about(){this.deselect(),document.querySelector("#settings-about-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .about").classList.remove("hidden"),document.querySelector("#settings-about-version").textContent=l.WikiShield.config.version,document.querySelectorAll("#settings-container > .settings > .settings-right > .about > .randomize").forEach(e=>{for(let t=e.children.length;t>=0;t--)e.appendChild(e.children[Math.random()*t|0])})}}},7698(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.BuildPalette=function(e,...t){const n=document.createElement("canvas");n.width=e,n.height=1;const s=n.getContext("2d"),i=s.createLinearGradient(0,0,n.width,0),a=1/(t.length-1);t.forEach((e,t)=>{i.addColorStop(a*t,e)}),s.fillStyle=i,s.fillRect(0,0,n.width,n.height);const r=s.getImageData(0,0,n.width,1).data;return Array.from({length:e},(e,t)=>{const n=4*t;return`rgb(${r[n]}, ${r[n+1]}, ${r[n+2]})`})}},3241(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.expiryRegex=t.Utility=void 0;var s=n(4551);function i(){i=function(e,t){return new n(e,void 0,t)};var e=RegExp.prototype,t=new WeakMap;function n(e,s,i){var r=RegExp(e,s);return t.set(r,i||t.get(e)),a(r,n.prototype)}function s(e,n){var s=t.get(n);return Object.keys(s).reduce(function(t,n){var i=s[n];if("number"==typeof i)t[n]=e[i];else{for(var a=0;void 0===e[i[a]]&&a+1<i.length;)a++;t[n]=e[i[a]]}return t},Object.create(null))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&a(e,t)}(n,RegExp),n.prototype.exec=function(t){var n=e.exec.call(this,t);if(n){n.groups=s(n,this);var i=n.indices;i&&(i.groups=s(i,this))}return n},n.prototype[Symbol.replace]=function(n,i){if("string"==typeof i){var a=t.get(this);return e[Symbol.replace].call(this,n,i.replace(/\$<([^>]+)(>|$)/g,function(e,t,n){if(""===n)return e;var s=a[t];return Array.isArray(s)?"$"+s.join("$"):"number"==typeof s?"$"+s:""}))}if("function"==typeof i){var r=this;return e[Symbol.replace].call(this,n,function(){var e=arguments;return"object"!=typeof e[e.length-1]&&(e=[].slice.call(e)).push(s(e,r)),i.apply(this,e)})}return e[Symbol.replace].call(this,n,i)},i.apply(this,arguments)}function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}const r=t.expiryRegex=i(/(infinity|^(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)W)?(([0-9]+)D)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?)$/,{years:3,months:5,weeks:7,days:9,hours:11,minutes:13,seconds:15});t.Utility=class{constructor(e){this.ws=e}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}escape(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}utcString(e){if(e===1/0)return"indefinite";const t=this.padString;return`${e.getUTCFullYear()}-${t(e.getUTCMonth()+1,2)}-${t(e.getUTCDate(),2)}T${t(e.getUTCHours(),2)}:${t(e.getUTCMinutes(),2)}:${t(e.getUTCSeconds(),2)}`}padString(e,t){for(e=e.toString();e.length<t;)e=`0${e}`;return e}getMonth(e){return["January","February","March","April","May","June","July","August","September","October","November","December"][e]}monthSectionName(){return`${this.getMonth((new Date).getUTCMonth())} ${(new Date).getUTCFullYear()}`}escape(e){return(e||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}textify(e){const t=document.createElement("div");return t.innerHTML=e,t.textContent||t.innerText||""}pageLink(e,t=!1,n=!0){return t?`https://${this.ws.server}/w/index.php${e}`:`https://${this.ws.server}/wiki/${n?encodeURIComponent(e):e}`}truncate(e,t){return(0,s.truncate)(e,t)}formatBytes(e){if(0===e)return"0 B";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB","RiB","QiB"][t]}getChangeColor(e){if(0===e)return"#888";if(e>0)return e>=1e3?"#00b894":e>=500?"#00d4a1":e>=100?"#26de81":"#55efc4";{const t=Math.abs(e);return t>=1e3?"#d63031":t>=500?"#e74c3c":t>=100?"#ff6b6b":"#ff8787"}}getChangeString(e){return e>0?"+"+e:0===e?"0":`&ndash;${Math.abs(e).toString()}`}formatNotificationTime(e,t=new Date){const n=Math.floor((t-e)/1e3);return n<=0?"Now":n<60?`${n}s ago`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:n<2592e3?`${Math.floor(n/86400)}d ago`:n<31536e3?`${Math.floor(n/2592e3)}mo ago`:`${Math.floor(n/31536e3)}y ago`}formatDuration(e,t=new Date){const n=Math.floor((t-e)/1e3);return n<=0?"0s":n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m`:n<86400?`${Math.floor(n/3600)}h`:n<2592e3?`${Math.floor(n/86400)}d`:n<31536e3?`${Math.floor(n/2592e3)}mo`:`${Math.floor(n/31536e3)}y`}match(e,t){return this.ws.store.settings.username_highlighting.fuzzy?function(e,t,n){const s=e.length,i=t.length;if(0===s)return!0;if(0===i)return s<=n;let a=new Array(i+1).fill(0),r=new Array(i+1).fill(0);for(let e=0;e<=i;e++)a[e]=0;for(let o=1;o<=s;o++){r[0]=o;let l=r[0];for(let d=1;d<=i;d++){const i=e[o-1]===t[d-1]?0:1,c=a[d]+1,u=r[d-1]+1,p=a[d-1]+i,g=Math.min(c,u,p);if(r[d]=g,g<l&&(l=g),o===s&&g<=n)return!0}if(l>n)return!1;[a,r]=[r,a]}return!1}(e,t,2):t.toLowerCase().includes(e.toLowerCase())}isIPv4Address(e){const t="(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|0?[0-9]{1,2})";return new RegExp(`^(${t}\\.){3}${t}$`).test(e)}isIPv6Address(e){return!!new RegExp("^(?::(?::|(?::[0-9A-Fa-f]{1,4}){1,7})|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,6}::|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){7})$").test(e)||new RegExp("^[0-9A-Fa-f]{1,4}(?:::?[0-9A-Fa-f]{1,4}){1,6}$").test(e)&&/::/.test(e)&&!/::.*::/.test(e)}isIPAddress(e){return this.isIPv4Address(e)||this.isIPv6Address(e)}isTempAccount(e){return/^~[0-9]{4,}(-[0-9A-Fa-f]{5})*(-[0-9A-Fa-f]{1,5})$/.test(e)}expiryToDate(e){if("infinity"===e)return 1/0;const t=new Date,n=r.exec(e);return n?new Date(t.getFullYear()+(parseInt(n.groups.years)||0),t.getMonth()+(parseInt(n.groups.months)||0),t.getDate()+7*(parseInt(n.groups.weeks)||0)+(parseInt(n.groups.days)||0),t.getHours()+(parseInt(n.groups.hours)||0),t.getMinutes()+(parseInt(n.groups.minutes)||0),t.getSeconds()+(parseInt(n.groups.seconds)||0)):t}getPageSections(e){const t=e.split("\n"),n=[];let s={title:"",heading:"",level:0,content:""};for(const e of t){const t=/^(=+)\s*(.*?)\s*\1\s*$/.exec(e);t?(""!==s.title&&n.push(s),s={title:t[2],heading:t[0],level:t[1].length,content:""}):(""!==s.content&&(s.content+="\n"),s.content+=e)}return""===s.content&&""===s.title||n.push(s),n}}},5564(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.sortDependencies=function(e){const t=new Map(e.map(e=>[e.id,e])),n=new Set,s=new Set,i=[],a=(e,r)=>{if(n.has(e))return;if(s.has(e)){const t=r.indexOf(e),n=r.slice(t).concat(e).join(" -> ");throw new Error(`Cyclic dependency detected: ${n}`)}const o=t.get(e);if(!o)throw new Error(`Unknown dependency: ${e}`);s.add(e),r.push(e);const l=o.dependencies||[];for(const e of l)a(e,r);r.pop(),n.add(e),s.delete(e),i.push(o)};for(const t of e)n.has(t.id)||a(t.id,[]);return i}},2069(e,t){var n;function s(e,t,n){i(e,t),t.set(e,n)}function i(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function a(e,t){return e.get(o(e,t))}function r(e,t,n){return e.set(o(e,t),n),n}function o(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function l(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.Text=void 0;class d{}l(d,"Lower",Symbol("lower case")),l(d,"Upper",Symbol("UPPER CASE")),l(d,"Title",Symbol("Title Case")),l(d,"Sentence",Symbol("Sentence case")),l(d,"Camel",Symbol("camelCase")),l(d,"Pascal",Symbol("PascalCase")),l(d,"Snake",Symbol("snake_Case")),l(d,"Split",Symbol("split,case"));var c=new WeakMap,u=new WeakMap,p=new WeakMap,g=new WeakSet;class h{static pluralize(e,t,n){return new h(e).plural(n).get(t)}constructor(e,t=d.Sentence){var n,a;i(n=this,a=g),a.add(n),s(this,c,!1),s(this,u,void 0),s(this,p,void 0);const l=m.call(h,e,t);r(c,this,l.inSentenceCase),r(u,this,l.words),r(p,this,o(g,this,v).call(this))}plural(){return r(p,this,o(g,this,v).apply(this,arguments)),this}case(e=d.Sentence){const t=t=>{switch(e){case d.Lower:return t.map(e=>e.toLowerCase()).join(" ");case d.Upper:return t.map(e=>e.toUpperCase()).join(" ");case d.Title:return t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");case d.Sentence:if(a(c,this))return t.join(" ");let e=!0;return t.map(t=>{let n=e?t.charAt(0).toUpperCase()+t.slice(1).toLowerCase():t.toLowerCase();return e=/[.!?]$/.test(t),n}).join(" ");case d.Camel:return t.map((e,t)=>0===t?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("");case d.Pascal:return t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("");case d.Snake:return t.map(e=>e.toLowerCase()).join("_");case d.Split:return t;default:throw new TypeError("Invalid case type, must be a Case value")}},[n,s]=[t(a(u,this)),t(a(p,this))];return Object.freeze({get:(e=1)=>(Number.isNaN(Number(e))||1===e||1n===e||"1"===e?n:s).replace(/(?<!\\)%n/g,e)})}get(e=1){return this.case().get(e)}}function m(e,t){const n=(e=>{switch(t){case d.Lower:case d.Upper:case d.Title:case d.Sentence:return e.split(/\s+/);case d.Camel:case d.Pascal:return e.split(/(?=[A-Z])/);case d.Snake:return e.split(/_/g);case d.Split:throw new TypeError("Split case is only used for output, not input");default:throw new TypeError("Invalid case type, must be a Case value")}})(e.toString().trim());return t===d.Sentence?{inSentenceCase:!0,words:n.map(e=>e.trim()).filter(e=>e.length>0)}:{inSentenceCase:!1,words:n.map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}}function v(e){if(null==e||e){const e=[...a(u,this)],t=e.length-1;return e[t]=(e=>{let t;return t=e.replace(/(?<=sh?|ch|x|z|[^aeiou]o)$/i,"es"),t!==e?t:(t=e.replace(/(?<=[^aeiou])y$/i,"ies"),t!==e?t:(t=e.replace(/fe?$/i,"ves"),t!==e?t:`${e}s`))})(a(u,this)[t]),e}if(!1===e)return[...a(u,this)];if(e instanceof n)return e.case(d.Split).get();throw new TypeError("Invalid plural argument, must be boolean or Text instance")}t.Text=h,n=h,l(h,"Case",d)},8878(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.MediaWikiAPI=void 0;var s=n(1289),i=n(4551),a=n(2852),r=n(6873),o=n(505),l=n(8582);const d=console,c=new Set(l.__servers__.filter(e=>e.tag).map(e=>e.host)),u=new Set(l.__servers__.filter(e=>e.pending_changes).map(e=>e.host));class p{static get pendingChangesServers(){return Array.from(u)}static hasPendingChanges(e){return u.has(e)}static chunk(e,t=50){const n=[],s=e.length;for(let i=0;i<s;i+=t)n.push(e.slice(i,i+t));return n}static paramify(e){return Array.isArray(e)||(e=[e]),[...new Set(e)]}static join(e){return e.join("|").replace(/\|\|+/g,"|")}static getUsername(e,t){return e.fetch(`https://${t}/w/api.php`,{action:"query",meta:"userinfo",uiprop:"name",format:"json",formatversion:2},void 0,"POST",!0).then(e=>{var t;return(null==e||null===(t=e.query)||void 0===t||null===(t=t.userinfo)||void 0===t?void 0:t.name)||null})}constructor(e,t,n,s){var i,o;this.glob=e,this.oauth=t,this.server=n,this.username=s,this.tokens={},null!==(o=(i=p.cache)[n])&&void 0!==o||(i[n]={parse:new r.Trie({size:1e3}),pending:new a.Memory({size:2500,timeout:36e5}),abuse:new a.Memory({size:2500,timeout:9e5}),ores:new a.Memory({size:1e4,timeout:9e5}),diff:new a.Memory({size:500,timeout:3e5})})}close(){this.stream.disconnect()}get cache(){return p.cache[this.server]}build(e={},t=null){return{tags:c.has(null!=t?t:this.server)?"WikiShield script":"",assertuser:this.username,discussiontoolsautosubscribe:"no",...e}}user(e){return`[[Special:Contribs/${e}|${e}]] ([[User talk:${e}|talk]])`}revision(e){return`[[Special:Diff/${e}|${e}]]`}centralAuthUser(e){return`[[Special:CentralAuth/${e}|${e}]]`}summary(e,t){const n=" ([[:en:WP:WikiShield|WS]])",s=`${e}${t?`: ${t}`:""}`;return`${(0,i.truncate)(s,473)}${n}`}async post(e,t=!1,n=null){try{const s=await this.oauth.fetch(`https://${n||this.server}/w/api.php`,this.build({...e,format:"json",formatversion:2},n),void 0,"POST",t,n);if(s.error){if("alreadyrolled"===s.error.code||"editconflict"===s.error.code)return"editconflict";if("missingcontent"===s.error.code&&"compare"===e.action)return{compare:{body:""}};throw new Error(`API Error: ${s.error.code} - ${s.error.info}`)}return s}catch(t){throw d.error("Error in API POST request:",t,JSON.stringify(e)),t}}async continuous(e,t,n,s){try{let i=null;const a=[];do{const r=await this.post({...e,...i||{}},n,s);a.push(r),i=r.continue||null,"function"==typeof t&&!0===await t(r,a)&&(i=!1)}while(i);return{stopped:null!==i,responses:a}}catch(t){return d.error("Error in API continuous request:",t,JSON.stringify(e)),{stopped:!0,responses:[]}}}async getToken(e="csrf",t,n){const s=`${null!=n?n:this.server}:${e}`;if(void 0!==this.tokens[s])return this.tokens[s];try{return this.tokens[s]=this.post({action:"query",meta:"tokens",type:e},t,n).then(t=>{var n;return(null==t||null===(n=t.query)||void 0===n||null===(n=n.tokens)||void 0===n?void 0:n[`${e}token`])||null})}catch(e){throw d.error("Error fetching token:",e),e}}async postWithToken(e,t="csrf",n,s){try{return await this.post({...e,token:await this.getToken(t,n,s)},n,s)}catch(e){throw d.error("Post with token error:",e),e}}async account(e,t){try{var n;return(null===(n=await this.post({action:"query",meta:"userinfo",uiprop:"*"},e,t))||void 0===n||null===(n=n.query)||void 0===n?void 0:n.userinfo)||{}}catch(e){var s;return null!==(s=void d.error("Error fetching account info:",e))&&void 0!==s?s:{}}}async getGlobalUserInfo(e,t,n){try{var s;return(null===(s=(await this.post({action:"query",meta:"globaluserinfo",guiuser:e,guiprop:"groups|rights"},t,n)).query)||void 0===s?void 0:s.globaluserinfo)||{}}catch(e){var i;return null!==(i=void d.error("Error fetching global user info:",e))&&void 0!==i?i:{}}}async markWatchlistSeen(e,t,n,s){try{await this.postWithToken({action:"setnotificationtimestamp",titles:e,newerthanrevid:t},"csrf",n,s)}catch(e){var i;return null!==(i=void d.error("Error marking watchlist item as seen:",e))&&void 0!==i?i:{valid:!1,reason:e.message}}}async append(e,t,n,s,i=null,a,r){try{if(null!==i){return{needsCheck:!0,text:(await this.getPagesContent([e],a,r))[e]||""}}return"editconflict"===await this.postWithToken({action:"edit",title:e,...null===(null!=t?t:null)?{}:{section:t},appendtext:`\n${n}`,summary:s},"csrf",a,r)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var o;return null!==(o=void d.error("Error appending to section:",e))&&void 0!==o?o:{valid:!1,reason:e.message}}}async editSection(e,t,n,s,i,a=null,r,o){try{if(null!==a){return{needsCheck:!0,text:(await this.getPagesContent([e],r,o))[e]||""}}return"editconflict"===await this.postWithToken({action:"edit",title:e,section:t,sectiontitle:n,text:s,summary:i},"csrf",r,o)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var l;return null!==(l=void d.error("Error editing section:",e))&&void 0!==l?l:{valid:!1,reason:e.message}}}async acceptPendingEdit(e,t,n,s){try{return await this.postWithToken({action:"review",revid:e,comment:t},"csrf",n,s),{valid:!0}}catch(e){return{valid:!1,reason:"Edit could not be accepted."}}}async rejectPendingEdit(e,t,n,s,i,a){try{const r=(await this.getRevisionsContent([t],i,a))[t]||"";return"editconflict"===await this.postWithToken({action:"edit",title:n,text:r,summary:s,baserevid:e},"csrf",i,a)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){return{valid:!1,reason:"Edit could not be rejected."}}}async rollbackEdit(e,t,n,s,i){try{var a;const r=await this.postWithToken({action:"rollback",title:e,user:t,summary:n},"rollback",s,i);if("editconflict"===r)return{valid:!1,reason:"Edit conflict."};if("onlyauthor"===r)return{valid:!1,reason:"Cannot rollback edits as the no other user has edited the page."};if(null===(a=r.rollback)||void 0===a||!a.revid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,r.rollback.revid,s,i)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var r;return null!==(r=void d.error("Error rolling back edit:",e))&&void 0!==r?r:{valid:!1,reason:e.message}}}async undoEdit(e,t,n,s,i){try{var a;const r=await this.postWithToken({action:"edit",title:e,undo:t,summary:n},"csrf",s,i);if("editconflict"===r)return{valid:!1,reason:"Edit conflict."};if(null===(a=r.edit)||void 0===a||!a.newrevid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,r.edit.newrevid,s,i)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var r;return null!==(r=void d.error("Error undoing edit:",e))&&void 0!==r?r:{valid:!1,reason:e.message}}}async restoreEdit(e,t,n,i,a){try{var r;const o=(0,s.convertToUTCString)(new Date),l=(await this.getRevisionsContent([t],i,a))[t]||"",d=await this.postWithToken({action:"edit",title:e,text:l,summary:n,starttimestamp:o},"csrf",i,a);if("editconflict"===d)return{valid:!1,reason:"Edit conflict."};if(null===(r=d.edit)||void 0===r||!r.newrevid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,d.edit.newrevid,i,a)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var o;return null!==(o=void d.error("Error restoring edit:",e))&&void 0!==o?o:{valid:!1,reason:e.message}}}async thankRevision(e,t,n){try{return await this.postWithToken({action:"thank",rev:e},"csrf",t,n),{valid:!0}}catch(e){var s;return null!==(s=void d.error("Error thanking revision:",e))&&void 0!==s?s:{valid:!1,reason:e.message}}}async watchPage(e,t,n,s){try{return await this.postWithToken({action:"watch",title:e,expiry:t},"watch",n,s),{valid:!0}}catch(e){var i;return null!==(i=void d.error("Error watching page:",e))&&void 0!==i?i:{valid:!1,reason:e.message}}}async unwatchPage(e,t,n){try{return await this.postWithToken({action:"watch",title:e,unwatch:!0},"watch",t,n),{valid:!0}}catch(e){var s;return null!==(s=void d.error("Error unwatching page:",e))&&void 0!==s?s:{valid:!1,reason:e.message}}}async parse(e,t,n=!1,s,i){null!=t||(t=void 0);const a=[t,e].filter(e=>void 0!==e);if(this.cache.parse.has(...a))return this.cache.parse.get(...a);try{var r;const o=(null===(r=await this.post({action:"parse",prop:"text",preview:n,text:e,title:t,contentmodel:"wikitext"},s,i))||void 0===r||null===(r=r.parse)||void 0===r?void 0:r.text)||"";return this.cache.parse.set(...a,o),o}catch(e){var o;return null!==(o=void d.error("Error parsing wikitext:",e))&&void 0!==o?o:""}}async getTags(e,t){try{return(await this.continuous({action:"query",list:"tags",tglimit:"max"},void 0,e,t)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.tags)||[]})}catch(e){var n;return null!==(n=void d.error("Error fetching revisions between IDs:",e))&&void 0!==n?n:[]}}async getPagesContent(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"content",rvslots:"*",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=(null===(i=t.revisions)||void 0===i||null===(i=i[0])||void 0===i||null===(i=i.slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content)||""}return r}catch(e){var a;return null!==(a=void d.error("Error fetching pages content:",e))&&void 0!==a?a:{}}}async getRevisionsContent(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|content",rvslots:"*",revids:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s;for(const e of t.revisions||[]){var i;r[e.revid]=(null===(i=e.slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content)||""}}return r}catch(e){var a;return null!==(a=void d.error("Error fetching revisions content:",e))&&void 0!==a?a:{}}}async getLatestIds(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=(null===(i=t.revisions)||void 0===i||null===(i=i[0])||void 0===i?void 0:i.revid)||null}return r}catch(e){var a;return null!==(a=void d.error("Error fetching latest IDs:",e))&&void 0!==a?a:{}}}async getRevisionsBetween(e,t,n,s,i){try{return(await this.continuous({action:"query",prop:"revisions",titles:e,rvstartid:n,rvendid:t,rvprop:"title|ids|flags|user|timestamp|comment|parsedcomment|size|tags",rvlimit:"max"},void 0,s,i)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions)||[]})}catch(e){var a;return null!==(a=void d.error("Error fetching revisions between IDs:",e))&&void 0!==a?a:[]}}async getEditCounts(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",list:"users",usprop:"editcount",ususers:p.join(e)},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.users)||[]){var s;a[t.name]=t.editcount}return a}catch(e){var i;return null!==(i=void d.error("Error fetching edit counts:",e))&&void 0!==i?i:{}}}async areUsersBlocked(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",list:"blocks",bkusers:p.join(e),bkprop:"id|user|by|reason|expiry|flags"},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.blocks)||[]){var s;a[t.user]=t}return a}catch(e){var i;return null!==(i=void d.error("Error fetching blocked users:",e))&&void 0!==i?i:{}}}async isUserGloballyLocked(e,t,n){try{var s;return!0===(null===(s=(await this.post({action:"query",meta:"globaluserinfo",guiuser:e},t,n)).query)||void 0===s||null===(s=s.globaluserinfo)||void 0===s?void 0:s.locked)}catch(e){var i;return null!==(i=void d.error("Error checking if user is globally locked:",e))&&void 0!==i&&i}}async getContributions(e,t=10,n,s){try{var i;return(null===(i=(await this.post({action:"query",list:"usercontribs",ucuser:e,uclimit:t,ucprop:"ids|title|timestamp|comment|parsedcomment|flags|tags|sizediff|flags"},n,s)).query)||void 0===i?void 0:i.usercontribs)||[]}catch(e){var a;return null!==(a=void d.error("Error fetching contributions:",e))&&void 0!==a?a:[]}}async getBlocks(e,t,n){try{return(await this.continuous({action:"query",list:"logevents",letype:"block",letitle:`User:${e}`,leaction:"block/block",lelimit:"max",leprop:"id|timestamp|details|user|comment|parsedcomment"},void 0,t,n)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.logevents)||[]})}catch(e){var s;return null!==(s=void d.error("Error fetching blocks:",e))&&void 0!==s?s:[]}}async pagesExist(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"content",rvslots:"*",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=t.missing||null===(i=t.revisions)||void 0===i||null===(i=i[0].slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content}return r}catch(e){var a;return null!==(a=void d.error("Error checking page existence:",e))&&void 0!==a?a:[]}}async getPagesDetails(e,t,n){e=p.paramify(e);try{const o=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.continuous({action:"query",prop:"info|categories|templates",titles:p.join(e),inprop:"protection|watched",cllimit:"max",tllimit:"max",tlnamespace:"10"},void 0,t,n))),l={};for(const e of o)if("fulfilled"===e.status)for(const t of e.value.responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.pages)||[]})){var s,i,a,r;null!==(i=l[s=t.title])&&void 0!==i||(l[s]={protection:null,watched:!1,categories:[],metadata:[]});let e=(null===(a=l[t.title])||void 0===a||null===(a=a.protection)||void 0===a?void 0:a.level)||null;for(const n of t.protection||[])"edit"===n.type&&("sysop"===n.level||"sysop"===e?e="sysop":"autoconfirmed"===n.level||"autoconfirmed"===e?e="autoconfirmed":"extendedconfirmed"!==n.level&&"extendedconfirmed"!==e||(e="extendedconfirmed"));const n=[];for(const e of t.templates||[]){const t=e.title.replace(/^Template:/i,"");t.match(/^use\s/i)&&n.push(t)}l[t.title]={protection:null===e?{protected:!1}:{protected:!0,level:e},watched:!0===t.watched||l[t.title].watched,categories:l[t.title].categories.concat((null===(r=t.categories)||void 0===r?void 0:r.map(e=>e.title))||[]),metadata:l[t.title].metadata.concat(n)}}return l}catch(e){var o;return null!==(o=void d.error("Error fetching page details:",e))&&void 0!==o?o:{}}}async getHistory(e,t=10,n,s){try{var i;const a=null===(i=(await this.post({action:"query",prop:"revisions",titles:e,rvlimit:t+1,rvprop:"ids|user|timestamp|comment|parsedcomment|flags|tags|size|flags"},n,s)).query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];if(null==a||!a.revisions)return[];const r=a.revisions.length,o=Math.min(t,r||0);for(let e=0;e<o;e++){const t=a.revisions[e];t.ns=a.ns,t.pageid=a.pageid,t.title=a.title,t.sizediff=e+1<r?t.size-a.revisions[e+1].size:t.size}return a.revisions.slice(0,o)}catch(e){var a;return null!==(a=void d.error("Error fetching page history:",e))&&void 0!==a?a:[]}}async countPageReverts(e,t,n,i){const a=e=>"mw-undo"===e||"mw-rollback"===e||"mw-manual-revert"===e;try{const o=await this.continuous({action:"query",prop:"revisions",titles:e,rvdir:"newer",rvstart:(0,s.convertToUTCString)(new Date(Date.now()-864e5)),rvprop:"tags",rvuser:t,rvlimit:"max"},void 0,n,i);let l=0;for(const e of o.responses){var r;l+=(null===(r=e.query)||void 0===r||null===(r=r.pages)||void 0===r||null===(r=r[0])||void 0===r||null===(r=r.revisions)||void 0===r?void 0:r.filter(e=>e.tags.some(a)).length)||0}return l}catch(e){var o;return null!==(o=void d.error("Error counting page reverts:",e))&&void 0!==o?o:0}}async getORES(e,t,n,s){e=p.paramify(e);try{const a={};e=e.filter(e=>{var t;const n=this.cache.ores.get(e);return!n||null!==(t=void(a[e]=n))&&void 0!==t&&t});const r=p.chunk(e,50),l=await Promise.allSettled(r.map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|oresscores",rvslots:"*",revids:p.join(e)},n,s)));for(const e of l)if("fulfilled"===e.status)for(const t of(null===(i=e.value.query)||void 0===i?void 0:i.pages)||[]){var i;for(const e of t.revisions||[])a[e.revid]=e.oresscores||{}}return o.ORES.extract(a,t)}catch(e){var a;return null!==(a=void d.error("Error fetching ORES scores:",e))&&void 0!==a?a:{}}}async extractORES(e,t=.5){return o.ORES.extract(e,t)}async getDiff(e,t,n="table",s,i){null!=e||(e=!1);const a=`${n}@${e}-${t}`;if(this.cache.diff.has(a))return this.cache.diff.get(a);try{var r;const o={action:"compare",prop:"diff",difftype:n,torev:t};0==e?(o.fromslots="main",o["fromtext-main"]=""):o.fromrev=e;const l=(null===(r=(await this.post(o,s,i)).compare)||void 0===r?void 0:r.body)||"";return this.cache.diff.set(a,l),l}catch(e){var o;return null!==(o=void d.error("Error fetching diff:",e))&&void 0!==o?o:""}}async getWikitextDiff(e,t,n="table",s,i){null!=e||(e=!1);try{var a;return(null===(a=(await this.post({action:"compare",prop:"diff",difftype:n,fromslots:"main","fromtext-main":!1===e?"":e,toslots:"main","totext-main":t},s,i)).compare)||void 0===a?void 0:a.body)||""}catch(e){var r;return null!==(r=void d.error("Error fetching wikitext diff:",e))&&void 0!==r?r:""}}async getSizeDiff(e,t,n,s){try{var i;const a=await(null===(i=this.post({action:"query",prop:"revisions",rvprop:"size",revids:`${e}|${t}`},n,s).query)||void 0===i||null===(i=i.pages)||void 0===i||null===(i=i[0])||void 0===i?void 0:i.revisions)||[];return 0===a.length?0:1===a.length?a[0].size:a[1].size-a[0].size}catch(e){var a;return null!==(a=void d.error("Error fetching size diff:",e))&&void 0!==a?a:0}}async getRevision(e,t,n,s){try{var i,a,r;const o=null===(i=(await this.post({action:"query",prop:"revisions",titles:e,rvprop:"ids|user|comment|parsedcomment|timestamp|size|tags|flags",rvslots:"*",rvstartid:t,rvlimit:2},n,s)).query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];if(null==o||null===(a=o.revisions)||void 0===a||!a.length)return{};const l=o.revisions[0];return{revid:l.revid,parentid:l.parentid,user:l.user,parsedcomment:l.parsedcomment,comment:l.comment,timestamp:l.timestamp,size:l.size,oldlen:(null===(r=o.revisions[1])||void 0===r?void 0:r.size)||0,minor:l.minor||!1,tags:l.tags||[]}}catch(e){var o;return null!==(o=void d.error("Error fetching revision:",e))&&void 0!==o?o:{}}}async getRevisions(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|user|comment|parsedcomment|timestamp|size|tags|flags|oresscores",rvslots:"*",revids:p.join(e)},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s;for(const e of t.revisions||[])a[e.revid]=e}return a}catch(e){var i;return null!==(i=void d.error("Error fetching revisions:",e))&&void 0!==i?i:{}}}async getConsecutiveEdits(e,t,n,s,i){try{var a,r;const o=await this.continuous({action:"query",prop:"revisions",titles:e,rvprop:"ids|timestamp|user|size|parsedcomment",rvlimit:"max",rvstartid:t},e=>{var t;return null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions.some(e=>e.user!==n)},s,i),l=o.responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions)||[]});let d,c;const u=l[0];if((null==u?void 0:u.user)!==n)return{count:0,sizediff:0,timestamp:{new:null,old:null},diff:null,edits:[]};const p={count:0,sizediff:0,timestamp:{new:null,old:null},diff:null,edits:[]},g=l.length;for(let e=0;e<g;e++){const t=l[e];if(c=t,t.user!==n)break;p.edits.push(t),d=t,p.count++,p.sizediff+=e+1<g?t.size-l[e+1].size||0:t.size||0}return p.timestamp.new=(null==u?void 0:u.timestamp)||null,p.timestamp.old=(null===(a=d)||void 0===a?void 0:a.timestamp)||null,o.stopped?p.diff=await this.getDiff((null===(r=c)||void 0===r?void 0:r.revid)||null,u.revid,"table",s,i):p.diff=await this.getDiff(null,u.revid,"table",s,i),p}catch(e){return d.error("Get consecutive edits error:",e),{count:0,sizediff:0,timestamp:{new:null,old:null},diff:null}}}async parseUsers(e,t,n,s){e=p.paramify(e);const i=Array.from({length:e.length},()=>({user:{}}));try{const a=[];return a.push(this.getEditCounts(e,n,s).then(t=>{e.forEach((e,n)=>i[n].user.edits=t[e]||0)}),this.areUsersBlocked(e,n,s).then(t=>{e.forEach((e,n)=>i[n].user.blocked=t[e]||null)}),this.pagesExist(e.map(e=>`User talk:${e}`),n,s).then(t=>{e.forEach((e,n)=>i[n].user.talk=t[`User talk:${e}`])})),t||a.push((async()=>{await Promise.all(e.map(async(e,t)=>{[i[t].user.contributions,i[t].user.blocks]=await Promise.all([this.getContributions(e,void 0,n,s),this.getBlocks(e,n,s)])}))})()),await Promise.all(a),i}catch(e){var a;return null!==(a=void d.error("Parse user error:",e))&&void 0!==a?a:i}}async parseEdits(e,t,n,s,i){e=p.paramify(e);const a=p.paramify(e.map(e=>e.item.user)),r=p.paramify(e.map(e=>e.item.revid)),o=p.paramify(e.map(e=>e.item.title)),l=e.map(({item:e,prior:t})=>({item:e,prior:t,data:{user:{},page:{},edit:{}}}));try{const d=[];return d.push(this.parseUsers(a,t,s,i).then(t=>{e.forEach((e,n)=>{const s=a.indexOf(e.item.user);l[n].data.user=t[s].user})}),this.getPagesDetails(o,s,i).then(t=>{e.forEach((e,n)=>{var s,i,a,r;l[n].data.page.protection=(null===(s=t[e.item.title])||void 0===s?void 0:s.protection)||{protected:!1},l[n].data.page.watched=(null===(i=t[e.item.title])||void 0===i?void 0:i.watched)||!1,l[n].data.page.categories=(null===(a=t[e.item.title])||void 0===a?void 0:a.categories)||[],l[n].data.page.metadata=(null===(r=t[e.item.title])||void 0===r?void 0:r.metadata)||[]})}),this.getORES(r,n,s,i).then(t=>{e.forEach((e,n)=>{l[n].data.edit.ores=t[e.item.revid]||0})})),t||d.push((async()=>{await Promise.all(e.map(async(e,t)=>{[l[t].data.page.consecutive,l[t].data.page.reverts,l[t].data.page.history,l[t].data.edit.diff]=await Promise.all([this.getConsecutiveEdits(e.item.title,e.item.revid,e.item.user,s,i),this.countPageReverts(e.item.title,this.username,s,i),this.getHistory(e.item.title,void 0,s,i),this.getDiff(e.prior||null,e.item.revid,"table",s,i)])}))})()),await Promise.all(d),l}catch(e){var c;return null!==(c=void d.error("Parse edit error:",e))&&void 0!==c?c:l}}async parseAbuselogs(e,t,n,s){e=p.paramify(e);const i=p.paramify(e.map(e=>e.user)),a=p.paramify(e.map(e=>e.title)),r=e.map(e=>({item:e,data:{user:{},page:{},edit:{}}}));try{const o=[];return o.push((async()=>{await Promise.all(e.map(async(e,t)=>{[r[t].data.parsedcomment]=await Promise.all([this.parse(e.comment,void 0,!1,n,s)])}))})(),this.parseUsers(i,t,n,s).then(t=>{e.forEach((e,n)=>{const s=i.indexOf(e.user);r[n].data.user=t[s].user})}),this.getPagesDetails(a,n,s).then(t=>{e.forEach((e,n)=>{var s,i,a,o;r[n].data.page.protection=(null===(s=t[e.title])||void 0===s?void 0:s.protection)||{protected:!1},r[n].data.page.watched=(null===(i=t[e.title])||void 0===i?void 0:i.watched)||!1,r[n].data.page.categories=(null===(a=t[e.title])||void 0===a?void 0:a.categories)||[],r[n].data.page.metadata=(null===(o=t[e.title])||void 0===o?void 0:o.metadata)||[]})})),t||o.push((async()=>{await Promise.all(e.map(async(e,t)=>{[r[t].data.page.reverts,r[t].data.page.history,r[t].data.edit.diff]=await Promise.all([this.countPageReverts(e.title,this.username,n,s),this.getHistory(e.title,void 0,n,s),e.diff?this.getWikitextDiff(e.diff.old,e.diff.new,"table",n,s):Promise.resolve(null)])}))})()),await Promise.all(o),r}catch(e){var o;return null!==(o=void d.error("Parse abuselog error:",e))&&void 0!==o?o:r}}async getAbuseLogRevid(e,t,n){try{var s,i;return(null===(i=((null===(s=(await this.post({action:"query",list:"abuselog",afllogids:e,aflprop:"ids|revid"},t,n)).query)||void 0===s?void 0:s.abuselog)||[]).find(t=>t.id===e))||void 0===i?void 0:i.revid)||null}catch(e){var a;return null!==(a=void d.error("Error fetching abuse log revids:",e))&&void 0!==a?a:{}}}async feeds(e=null,t=null,n=null,s=null,i=null){[e,t,n,s,i]=[e,t,n,s,i].map(e=>"object"==typeof e?e:{});try{const a={action:"query",list:[]};null!==e&&(a.list.push("recentchanges"),a.rctype="edit",a.rcprop="title|ids|sizes|flags|user|timestamp|comment|parsedcomment|tags|oresscores",a.rcshow="!bot",a.rcnamespace=e.ns||"*",e.since&&(a.rcstart=e.since),a.rcdir=e.since?"newer":"older",a.rclimit="max"),null!==t&&u.has(this.server)&&(a.list.push("oldreviewedpages"),a.ornamespace=t.ns||"*",a.orlimit="max"),null!==n&&(a.list.push("logevents"),a.letype="newusers",a.wlprop="ids|title|type|user|timestamp|comment|details|parsedcomment",n.since&&(a.lestart=n.since),a.ledir=n.since?"newer":"older",a.lelimit="max"),null!==s&&(a.list.push("watchlist"),a.wltype="edit",a.wlprop="title|ids|sizes|flags|user|timestamp|comment|tags|oresscores|parsedcomment",a.wlexcludeuser=this.username,a.wlnamespace=s.ns||"*",s.since&&(a.wlstart=s.since),a.wldir=s.since?"newer":"older",a.wllimit="max"),null!==i&&(a.list.push("abuselog"),a.aflnamespace=i.ns||"*",i.since&&(a.aflstart=i.since),a.afldir=i.since?"newer":"older",a.aflprop="ids|user|title|action|result|timestamp|hidden|revid|filter|details",a.afllimit="max"),a.list=p.join(a.list);const r={recent:[],pending:[],users:[],watchlist:[],abuselog:[]};if((await this.continuous(a)).responses.forEach(e=>{const t=e.query||{};t.recentchanges&&(r.recent=r.recent.concat(t.recentchanges)),t.oldreviewedpages&&(r.pending=r.pending.concat(t.oldreviewedpages).slice(0,100)),t.logevents&&(r.users=r.users.concat(t.logevents.filter(e=>!e.temp))),t.watchlist&&(r.watchlist=r.watchlist.concat(t.watchlist)),t.abuselog&&(r.abuselog=r.abuselog.concat(t.abuselog))}),r.pending.length>0){const e=new Map,n={};if(await Promise.allSettled(r.pending.map(async t=>{var s,i,a;this.cache.pending.has(t.revid)||this.cache.pending.set(t.revid,await this.post({action:"query",prop:"revisions",titles:t.title,rvstartid:t.revid,rvlimit:1,rvprop:"ids|flags|user|timestamp|comment|parsedcomment|size|tags"}));const r=this.cache.pending.get(t.revid);e.has(t.title)||e.set(t.title,this.post({action:"query",list:"logevents",letype:"stable",leprop:"ids|title|type|user|timestamp|comment|details|parsedcomment",letitle:t.title,lelimit:1})),t.stability=(null===(s=await e.get(t.title))||void 0===s||null===(s=s.query)||void 0===s||null===(s=s.logevents)||void 0===s?void 0:s[0])||{};const o=null===(i=r.query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];n[t.title]={title:t.title,sizediff:t.diff_size,...null===(a=o.revisions)||void 0===a?void 0:a[0],pending:t}})),r.pending=Object.values(n),!0===t.full){const e={};await Promise.allSettled(r.pending.map(async t=>{const n=await this.getRevisionsBetween(t.title,t.pending.stable_revid,t.revid);if(n.length<2)return;const s=n.pop();e[t.title]={count:n.length,users:n.reduce((e,t)=>(t.user in e?e[t.user]++:e[t.user]=1,e),{}),edits:n,revid:t.revid,prior:s.revid,sizediff:t.size-s.size,timestamp:{new:t.timestamp,old:n[n.length-1].timestamp},pending:t.pending}})),r.pending=e}}if(r.abuselog.length>0){const e={};r.abuselog.forEach(t=>{if("edit"!==t.action)return;const n=`${t.user}|${t.title}|${t.timestamp}`;n in e?e[n].push(t):e[n]=[t]});const t=[];await Promise.allSettled(Object.entries(e).map(async([,e])=>{var n,s,i,a,r;const o=e[e.length-1],l=new Set(e.flatMap(e=>e.result.split(","))),d=e.find(e=>""!==e.revid&&void 0!==e.revid),c=e.find(e=>Object.keys(e.details).length);t.push({id:o.id,revision:void 0!==d,private:!c,result:l,action:o.action,revid:null!==(n=null==d?void 0:d.revid)&&void 0!==n?n:null,diff:c.details?{new:c.details.new_wikitext,old:c.details.old_wikitext,size:c.details.edit_delta}:null,timestamp:o.timestamp,comment:null!==(s=null==c||null===(i=c.details)||void 0===i?void 0:i.summary)&&void 0!==s?s:null,user:o.user,editcount:null!==(a=null==c||null===(r=c.details)||void 0===r?void 0:r.user_editcount)&&void 0!==a?a:null,ns:o.ns,title:o.title,entries:e})})),r.abuselog=t}return r}catch(e){return d.error("Feeds error:",e),{recent:[],pending:t.full?{}:[],users:[],watchlist:[],abuselog:[]}}}}var g,h,m;t.MediaWikiAPI=p,g=p,m={},(h=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(h="cache"))in g?Object.defineProperty(g,h,{value:m,enumerable:!0,configurable:!0,writable:!0}):g[h]=m},2486(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.build=async function(){document.head.querySelectorAll("link[rel=stylesheet]").forEach(e=>e.remove());const e=(new DOMParser).parseFromString(s.default,"text/html");document.title=e.title,e.head.querySelectorAll("link[rel=stylesheet]").forEach(e=>{document.head.appendChild(Object.assign(document.createElement("link"),{rel:"stylesheet",href:e.href}))});[i.default,a.default].filter(Boolean).forEach(e=>{const t=document.createElement("style");t.textContent=e,document.head.appendChild(t)});document.body.innerHTML=e.body.innerHTML,await new Promise(requestAnimationFrame)};var s=r(n(5540)),i=r(n(4279)),a=r(n(2459));function r(e){return e&&e.__esModule?e:{default:e}}},4112(e,t){function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function s(e,t){return e.get(a(e,t))}function i(e,t,n){return e.set(a(e,t),n),n}function a(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.MediaWikiOAuth2=void 0;var r=new WeakMap,o=new WeakMap;class l{constructor(e){n(this,r,void 0),n(this,o,0),i(r,this,Date.now()),this.delay=e,this.last=0}get count(){return s(o,this)}per(e=1){return Math.floor(s(o,this)/((Date.now()-s(r,this))/e))||0}call(e,t=!1){var n;i(o,this,(n=s(o,this),n++,n));const a=Date.now(),r=Math.max(0,this.last+this.delay-a);return this.last=a+r,t||0===r?e():new Promise(t=>setTimeout(async()=>t(await e()),r))}}t.MediaWikiOAuth2=class{constructor(e){this.userAgent=e,this.throttle=new l(0),this.api=new mw.Api}getOrigin(e){const t=`${location.protocol}//${location.host}`;try{const n=new URL(e);if(`${n.protocol}//${n.host}`===t)return}catch(e){}return t}async fetch(e,t={},n=null,s="POST",i){return await this.throttle.call(async()=>{const n=this.getOrigin(e);return n&&(e+=(e.includes("?")?"&":"?")+`origin=${encodeURIComponent(n)}`),await this.api.ajax({...t,origin:n},{url:e,method:s,...n?{xhrFields:{withCredentials:!0}}:{}}).catch(e=>{throw console.error(`[WikiSHield] Failed to parse OAuth2 response (rpm: ${this.throttle.per(6e4)}):`,e),e})},i)}}},505(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ORES=void 0;t.ORES=class{static extract(e,t=.5){const n=[{key:"goodfaith",field:"false",bias:t},{key:"damaging",field:"true",bias:1-t}],s={};for(const[t,r]of Object.entries(e)){const e=[];for(const t of n){var i,a;const n=r[t.key];if(!n)continue;let s=null!==(i=null===(a=n.probability)||void 0===a?void 0:a[t.field])&&void 0!==i?i:n[t.field];void 0===s&&void 0!==n.prediction&&(s=+n.prediction),void 0===s||isNaN(s)||e.push(s*(t.bias||0))}s[t]=0===e.length?NaN:e.reduce((e,t)=>e+t,0)/e.length}return s}}},8582(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.__servers__=void 0;t.__servers__=[{name:"English",host:"en.wikipedia.org",language_code:"en",tag:!0,pending_changes:!0},{name:"seperator"},{name:"Test",host:"test2.wikipedia.org",language_code:"en",tag:!1,pending_changes:!0}]},2535(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.API=void 0;var s=n(4551),i=n(8878),a=n(4112);function r(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function o(e,t,n){return e.set(d(e,t),n),n}function l(e,t){return e.get(d(e,t))}function d(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}const c=new Set([]);let u=t.API=void 0;var p,g,h,m;window.isElectron?t.API=(p=new WeakMap,g=new WeakMap,h=new WeakMap,u=class{static chunk(e,t=50){const n=[],s=e.length;for(let i=0;i<s;i+=t)n.push(e.slice(i,i+t));return n}static paramify(e){return Array.isArray(e)||(e=[e]),[...new Set(e)].filter(e=>"string"==typeof e&&e.trim())}get username(){return l(h,this)}get hasPendingChanges(){return c.has(l(g,this))}constructor(e,t,n,s){r(this,p,null),r(this,g,null),r(this,h,null),o(p,this,e),o(g,this,t),o(h,this,n);for(const e of s)c.add(e)}build(e={}){return{assertuser:l(h,this),discussiontoolsautosubscribe:"no",...e}}summary(e,t){const n=" ([[:en:WP:WikiShield|WS]])",i=`${e}${t?`: ${t}`:""}`;return`${(0,s.truncate)(i,473)}${n}`}user(e){return`[[Special:Contribs/${e}|${e}]] ([[User talk:${e}|talk]])`}revision(e){return`[[Special:Diff/${e}|${e}]]`}centralAuthUser(e){return`[[Special:CentralAuth/${e}|${e}]]`}async post(e,t,n){try{return await electron.mwapi("post",e,t,n)}catch(e){var s;if("assertnameduserfailed"===e||null!==(s=e.message)&&void 0!==s&&s.includes("assertnameduserfailed"))return l(p,this).disable("Invalid account","Your account was logged out or changed.");throw e}}async continuous(e,t,n,s){try{let i=null;const a=[];do{const r=await this.post({...e,...i||{}},n,s);if(a.push(r),i=r.continue||null,"function"==typeof t&&!0===await t(r,a)){i=!0;break}}while(i);return{stopped:null!==i,responses:a}}catch(e){return console.error("Continuous error:",e),{stopped:!0,responses:[]}}}async getToken(e="csrf",t,n){return await electron.mwapi("getToken",e,t,n)}async postWithToken(e,t="csrf",n,s){return await electron.mwapi("postWithToken",e,t,n,s)}async account(e,t){return await electron.mwapi("account",e,t)}async getGlobalUserInfo(e,t,n){return await electron.mwapi("getGlobalUserInfo",e,t,n)}async markWatchlistSeen(e,t,n,s){return await electron.mwapi("markWatchlistSeen",e,t,n,s)}async append(e,t,n,s,i,a,r){if("function"==typeof i){const o=await electron.mwapi("append",e,t,n,s,!0,a,r);if(o.needsCheck){const l=await i(o.text);return l.valid?await electron.mwapi("append",e,t,n,s,void 0,a,r):{valid:!1,reason:l.reason||"Append check failed."}}return o}return await electron.mwapi("append",e,t,n,s,void 0,a,r)}async editSection(e,t,n,s,i,a,r,o){if("function"==typeof a){const l=await electron.mwapi("editSection",e,t,n,s,i,!0,r,o);if(l.needsCheck){const d=await a(l.text);return d.valid?await electron.mwapi("editSection",e,t,n,s,i,void 0,r,o):{valid:!1,reason:d.reason||"Edit section check failed."}}return l}return await electron.mwapi("editSection",e,t,n,s,i,void 0,r,o)}async acceptPendingEdit(e,t,n,s){return await electron.mwapi("acceptPendingEdit",e,t,n,s)}async rejectPendingEdit(e,t,n,s,i,a){return await electron.mwapi("rejectPendingEdit",e,t,n,s,i,a)}async rollbackEdit(e,t,n,s,i){return await electron.mwapi("rollbackEdit",e,t,n,s,i)}async undoEdit(e,t,n,s,i){return await electron.mwapi("undoEdit",e,t,n,s,i)}async restoreEdit(e,t,n,s,i){return await electron.mwapi("restoreEdit",e,t,n,s,i)}async thankRevision(e,t,n){return await electron.mwapi("thankRevision",e,t,n)}async watchPage(e,t,n,s){return await electron.mwapi("watchPage",e,t,n,s)}async unwatchPage(e,t,n){return await electron.mwapi("unwatchPage",e,t,n)}async parse(e,t,n=!1,s,i){return await electron.mwapi("parse",e,t,n,s,i)}async getTags(e,t){return await electron.mwapi("getTags",e,t)}async getPagesContent(e,t,n){return await electron.mwapi("getPagesContent",e,t,n)}async getRevisionContent(e,t,n){return await electron.mwapi("getRevisionContent",e,t,n)}async getLatestIds(e,t,n){return await electron.mwapi("getLatestIds",e,t,n)}async getEditCounts(e,t,n){return await electron.mwapi("getEditCounts",e,t,n)}async areUsersBlocked(e,t,n){return await electron.mwapi("areUsersBlocked",e,t,n)}async isUserGloballyLocked(e,t,n){return await electron.mwapi("isUserGloballyLocked",e,t,n)}async getContributions(e,t,n,s){return await electron.mwapi("getContributions",e,t,n,s)}async getBlocks(e,t,n){return await electron.mwapi("getBlocks",e,t,n)}async pagesExist(e,t,n){return await electron.mwapi("pagesExist",e,t,n)}async getPagesDetails(e,t,n){return await electron.mwapi("getPagesDetails",e,t,n)}async countPageReverts(e,t,n,s){return await electron.mwapi("countPageReverts",e,t,n,s)}async getHistory(e,t,n,s){return await electron.mwapi("getHistory",e,t,n,s)}async getORES(e,t,n,s){return await electron.mwapi("getORES",e,t,n,s)}async extractORES(e,t){return await electron.mwapi("extractORES",e,t)}async getDiff(e,t,n,s,i){return await electron.mwapi("getDiff",e,t,n,s,i)}async getRevision(e,t,n,s){return await electron.mwapi("getRevision",e,t,n,s)}async getRevisionsBetween(e,t,n,s,i){return await electron.mwapi("getRevisionsBetween",e,t,n,s,i)}async parseUsers(e,t,n,s){return await electron.mwapi("parseUsers",e,t,n,s)}async parseEdits(e,t,n,s,i){return await electron.mwapi("parseEdits",e,t,n,s,i)}async parseAbuselogs(e,t,n,s){return await electron.mwapi("parseAbuselogs",e,t,n,s)}async getConsecutiveEdits(e,t,n,s,i){return await electron.mwapi("getConsecutiveEdits",e,t,n,s,i)}async getAbuseLogRevid(e,t,n){return await electron.mwapi("getAbuseLogRevid",e,t,n)}async feeds(e,t,n,s,i){return await electron.mwapi("feeds",e,t,n,s,i)}}):t.API=(m=new WeakMap,u=class extends i.MediaWikiAPI{get hasPendingChanges(){return c.has(this.server)}constructor(e,t,n,s){super(e,new a.MediaWikiOAuth2(`WikiShield (${t}; ${n})`),t,n),r(this,m,null),o(m,this,e),this.server=t,this.username=n;for(const e of s)c.add(e)}})},691(e,t){function n(e,t,n){s(e,t),t.set(e,n)}function s(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function i(e,t){return e.get(r(e,t))}function a(e,t,n){return e.set(r(e,t),n),n}function r(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Killswitch=void 0;var o=new WeakMap,l=new WeakMap,d=new WeakMap,c=new WeakSet;function u(e){if(i(d,this)[e])for(const n of i(d,this)[e])try{n.callback()}catch(e){}finally{var t;!0===(null===(t=n.options)||void 0===t?void 0:t.once)&&(i(d,this)[e]=i(d,this)[e].filter(e=>e!==n))}return this}t.Killswitch=class{constructor(e){var t,i;s(t=this,i=c),i.add(t),n(this,o,null),n(this,l,null),n(this,d,{okay:[],unsafe:[],update:[],"force-update":[],kill:[]}),a(o,this,e.api)}on(e,t,n={}){return i(d,this)[e]&&i(d,this)[e].push({callback:t,options:n}),this}async check(){try{var e,t,n,s,a,l,d;const m=null!==(e=null===(t=await i(o,this).getPagesContent([p._],!0,"en.wikipedia.org"))||void 0===t?void 0:t[p._])&&void 0!==e?e:"",v=null===(n=JSON.parse(m))||void 0===n?void 0:n.WikiShield;if(!v)throw new Error("No killswitch found");if(v.disabled)return r(c,this,u).call(this,"kill");const f=null!==(s=null===(a=v.reload)||void 0===a?void 0:a.soft)&&void 0!==s?s:0;return(null!==(l=null===(d=v.reload)||void 0===d?void 0:d.hard)&&void 0!==l?l:0)>h._?r(c,this,u).call(this,"force-update"):f>g._?(g._=f,r(c,this,u).call(this,"update")):r(c,this,u).call(this,"okay")}catch(e){return r(c,this,u).call(this,"unsafe")}}monitor(e=1e4){return i(l,this)&&clearInterval(i(l,this)),a(l,this,setInterval(()=>this.check(),+e)),this}};var p={_:"User:LuniZunie/JSON/Killswitch.json"},g={_:11},h={_:1}}},t={};function n(s){var i=t[s];if(void 0!==i)return i.exports;var a=t[s]={exports:{}};return e[s](a,a.exports,n),a.exports}var s=n(8816),i=n(2486);{var a,r;function o(){(0,i.build)().then(s.run).catch(e=>{console.error("Error during build:",e),alert("An error occurred while starting WikiShield. Please check the console for details.")})}switch(null===(a=mw.util.addPortletLink("p-personal",mw.util.getUrl("Wikipedia:WikiShield/run"),"Run WikiShield","pt-wikishield","WikiShield",void 0,"#pt-notifications"))||void 0===a||a.addEventListener("click",e=>{e.preventDefault(),history.pushState({page:"WikiShield"},"",location.href),o()}),addEventListener("popstate",e=>{var t;"WikiShield"===(null===(t=e.state)||void 0===t?void 0:t.page)&&o()}),null===(r=history.state)||void 0===r?void 0:r.page){case"WikiShield":history.replaceState(null,"",location.href);break;case"WikiShield-reload":history.replaceState({page:"WikiShield"},"",location.href),o()}"Wikipedia:WikiShield/run"===mw.config.get("wgRelevantPageName")&&"view"===mw.config.get("wgAction")&&(history.pushState({page:"WikiShield"},"",location.href),o())}}(); dpbmpcdxiegtxnt5ylz8nz31b8rqznu 613754 613752 2026-05-25T17:06:04Z LuniZunie 25284 format to readable, function needs to be async 613754 javascript text/javascript /******/ (function() { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = { /***/ 4279(module) { module.exports = "@import url('https://fonts.googleapis.com/css2?family=Varela+Round&display=swap');\r\n\r\n:root {\r\n\t--max-z-index: 2147483647;\r\n\r\n --body-color: rgba(241, 245, 255, 1);\r\n --body-background: rgba(20, 20, 30, 1);\r\n\r\n font-family: 'Inter', sans-serif;\r\n \tfont-optical-sizing: auto;\r\n -webkit-font-smoothing: antialiased;\r\n\t-moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n* {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n::-webkit-scrollbar {\r\n\twidth: 10px;\r\n\theight: 10px;\r\n}\r\n\r\n::-webkit-scrollbar-track {\r\n\tbackground: transparent;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n\tborder: 2px solid transparent;\r\n border-radius: 10px;\r\n\r\n\t/* Theme dependent */\r\n\tbackground: rgba(255, 255, 255, .1);\r\n\tbackground-clip: content-box;\r\n\r\n\t&:hover {\r\n\t\tborder: 2px solid transparent;\r\n\t\tborder-radius: 10px;\r\n\r\n\t\t/* Theme dependent */\r\n\t\tbackground: rgba(255, 255, 255, .2);\r\n\t\tbackground-clip: content-box;\r\n\t}\r\n}\r\n\r\nhtml, body {\r\n width: 100%;\r\n\theight: 100%;\r\n\r\n\toverflow: hidden;\r\n\r\n /* Theme dependent */\r\n background: linear-gradient(135deg,\r\n\t\trgba(20, 30, 48, 1),\r\n\t\trgba(36, 59, 85, 1)\r\n\t);\r\n}\r\n\r\n@keyframes loading-dots {\r\n\t0%, 100% {\r\n\t\tcontent: '';\r\n\t}\r\n\t25% {\r\n\t\tcontent: '.';\r\n\t}\r\n\t50% {\r\n\t\tcontent: '..';\r\n\t}\r\n\t75% {\r\n\t\tcontent: '...';\r\n\t}\r\n}\r\n\r\n.animate-loading-dots::after {\r\n\tcontent: '';\r\n\r\n\tdisplay: inline-block;\r\n\r\n\tanimation: loading-dots 1.5s steps(3, start) infinite;\r\n}\r\n\r\n.auto-scroll {\r\n white-space: nowrap;\r\n overflow: auto hidden;\r\n\r\n scrollbar-width: none;\r\n -ms-overflow-style: none;\r\n\r\n\t&::-webkit-scrollbar { display: none; }\r\n\r\n & > .auto-scroll-item {\r\n display: inline-block;\r\n\r\n\t\t&:not(:last-child) {\r\n\t\t\tmargin-right: 20px;\r\n\t\t}\r\n }\r\n &:not(:has(> .auto-scroll-item)) {\r\n opacity: 0;\r\n }\r\n}"; /***/ }, /***/ 5540(module) { module.exports = '<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <meta http-equiv="Content-Security-Policy">\n\n <title>WikiShield</title>\n\n <link rel="stylesheet" href="https://fonts.cdnfonts.com/css/open-dyslexic">\n <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.0/css/all.min.css">\n\n <link rel="stylesheet" href="../common/style.css">\n <link rel="stylesheet" href="style.css">\n\n <script type="module" src="script.js"><\/script>\n </head>\n <body>\n <div id="loading">\n <img class="icon" src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n </div>\n <div id="initial" class="hidden">\n\t\t\t<canvas id="dots-canvas"></canvas>\n\t\t\t<div id="welcome-container" class="shimmer shimmer-border">\n\t\t\t\t<div class="shield-container">\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="shield-icon">\n\t\t\t\t\t\t<img src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<h1>Welcome to <span id="wikishield-sikiwhield">WikiShield</span></h1>\n\t\t\t\t<div class="about-links">\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="about-link">About</a>\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia talk:WikiShield" target="_blank" class="about-link">Discuss</a>\n\t\t\t\t\t<span class="about-link">v<span class="VERSION"></span></span>\n\t\t\t\t</div>\n\t\t\t\t<div id="rollback-needed" class="hidden">\n\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<p>You can apply for rollback rights <a rel="noopener" class="request-link" href="https://www.wikidata.org/wiki/Q7765871" target="_blank">here</a>.</p>\n\t\t\t\t</div>\n\t\t\t\t<button type="button" id="start-button">\n\t\t\t\t\tStart WikiShield <i class="fas fa-arrow-right"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n <div id="app" class="hidden">\n <div id="container">\n <div id="queue">\n <div id="queue-top">\n <div id="queue-top-left" class="queue-button-cluster" data-zen-show="alerts,messages">\n <span class="fa fa-bell" id="alerts-icon" data-tooltip="Alerts" data-zen-show="alerts">\n <span id="alerts-count" class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n <span class="fa fa-inbox" id="messages-icon" data-tooltip="Messages" data-zen-show="messages">\n <span id="messages-count" class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="DEFCON">\n <div class="dot"></div>\n <span><span class="DEFCON-RPM">0</span> RPM</span>\n </div>\n <div id="queue-top-right" class="queue-button-cluster">\n <span class="fa fa-envelope" id="email-button" data-tooltip="Email Emergency, ArbCom, or Oversight" data-multiple-hrefs="email" href></span>\n <span class="fa fa-gear" id="settings-icon" data-tooltip="Settings"></span>\n </div>\n </div>\n <div id="queue-tabs">\n <div id="queue-tab-recent" class="queue-tab selected" data-tooltip="Recent edits">\n <span class="fas fa-stopwatch">\n <span class="icon-count hidden gray" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-pending" class="queue-tab" data-tooltip="Pending edits">\n <span class="fas fa-flag">\n <span class="icon-count hidden orange" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-users" class="queue-tab" data-tooltip="User creation logs">\n <span class="fas fa-user">\n <span class="icon-count hidden green" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-watchlist" class="queue-tab" data-tooltip="Watchlist edits">\n <span class="fas fa-book-bookmark">\n <span class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-abuselog" class="queue-tab" data-tooltip="Abuse logs">\n <span class="fas fa-filter-circle-xmark">\n <span class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n </div>\n </div>\n <div id="queue-items" class="queue-list">\n <div class="queue-empty">\n No edits in queue.\n </div>\n </div>\n <div class="width-adjust" id="queue-width-adjust"></div>\n <div id="clear-queue">\n <span class="fa fa-trash"></span>\n </div>\n </div>\n <div id="alerts-panel" class="notification-panel">\n <div id="alerts-header" class="notification-header">\n <span>Alerts</span>\n <span id="mark-all-alerts-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="alerts-list" class="notification-list"></div>\n </div>\n <div id="messages-panel" class="notification-panel">\n <div id="messages-header" class="notification-header">\n <span>Messages</span>\n <span id="mark-all-messages-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="messages-list" class="notification-list"></div>\n </div>\n <div id="right-container">\n <div id="right-content">\n <div id="main-container">\n <div id="edit-details">\n <div class="central">Nothing selected</div>\n </div>\n <div id="previous-item-button" class="nav-item-button">\n <i class="fas fa-chevron-left"></i>\n </div>\n <div id="next-item-button" class="nav-item-button">\n <i class="fas fa-chevron-right"></i>\n </div>\n <div id="ai-analysis-container" class="hidden shimmer shimmer-border">\n <div class="header">\n <i class="fas fa-robot"></i>\n <span class="title">AI Analysis</span>\n <span class="assessment"></span>\n <span class="confidence"></span>\n </div>\n <div class="explanation"></div>\n <div class="issues"></div>\n </div>\n <div id="diff-scroll-up" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-up"></i>\n </div>\n <div id="diff-container"></div>\n <div id="diff-scroll-down" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-down"></i>\n </div>\n <div id="pending-changes-container" class="hidden">\n <div class="accept">Accept</div>\n <div class="reject">Reject</div>\n </div>\n <div id="progress-bar-container"></div>\n <div id="bottom-tools" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-item" data-menu="revert" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-undo"></i>\n <span>Revert</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="warn" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-exclamation-triangle"></i>\n <span>Warn</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="user" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-user"></i>\n <span>User</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="page" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-file-lines"></i>\n <span>Page</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="edit" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-pen-to-square"></i>\n <span>Edit</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n </div>\n <div id="copy-link" data-tooltip="Copy link" data-queue-type="edit,logevent,abuselog">\n <div>\n <i class="fas fa-link"></i>\n </div>\n </div>\n </div>\n <div id="right-details">\n <div id="right-top">\n <div class="tabs">\n <div id="latest-edits-tab" class="tab hidden selected" data-tooltip="Latest edit">\n <i class="fas fa-user"></i>\n </div>\n <div id="consecutive-edits-tab" class="tab hidden" data-tooltip="Consecutive edits">\n <i class="fas fa-users"></i>\n </div>\n </div>\n\n <div class="icons"></div>\n </div>\n\n <div id="user-contributions" class="section" data-queue-type="edit,logevent,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-user-contributions" class="fas fa-rotate"></i> Contributions</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View all contributions</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div id="page-history" class="section" data-queue-type="edit,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-page-history" class="fas fa-rotate"></i> Page History</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View full page history</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div class="width-adjust" id="details-width-adjust"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="bottom-tool-menu" id="revert-menu"></div>\n <div class="bottom-tool-menu" id="warn-menu"></div>\n <div class="bottom-tool-menu" id="user-menu">\n <div id="user-open-user-page" class="menu-option">\n <i class="fas fa-user-circle"></i>\n <span>Open user page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-open-user-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open user talk</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-contribs" class="menu-option">\n <i class="fas fa-list"></i>\n <span>View contributions</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-filter-log" class="menu-option">\n <i class="fas fa-filter"></i>\n <span>View filter log</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="user-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist user</span>\n </div>\n <div id="user-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist user</span>\n </div>\n <div id="user-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight user</span>\n </div>\n <div id="user-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight user</span>\n </div>\n <div class="menu-divider"></div>\n <div id="user-welcome" class="menu-option submenu-trigger">\n <i class="fas fa-paper-plane"></i>\n <span>Welcome</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-aiv" class="menu-option submenu-trigger">\n <i class="fas fa-flag"></i>\n <span>Report (AIV)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-uaa" class="menu-option submenu-trigger">\n <i class="fas fa-user-slash"></i>\n <span>Report (UAA)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-request-global-block" class="menu-option submenu-trigger">\n <i class="fas fa-ban"></i>\n <span>Request global block</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-request-global-lock" class="menu-option submenu-trigger">\n <i class="fas fa-lock"></i>\n <span>Request global lock</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>Message user</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="page-menu">\n <div id="page-open-page" class="menu-option">\n <i class="fas fa-file"></i>\n <span>Open page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-open-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open talk page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-view-history" class="menu-option">\n <i class="fas fa-clock-rotate-left"></i>\n <span>View page history</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="page-watch" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>Watch page</span>\n </div>\n <div id="page-unwatch" class="menu-option">\n <i class="fas fa-eye-slash"></i>\n <span>Unwatch page</span>\n </div>\n <div id="page-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist page</span>\n </div>\n <div id="page-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist page</span>\n </div>\n <div id="page-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight page</span>\n </div>\n <div id="page-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight page</span>\n </div>\n <div class="menu-divider"></div>\n <div id="page-request-protection" class="menu-option submenu-trigger">\n <i class="fas fa-shield-halved"></i>\n <span>Request protection</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="page-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>New talk page topic</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="edit-menu">\n <div id="edit-view-revision" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>View revision</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="edit-view-diff" class="menu-option">\n <i class="fas fa-code-compare"></i>\n <span>View diff</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="edit-thank-user" class="menu-option">\n <i class="fas fa-heart"></i>\n <span>Thank user</span>\n </div>\n <div id="edit-rollback" class="menu-option submenu-trigger">\n <i class="fas fa-rotate-left"></i>\n <span>Rollback</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-rollback-goodfaith" class="menu-option submenu-trigger">\n <i class="fas fa-handshake"></i>\n <span>Rollback (good faith)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-undo" class="menu-option submenu-trigger">\n <i class="fas fa-arrow-rotate-left"></i>\n <span>Undo</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n\n <div id="settings-container">\n <div class="settings">\n <div class="settings-left">\n <div class="settings-category">\n <div class="settings-category-header">\n <span>CORE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-general-button">\n <span><i class="fas fa-gear"></i>General</span>\n </div>\n <div class="settings-left-menu-item" id="settings-audio-button">\n <span><i class="fas fa-volume-high"></i>Audio</span>\n </div>\n <div class="settings-left-menu-item" id="settings-controls-button">\n <span><i class="fas fa-keyboard"></i>Controls</span>\n </div>\n <div class="settings-left-menu-item" id="settings-zen-button">\n <span><i class="fas fa-spa"></i>Zen Mode</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>APPEARANCE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-app-button">\n <span><i class="fas fa-palette"></i>App</span>\n </div>\n <div class="settings-left-menu-item" id="settings-queue-button">\n <span><i class="fas fa-list"></i>Queue</span>\n </div>\n <div class="settings-left-menu-item" id="settings-accessibility-button">\n <span><i class="fas fa-universal-access"></i>Accessibility</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>TOOLS</span>\n </div>\n <div class="settings-left-menu-item" id="settings-auto-reporting-button">\n <span><i class="fas fa-flag"></i>Auto Reporting</span>\n </div>\n <div class="settings-left-menu-item" id="settings-gadgets-button">\n <span><i class="fas fa-toolbox"></i>Gadgets</span>\n </div>\n <div class="settings-left-menu-item" id="settings-AI-button">\n <span><i class="fas fa-robot"></i>AI Analysis</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WHITELIST</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-whitelist-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>HIGHLIGHT</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-highlight-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>DATA</span>\n </div>\n <div class="settings-left-menu-item" id="settings-statistics-button">\n <span><i class="fas fa-chart-area"></i>Statistics</span>\n </div>\n <div class="settings-left-menu-item" id="settings-save-button">\n <span><i class="fas fa-floppy-disk"></i>Save</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WIKISHIELD</span>\n </div>\n <div class="settings-left-menu-item" id="settings-changelog-button">\n <span><i class="fas fa-file-alt"></i>Changelog</span>\n </div>\n <div class="settings-left-menu-item" id="settings-about-button">\n <span><i class="fas fa-info"></i>About</span>\n </div>\n </div>\n </div>\n <div class="settings-right">\n <div class="general hidden">\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum edit count</div>\n <div class="settings-section-desc">Edits from users with more than this number of total edits will not be shown unless that user is highlighted.</div>\n <numeric-input id="settings-maximum-edit-count" step="5" min="0" value="50"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum queue size</div>\n <div class="settings-section-desc">Maximum number of edits to keep in the queue for review. Higher values may impact performance.</div>\n <numeric-input id="settings-maximum-queue-size" step="10" min="0" value="100"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Minimum ORES score</div>\n <div class="settings-section-desc">Minimum ORES score required for an edit to appear in the recent changes queue.</div>\n <numeric-input id="settings-minimum-ores-score" step="0.05" min="0" max="1" value="0"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">ORES bias</div>\n <div class="settings-section-desc">\n Select how ORES scores are calculated for edits in the recent changes queue. "Badfaith" is how likely an edit is to be made in bad faith, "Damaging" is how likely an edit is to be damaging.\n </div>\n <div id="settings-ores-bias" class="settings-slider">\n <div class="settings-slider-labels">\n <div class="settings-slider-label-left active">Badfaith<span class="percent">50%</span></div>\n <div class="settings-slider-label-right active">Damaging<span class="percent">50%</span></div>\n </div>\n <div class="settings-slider-track">\n <div class="settings-slider-thumb"></div>\n </div>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Watchlist expiry</div>\n <div class="settings-section-desc">Amount of time to leave warned user\'s talk pages on your watchlist.</div>\n <duration-input id="settings-watchlist-expiry"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Namespaces to monitor</div>\n <div class="settings-section-desc">Select which namespaces WikiShield should monitor for recent changes and pending changes.</div>\n <div id="settings-namespaces-container" class="checkbox-container">\n \x3c!-- Namespace checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="audio hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">ORES</span>\n <span>ORES Alerts</span>\n </div>\n <div class="settings-section compact inline" id="sound-alert-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Sound alerts for high ORES scores</div>\n <div class="settings-section-desc">Play a sound when an edit above the threshold is added to the queue</div>\n </div>\n <toggle-input id="settings-ORES-alert-toggle" value="false"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="sound-alert-ores-score">\n <div class="settings-section-content">\n <div class="settings-section-title">ORES score threshold</div>\n <div class="settings-section-desc">Play a sound alert when an edit with an ORES score above this value is added</div>\n </div>\n <numeric-input id="settings-ORES-alert-threshold" step="0.05" min="0" max="1" value="0.9"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Volume</div>\n <volume-control\n id="settings-master-volume"\n title="Master Volume"\n description="Controls the overall volume of all sounds"\n value="1"\n ></volume-control>\n <div id="settings-sounds-container" class="settings-section">\n \x3c!-- Individual sound settings will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="controls hidden">\n <div class="settings-section">\n <div class="settings-section-title">Keyboard shortcuts</div>\n <div class="settings-section-desc">Customize keyboard shortcuts for various actions in WikiShield.</div>\n <div class="settings-section compact inline" id="repeat-control-scripts">\n <div class="settings-section-content">\n <div class="settings-section-title">Repeat control scripts</div>\n <div class="settings-section-desc">Allow control scripts to be triggered repeatedly when holding down keys</div>\n </div>\n <toggle-input id="repeat-control-scripts-toggle" value="true"></toggle-input>\n </div>\n <button type="button" id="settings-new-control-script" class="add-action-button new-control-script"><span class="fa fa-plus"></span> Add new action</button>\n </div>\n </div>\n <div class="zen hidden">\n <div class="settings-section">\n <div class="settings-section-title">Zen Mode</div>\n <div class="settings-section-desc">Your distraction-free editing experience.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Zen Mode</div>\n <div class="settings-section-desc">Reduce on-screen distractions while reviewing edits.</div>\n </div>\n <toggle-input id="settings-zen-mode" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Customize Zen Mode</div>\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Sound</div>\n <div class="settings-section-desc">Play sound in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-sound" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Music</div>\n <div class="settings-section-desc">Play background music in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-music" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Alerts</div>\n <div class="settings-section-desc">Show alerts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-alerts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Messages</div>\n <div class="settings-section-desc">Show messages in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-messages" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Toasts</div>\n <div class="settings-section-desc">Show toasts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-toasts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Badges</div>\n <div class="settings-section-desc">Show badges in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-badges" value="true"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="app hidden">\n <div class="settings-section" data-electron="false">\n <div class="settings-section-title">Launch behavior</div>\n <div class="settings-section-desc">Choose whether WikiShield should open inthe current tabor a new tab when launched.</div>\n <div id="settings-launch-behavior" class="settings-radio-group">\n <div class="settings-radio-option selected" data-value="current_tab">Open in current tab</div>\n <div class="settings-radio-option" data-value="new_tab">Open in new tab</div>\n </div>\n </div>\n \x3c!-- <div class="settings-section">\n <div class="settings-section-title">App theme</div>\n <div class="settings-section-desc">Choose between light mode, dark mode, or automatic switching based on system settings.</div>\n <div id="settings-app-theme" class="settings-radio-group">\n <div class="settings-radio-option" data-value="light">Light mode</div>\n <div class="settings-radio-option selected" data-value="auto">Auto</div>\n <div class="settings-radio-option" data-value="dark">Dark mode</div>\n </div>\n </div> --\x3e\n <div class="settings-section">\n <div class="settings-section-title">Startup animation</div>\n <div class="settings-section-desc">Enable or disable the startup animation when launching WikiShield.</div>\n <div id="settings-startup-performance" class="settings-radio-group">\n <div class="settings-radio-option" data-value="always_off">Always off</div>\n <div class="settings-radio-option selected" data-value="adaptive">Adaptive (recommended)</div>\n <div class="settings-radio-option" data-value="always_on">Always on</div>\n </div>\n </div>\n </div>\n <div class="queue hidden">\n <div class="settings-section">\n <div class="settings-section-title">Queues</div>\n <div class="settings-section-desc">Enable or disable different edit queues, and customize their order.</div>\n <draggable-order-list id="settings-queues">\n \x3c!-- Queue items will be populated here --\x3e\n </draggable-order-list>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Color palette</div>\n <div class="settings-section-desc">Select the color palette used for highlighting users and pages.</div>\n <div id="settings-palette-selector" class="palette-selector">\n\n </div>\n </div>\n </div>\n <div class="accessibility hidden">\n <div class="settings-section">\n <div class="settings-section-title">Accessibility Options</div>\n <div class="settings-section-desc">Customize accessibility features for better usability.</div>\n <div class="settings-compact-grid">\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">Colorblind Mode</div>\n <div class="settings-section-desc">Add indicators to help distinguish colors for colorblind users.</div>\n <toggle-input id="settings-colorblind-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Dyslexia Friendly Font</div>\n <div class="settings-section-desc">Use a font that is easier to read for users with dyslexia.</div>\n <toggle-input id="settings-dyslexia-font" value="false"></toggle-input>\n </div>\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">High Contrast Mode</div>\n <div class="settings-section-desc">Increase contrast for better visibility.</div>\n <toggle-input id="settings-high-contrast-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Reduce Motion</div>\n <div class="settings-section-desc">Minimize motion effects for users sensitive to motion.</div>\n <toggle-input id="settings-reduce-motion" value="false"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="auto-reporting hidden">\n <div class="settings-section">\n <div class="settings-section-title">Enable Auto Reporting</div>\n <div class="settings-section-desc">Automatically report edits that receive certain warnings.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Auto Reporting</div>\n <div class="settings-section-desc">When enabled, edits that trigger selected warnings will be automatically reported.</div>\n </div>\n <toggle-input id="settings-auto-reporting-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Auto Reporting Warnings</div>\n <div class="settings-section-desc">Select which warnings should trigger automatic reporting.</div>\n <div id="settings-auto-reporting-warnings-container" class="checkbox-container">\n \x3c!-- Warning checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="gadgets hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-title">Gadgets</div>\n <div class="settings-section-desc">Toggle various Wikishield features.</div>\n <div class="settings-section compact inline" id="auto-welcome-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Automatic welcoming of new users</div>\n <div class="settings-section-desc">Automatically welcome new users with empty talk pages when moving past their constructive edits</div>\n </div>\n <toggle-input id="settings-auto-welcome-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="wikipedia-popups-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Popups</div>\n <div class="settings-section-desc">When enabled, links will be opened in a new window. Otherwise, they will be opened in your default browser. (Not supported by Opera or Safari browsers)</div>\n </div>\n <toggle-input id="settings-wikipedia-popups-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="talk-page-thanks-for-temporary-users-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Send talk page thanks for temporary users</div>\n <div class="settings-section-desc">If enabled, when you thank a temporary user with an empty talk page, WikiShield will send them a welcoming thank you message in addition to the standard thank you message.</div>\n </div>\n <toggle-input id="settings-edit-summaries-toggle" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Username Highlighting</div>\n <div class="settings-section compact inline" id="username-highlighting-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable username highlighting</div>\n <div class="settings-section-desc">Highlights usernames in edit summaries, edit diffs, and user creation logs.</div>\n </div>\n <toggle-input id="settings-username-highlighting-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="username-highlighting-mode-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Toggle fuzzy matching mode</div>\n <div class="settings-section-desc">\n When enabled, highlights similar usernames. Not recommended for users with short usernames.<br/>\n <strong>NOTE:</strong> This may cause performance issues for those with long usernames, or users on weaker devices.\n </div>\n </div>\n <toggle-input id="settings-username-highlighting-fuzzy-toggle" value="false"></toggle-input>\n </div>\n </div>\n </div>\n <div class="AI hidden">\n <div class="settings-section">\n <div class="settings-section-title">AI Analysis</div>\n <div class="settings-section-desc">Configure AI-powered analysis features.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Ollama AI Analysis &lpar;<a href="https://ollama.com">ollama.com</a>&rpar;</div>\n <div class="settings-section-desc">Use local AI models with complete privacy.</div>\n </div>\n <toggle-input id="settings-AI-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">Tools</span>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Edit Analysis</div>\n <div class="settings-section-desc">Suggests actions to take on edits.</div>\n </div>\n <toggle-input id="settings-AI-edit-analysis-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Username Analysis</div>\n <div class="settings-section-desc">Flags potentially problematic usernames and prompts you to report them to UAA</div>\n </div>\n <toggle-input id="settings-AI-username-analysis-toggle" value="true"></toggle-input>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-server-url">\n <div class="settings-section-title">Server URL</div>\n <div class="settings-section-desc">The URL of your local Ollama server</div>\n <div class="text-input-container">\n <input title="Ollama URL" type="text" id="ollama-url-input" autoComplete="off">\n <button type="button" id="settings-ollama-test-connection">Test Connection</button>\n </div>\n <div class="settings-section compact connection-status-container">\n <p id="settings-ollama-connection-status"></p>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-model-select">\n <div class="settings-section-title">\n Model Selection\n <button type="button" id="settings-ollama-refresh-models">\n <span class="fa fa-sync"></span> Refresh Models\n </button>\n </div>\n <div class="settings-section-desc">Select which Ollama model to use for edit analysis</div>\n <div class="settings-section compact models-container">\n <p id="settings-ollama-models-status">Click "Refresh Models" to load available models</p>\n <div id="settings-ollama-models"></div>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-setup">\n <div class="settings-section-title">Setup required</div>\n <div class="settings-section-desc">\n <details>\n <summary><strong>Windows (Permanent)</strong></summary>\n <ol class="pad-list">\n <li>Press <code>Win + R</code>, type <code>sysdm.cpl</code>, and press Enter</li>\n <li>Go to the "Advanced" tab and click on "Environment Variables"</li>\n <li>Create a new variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_HOST</code> and the value to <code>http://127.0.0.11434</code>\n <ul class="pad-list">\n <li><strong>NOTE:</strong> You can change the port (11434) if that port is already in use, but make sure to update the "Server URL" setting in WikiShield accordingly</li>\n </ul>\n </li>\n <li>Click "OK" to save the variable</li>\n <li>Create another variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_ORIGINS</code> and the value to <code>https://*.wikipedia.org</code></li>\n <li>Click "OK" to save the variable, you can now close the Environment Variables and System Properties windows</li>\n <li>Restart Ollama</li>\n </ol>\n </details>\n\n <details>\n <summary><strong>Windows (Temporary)</strong></summary>\n <pre>\n$env:OLLAMA_HOST="http://127.0.0.11434"\n$env:OLLAMA_ORIGINS="https://*.wikipedia.org"\nollama serve</pre>\n </details>\n\n <details>\n <summary><strong>macOS / Linux</strong></summary>\n Add the following to <code>~/.bashrc</code> or <code>~/.zshrc</code>:\n <pre>\nexport OLLAMA_HOST="http://127.0.0.11434"\nexport OLLAMA_ORIGINS="https://*.wikipedia.org"</pre>\n Then run:\n <pre>source ~/.bashrc && ollama serve</pre>\n </details>\n </div>\n </div>\n </div>\n\n <div class="whitelist users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted users</div>\n <div class="settings-section-desc">Amount of time before a whitelisted user is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-users-expiry" label="Default expiry for whitelisted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Users</div>\n <div class="settings-section-desc">Manage your list of whitelisted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-users-input" placeholder="Add user to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-whitelist-users-list" class="settings-section list-container">\n \x3c!-- Whitelisted users will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted pages</div>\n <div class="settings-section-desc">Amount of time before a whitelisted page is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-pages-expiry" label="Default expiry for whitelisted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Pages</div>\n <div class="settings-section-desc">Manage your list of whitelisted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-pages-input" placeholder="Add page to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-whitelist-pages-list" class="settings-section list-container">\n \x3c!-- Whitelisted pages will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted tags</div>\n <div class="settings-section-desc">Amount of time before a whitelisted tag is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-tags-expiry" label="Default expiry for whitelisted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Tags</div>\n <div class="settings-section-desc">Manage your list of whitelisted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-tags-input" placeholder="Add tag to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-whitelist-tags-list" class="settings-section list-container">\n \x3c!-- Whitelisted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="highlight users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted users</div>\n <div class="settings-section-desc">Amount of time before a highlighted user is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-users-expiry" label="Default expiry for highlighted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Users</div>\n <div class="settings-section-desc">Manage your list of highlighted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-users-input" placeholder="Add user to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-highlight-users-list" class="settings-section list-container">\n \x3c!-- Highlighted users will be populated here --\x3e\n </div>\n </div>\n <div class="highlight pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted pages</div>\n <div class="settings-section-desc">Amount of time before a highlighted page is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-pages-expiry" label="Default expiry for highlighted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Pages</div>\n <div class="settings-section-desc">Manage your list of highlighted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-pages-input" placeholder="Add page to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-highlight-pages-list" class="settings-section list-container">\n \x3c!-- Highlighted pages will be populated here --\x3e\n </div>\n </div>\n <div class="highlight tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted tags</div>\n <div class="settings-section-desc">Amount of time before a highlighted tag is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-tags-expiry" label="Default expiry for highlighted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Tags</div>\n <div class="settings-section-desc">Manage your list of highlighted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-tags-input" placeholder="Add tag to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-highlight-tags-list" class="settings-section list-container">\n \x3c!-- Highlighted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="statistics hidden">\n <div class="settings-section">\n <div class="settings-section-title">\n Statistics Overview\n <button type="button" id="reset-statistics-button">Reset Statistics</button>\n </div>\n <div class="stats-grid">\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-total-reviewed" class="stat-value"></div>\n <div class="stat-label">Edits Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have thanked <span id="stats-thanks-percentage"></span>% of the edits you reviewed\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-recent-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Recent Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n Recent changes make up <span id="stats-recent-changes-percentage"></span>% of your reviewed edits\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pending-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Pending Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have accepted <span id="stats-pending-changes-accepted"></span> &lpar;\n <span id="stats-pending-changes-accepted-percentage"></span>%\n &rpar; pending changes\n </div>\n <div class="stat-sublabel">\n You have rejected <span id="stats-pending-changes-rejected"></span> &lpar;\n <span id="stats-pending-changes-rejected-percentage"></span>%\n &rpar; pending changes from entering the public eye\n </div>\n <div class="stat-sublabel">\n Out of all the edits you&rsquo;ve reviewed, <span id="stats-pending-changes-percentage"></span>% of them were pending review\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-user-creations-reviewed" class="stat-value"></div>\n <div class="stat-label">User Creations Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-user-creations-percentage"></span>% of your reviews came from user creations\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-watchlist-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Watchlist Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-watchlist-changes-percentage"></span>% of your reviews came from your watchlist\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-abuselog-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Abuse Log Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-abuselog-changes-percentage"></span>% of your reviews came from your abuse log\n </div>\n </div>\n </div>\n </div>\n\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reverts-made" class="stat-value"></div>\n <div class="stat-label">Reverts Made</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reverts-percentage"></span>% of edits that cross your path are reverted by you\n </div>\n <div class="stat-sublabel">\n You assumed good faith <span id="stats-goodfaith-reverts-percentage"></span>% of the time\n </div>\n <div class="stat-sublabel">\n <span id="stats-recent-reverts-percentage"></span>% of your reverts were from recent changes\n </div>\n <div class="stat-sublabel">\n <span id="stats-pending-reverts-percentage"></span>% of your reverts were pending\n </div>\n <div class="stat-sublabel">\n <span id="stats-watchlist-reverts-percentage"></span>% of your reverts were from your watchlist\n </div>\n <div class="stat-sublabel">\n <span id="stats-abuselog-reverts-percentage"></span>% of your reverts were from your abuse log\n </div>\n <div class="stat-sublabel">\n &hellip;and the last <span id="stats-other-reverts-percentage"></span>% weren&rsquo;t even in your queue!\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-users-welcomed" class="stat-value"></div>\n <div class="stat-label">Users Welcomed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-welcomed-message"></span>\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-warnings" class="stat-value"></div>\n <div class="stat-label">Warnings Issued</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-warning-1-percentage"></span>% were level 1\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-2-percentage"></span>% were level 2\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-3-percentage"></span>% were level 3\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4-percentage"></span>% were level 4\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4im-percentage"></span>% were level 4im\n </div>\n <div class="stat-sublabel">\n &hellip;and the rest we were too lazy to track =&rpar;\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reports" class="stat-value"></div>\n <div class="stat-label">Reports Filed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n AIV accounted for <span id="stats-AIV-reports-percentage"></span>% of your reports\n </div>\n <div class="stat-sublabel">\n another <span id="stats-UAA-reports-percentage"></span>% were for UAA\n </div>\n <div class="stat-sublabel">\n <span id="stats-global-block-reports-percentage"></span>% were for global block requests\n </div>\n <div class="stat-sublabel">\n while <span id="stats-global-lock-reports-percentage"></span>% were for global lock requests\n </div>\n <div class="stat-sublabel">\n finally, <span id="stats-RFPP-reports-percentage"></span>% were posted at RFPP\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pages-watched" class="stat-value"></div>\n <div class="stat-label">Pages Watched</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-pages-unwatched"></span> pages were annoying enough to be unwatched\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-whitelisted" class="stat-value"></div>\n <div class="stat-label">Items Whitelisted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-whitelisted"></span> &lpar;\n <span id="stats-users-whitelisted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-whitelisted"></span> &lpar;\n <span id="stats-pages-whitelisted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-whitelisted"></span> &lpar;\n <span id="stats-tags-whitelisted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-highlighted" class="stat-value"></div>\n <div class="stat-label">Items Highlighted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-highlighted"></span> &lpar;\n <span id="stats-users-highlighted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-highlighted"></span> &lpar;\n <span id="stats-pages-highlighted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-highlighted"></span> &lpar;\n <span id="stats-tags-highlighted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-session-time" class="stat-value"></div>\n <div class="stat-label">Session Time</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reports-per-day"></span> reports per day\n </div>\n <div class="stat-sublabel">\n <span id="stats-reverts-per-hour"></span> reverts per hour\n </div>\n <div class="stat-sublabel">\n <span id="stats-reviews-per-minute"></span> reviews per minute\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="save hidden">\n <div class="save settings-section">\n <div class="save-settings-header">\n <div class="settings-section-title">Save Settings</div>\n <div class="settings-section-desc">Manage how and where your WikiShield settings are stored.</div>\n </div>\n\n <div class="save-settings-content">\n <div class="save-settings-card data-management-card">\n <div class="card-header">\n <div class="card-icon">\n <i class="fa fa-database"></i>\n </div>\n <div class="card-header-content">\n <div class="card-title">Data Management</div>\n <div class="card-desc">Import, export, or reset your WikiShield settings. Settings are encoded as base64 for easy sharing.</div>\n </div>\n </div>\n\n <div class="card-body">\n <div class="action-buttons-grid">\n <button type="button" id="settings-export-button" class="action-card export-card">\n <div class="action-card-icon">\n <i class="fa fa-download"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Export Settings</div>\n <div class="action-card-desc">Save your configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-import-button" class="action-card import-card">\n <div class="action-card-icon">\n <i class="fa fa-upload"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Import Settings</div>\n <div class="action-card-desc">Load saved configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-reset-button" class="action-card reset-card">\n <div class="action-card-icon">\n <i class="fa fa-undo"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Reset Settings</div>\n <div class="action-card-desc">Restore to defaults</div>\n </div>\n </button>\n </div>\n\n <div id="settings-save-status" class="status-message hidden"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="changelog hidden">\n <div class="settings-section">\n <div class="changelog-content">\n\n </div>\n </div>\n </div>\n <div class="about hidden">\n <div class="settings-section">\n <div class="about-content">\n <div class="about-version">\n <span class="fa fa-shield-alt"></span>\n <span>WikiShield v<span id="settings-about-version"></span></span>\n </div>\n\n <div class="about-tagline">\n <p>A powerful, real-time patrolling tool for Wikipedia editors</p>\n </div>\n\n <div class="about-links">\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="link-card docs">\n <div class="link-card-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Documentation</div>\n <div class="link-card-desc">Learn how to use WikiShield</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://github.com/LuniZunie/WikiShield-App" target="_blank" class="link-card source">\n <div class="link-card-icon">\n <span class="fa fa-code-branch"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Source Code</div>\n <div class="link-card-desc">View on GitHub</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia_talk:WikiShield" target="_blank" class="link-card feedback">\n <div class="link-card-icon">\n <span class="fa fa-comments"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Feedback</div>\n <div class="link-card-desc">Share your thoughts</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n </div>\n\n <div class="about-footer">\n <div class="footer-divider"></div>\n <div class="about-credits">\n <div>\n <div class="credit-card" data-link="https://about.luni.me">\n <div class="credit-icon">\n <span class="fa fa-code"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">LuniZunie</div>\n <div class="credit-role auto-scroll">Lead Developer</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Ingenuity">\n <div class="credit-icon">\n <span class="fa fa-lightbulb"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Ingenuity</div>\n <div class="credit-role auto-scroll">Original Creator</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Monkeysmashingkeyboards">\n <div class="credit-icon">\n <span class="fa fa-database"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Monkeysmashingkeyboards</div>\n <div class="credit-role auto-scroll">Backend</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:pro-anti-air">\n <div class="credit-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Pro-anti-air</div>\n <div class="credit-role auto-scroll">Documentation</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Chaotic_Enby">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Chaotic Enby</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:HurricaneZeta">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">HurricaneZeta</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="copyright-card" data-link="https://sound-effects.bbcrewind.co.uk">\n <div class="copyright-title auto-scroll">Nature sounds</div>\n <div class="copyright-desc auto-scroll">bbc.co.uk &ndash; &copy; copyright 2026 BBC</div>\n </div>\n <div class="copyright-card" data-link="https://pixabay.com/sound-effects">\n <div class="copyright-title auto-scroll">Sound effects</div>\n <div class="copyright-desc auto-scroll">pixabay.com &ndash; CC0 License</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </body>\n</html>'; /***/ }, /***/ 2459(module) { module.exports = "@keyframes startup {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes particles {\n\t0%, 100% {\n\t\ttransform: translate(0, 0) rotate(0deg);\n\t}\n\t33% {\n\t\ttransform: translate(30px, -30px) rotate(120deg);\n\t}\n\t66% {\n\t\ttransform: translate(-20px, 20px) rotate(240deg);\n\t}\n}\n\n@keyframes container-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(30px) scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0) scale(1);\n\t}\n}\n\n@keyframes border-glow {\n\t0%, 100% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 40px rgba(102, 126, 234, .4),\n\t\t\t0 0 80px rgba(240, 147, 251, .3),\n\t\t\tinset 0 0 60px rgba(102, 126, 234, .15),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .2);\n\t}\n\t50% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 60px rgba(240, 147, 251, .6),\n\t\t\t0 0 120px rgba(102, 126, 234, .4),\n\t\t\tinset 0 0 80px rgba(240, 147, 251, .2),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .3);\n\t}\n}\n\n@keyframes shield-entrance {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: scale(0) rotate(-180deg);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: scale(1.15) rotate(10deg);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: scale(1) rotate(0deg);\n\t}\n}\n\n@keyframes shield-float {\n\t0%, 100% {\n\t\ttransform: translate(-50%, -50%) translateY(0px);\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) translateY(-10px);\n\t}\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: translate(-50%, -50%) scale(.8);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t\topacity: 0.8;\n\t}\n\t100% {\n\t\ttransform: translate(-50%, -50%) scale(1.5);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes sparkle {\n\t0%, 100% {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: scale(1.5);\n\t\topacity: 1;\n\t}\n}\n\n@keyframes title-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-20px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes links-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes warning-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes button-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(40px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes fade-in {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n@keyframes fade-out {\n\tfrom {\n\t\topacity: 1;\n\t}\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-in {\n\tfrom {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n}\n@keyframes scale-out {\n\tfrom {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n\tto {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-x {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n}\n\n@keyframes bottom-tool-menu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n@keyframes bottom-tool-submenu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateX(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n}\n\n@keyframes toast-alert-enter {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: translateX(100%) scale(.8);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: translateX(-10px) scale(1.05);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n}\n@keyframes toast-alert-leave {\n\t0% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n\t100% {\n\t\topacity: 0;\n\t\ttransform: translateX(150%) scale(.7);\n\t}\n}\n\n@keyframes music-toast-enter {\n from {\n opacity: 0;\n transform: translateX(150%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes music-toast-leave {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(150%);\n }\n}\n\n@keyframes tooltip-enter {\n from {\n\t\ttransform: scale(.8);\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes star-spin {\n 0% {\n transform: rotate(0deg) scale(1);\n }\n 50% {\n transform: rotate(180deg) scale(1.3);\n }\n 100% {\n transform: rotate(360deg) scale(1);\n }\n}\n\n@keyframes flash-highlight {\n 0%, 100% {\n filter: brightness(1);\n }\n 50% {\n filter: brightness(.5);\n }\n}\n\n@keyframes logo-loader {\n 0%, 100% {\n transform: scale(1);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 10px rgba(102, 126, 234, .4));\n }\n 50% {\n transform: scale(1.5);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 20px rgba(102, 126, 234, .6));\n }\n}\n\n@keyframes refresh-rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse-DEFCON {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.15);\n }\n 100% {\n transform: scale(1);\n }\n}\n\nbody {\n --transparency: 1;\n\n font-size: clamp(14px, 3vw, 16px);\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n background: rgba(20, 20, 30, 1);\n\n &.dyslexia-font {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n\n *:not(.fa):not(.fas):not(.far):not(.fal):not(.fab) {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n }\n }\n\n &.reduce-motion * {\n animation-duration: 0.001s !important;\n transition-duration: 0.001s !important;\n }\n\n & a {\n text-decoration: none;\n\n &:active {\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n }\n }\n\n & > #popup-blocker {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 1);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease;\n }\n\n & > #loading {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 2);\n\n opacity: 1;\n\n transition: opacity .5s ease;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n & > .icon {\n width: 100vmin;\n }\n }\n\n & > .icon {\n aspect-ratio: 1 / 1;\n width: 12.5vmin;\n\n animation: logo-loader 2s ease-in-out infinite;\n\n transition: width .5s cubic-bezier(0.6, -0.28, 0.735, 0.045);\n }\n }\n\n & > #initial {\n display: flex;\n align-items: center;\n\t justify-content: center;\n\n width: 100%;\n height: 100%;\n\n position: relative;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n display: none;\n }\n\n &:before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 0;\n background:\n radial-gradient(circle at 20% 50%, rgba(102, 126, 234, .08) 0%, transparent 50%),\n radial-gradient(circle at 80% 80%, rgba(118, 75, 162, .06) 0%, transparent 50%);\n pointer-events: none;\n }\n\n &:not(.hidden) {\n animation: startup 1.2s ease-out;\n\n & > #welcome-container {\n animation: container-fade-in 1.2s ease-out;\n\n & > .shield-container {\n animation: shield-entrance 1.5s ease 2s forwards;\n }\n\n & > h1 {\n animation: title-fade-in 0.8s ease-out 0.5s both;\n }\n\n & > .about-links {\n animation: link-slide-in 0.8s ease-out 0.7s both;\n }\n\n & > #rollback-needed {\n animation: warning-fade-in 1s ease-out 0.7s both;\n }\n\n & > button {\n animation: button-slide-in 2s ease-out 1s both;\n }\n }\n }\n\n & > #dots-canvas {\n width: 100%;\n height: 100%;\n\n position: absolute;\n z-index: 0;\n left: 0;\n top: 0;\n }\n\n & > #welcome-container {\n padding: 48px;\n\n border-radius: 16px;\n\n max-width: 480px;\n\n position: relative;\n z-index: 2;\n\n text-align: center;\n\n overflow: hidden;\n\n /* Theme dependent */\n border: 1px solid rgba(143, 163, 255, .15);\n box-shadow:\n 0 12px 40px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & * {\n position: relative;\n z-index: 1;\n }\n\n & > .shield-container {\n width: 100px;\n height: 100px;\n\n position: relative;\n\n margin: 0 auto 24px;\n\n opacity: 0;\n\n & > .glow-ring {\n width: 240px;\n height: 240px;\n\n position: absolute;\n left: 50%;\n top: 50%;\n\n border: 2px solid;\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: pulse 2.5s ease-in-out infinite;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n &:nth-child(2) {\n animation-delay: 0.4s;\n border-color: rgba(118, 75, 162, .25);\n }\n &:nth-child(3) {\n animation-delay: 0.8s;\n border-color: rgba(143, 163, 255, .2);\n }\n }\n\n & > .sparkle {\n width: 5px;\n height: 5px;\n\n position: absolute;\n\n border-radius: 50%;\n\n animation: sparkle 2s ease-in-out infinite;\n\n &:nth-child(4) {\n top: 15%;\n left: 25%;\n\n animation-delay: 0s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .6);\n box-shadow: 0 0 8px rgba(143, 163, 255, .6);\n }\n &:nth-child(5) {\n top: 25%;\n left: 18%;\n\n animation-delay: 0.4s;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .6);\n box-shadow: 0 0 8px rgba(102, 126, 234, .6);\n }\n &:nth-child(6) {\n bottom: 20%;\n\t left: 30%;\n\n animation-delay: 0.8s;\n\n /* Theme dependent */\n background: rgba(118, 75, 162, .5);\n box-shadow: 0 0 8px rgba(118, 75, 162, .5);\n }\n &:nth-child(7) {\n bottom: 25%;\n right: 25%;\n\n animation-delay: 1.2s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .5);\n box-shadow: 0 0 8px rgba(143, 163, 255, .5);\n }\n }\n\n & > .shield-icon {\n width: 100px;\n\n position: absolute;\n z-index: 2;\n left: 50%;\n top: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: shield-float 3s ease-in-out infinite;\n\n /* Theme dependent */\n filter: drop-shadow(0 0 8px rgba(102, 126, 234, .3));\n\n & > img {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 2.2em;\n font-weight: 700;\n line-height: 1.2;\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n }\n\n & > .subtitle {\n margin: 0 0 24px 0;\n\n font-size: 0.95em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 0.8);\n }\n\n & > .about-links {\n display: flex;\n justify-content: center;\n gap: 12px;\n flex-wrap: wrap;\n\n margin: 24px 0;\n\n & > .about-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n padding: 8px 14px;\n\n border: 1px solid;\n border-radius: 8px;\n\n font-size: 0.85em;\n font-weight: 500;\n text-decoration: none;\n\n transition: background .2s ease,\n transform .2s ease,\n color .2s ease,\n border-color .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 0.9);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .2);\n }\n }\n }\n\n & > #rollback-needed {\n margin: 20px 0;\n padding: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(247, 76, 60, .3);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n\t\t inset 0 1px 0 rgba(255, 255, 255, .05);\n background: rgba(247, 76, 60, .08);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n display: none;\n }\n\n & p {\n margin: 6px 0;\n\n font-weight: 400;\n font-size: 0.9em;\n\n /* Theme dependent */\n color: rgba(247, 76, 60, 0.95);\n }\n & a {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n & > button {\n cursor: pointer;\n\n width: 100%;\n\n padding: 12px 24px;\n\n border: 2px solid transparent;\n border-radius: 10px;\n\n position: relative;\n\n font-size: 1em;\n font-weight: 700;\n color: rgba(143, 163, 255, 1);\n letter-spacing: 0.5px;\n\n overflow: hidden;\n\n opacity: 1;\n\n transition: all .25s ease;\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.8), rgba(118, 75, 162, 0.8)) border-box;\n box-shadow:\n 0 0 10px rgba(102, 126, 234, .6),\n 0 0 20px rgba(118, 75, 162, .3),\n inset 0 0 10px rgba(102, 126, 234, .1);\n\n &.hidden {\n display: none;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(160, 180, 255, 1);\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 75, 162, 1)) border-box;\n box-shadow:\n 0 0 15px rgba(102, 126, 234, .8),\n 0 0 30px rgba(118, 75, 162, .5),\n inset 0 0 15px rgba(102, 126, 234, .2);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.7), rgba(118, 75, 162, 0.7)) border-box;\n box-shadow:\n 0 0 8px rgba(102, 126, 234, .5),\n 0 0 16px rgba(118, 75, 162, .3),\n inset 0 0 8px rgba(102, 126, 234, .1);\n }\n\n &::before {\n content: \"\";\n\n width: 100%;\n height: 100%;\n\n position: absolute;\n left: -100%;\n top: 0;\n\n transition: left .4s ease;\n\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1),\n transparent\n );\n }\n\n & > i {\n margin-right: 6px;\n font-size: 14px;\n transition: transform 0.3s ease;\n }\n\n &:hover > i {\n transform: translateX(2px);\n }\n }\n }\n }\n\n & > #app {\n width: 100%;\n height: 100%;\n\n line-height: 1.5;\n color: var(--body-color);\n\n overflow: hidden;\n\n background: var(--body-background);\n\n &.hidden {\n display: none;\n }\n\n & > #container {\n display: flex;\n width: 100%;\n height: 100%;\n\n margin: 0;\n\n overflow: hidden;\n\n & > #queue {\n width: 15vw;\n height: 100%;\n\n position: relative;\n\n border-right: 1px solid;\n\n /* Theme dependent */\n border-right-color: rgba(58, 61, 74, 1);\n\n & > #queue-top {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 69px;\n\n position: relative;\n z-index: 2;\n\n border-bottom: 2px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 8px;\n\n padding: 10px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-button-cluster {\n display: flex;\n align-items: center;\n gap: 20px;\n\n padding: 10px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n font-size: 1.2em;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .fa {\n position: relative;\n }\n\n & > span {\n cursor: pointer;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > #DEFCON {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n padding: 4px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .dot {\n flex: 0 0 auto;\n\n width: 10px;\n height: 10px;\n\n border-radius: 50%;\n\n animation: pulse-DEFCON 2s ease-in-out infinite;\n\n /* Theme dependent */\n background: rgba(100, 100, 100, 1);\n box-shadow: 0 0 0 4px rgba(100, 100, 100, .15);\n\n &.DEFCON-1 {\n background: rgba(255, 75, 75, 1);\n box-shadow: 0 0 0 4px rgba(255, 75, 75, .3);\n }\n &.DEFCON-2 {\n background: rgba(255, 165, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 165, 0, .3);\n }\n &.DEFCON-3 {\n background: rgba(255, 255, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 255, 0, .3);\n }\n &.DEFCON-4 {\n background: rgba(75, 255, 75, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 75, .3);\n }\n &.DEFCON-5 {\n background: rgba(75, 255, 255, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 255, .3);\n }\n }\n\n & > span {\n overflow: auto hidden;\n\n white-space: nowrap;\n font-size: 13px;\n font-weight: 500;\n }\n }\n }\n\n & > #queue-tabs {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-around;\n gap: 8px;\n\n position: relative;\n z-index: 2;\n\n border-radius: 0 0 12px 12px;\n padding: 10px 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: transparent;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-tab {\n cursor: pointer;\n\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n\n position: relative;\n\n border-radius: 50%;\n padding: 8px 14px;\n\n font-size: 1.4em;\n\n transition: transform .18s ease,\n color .18s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .85);\n\n &::after {\n content: \"\";\n\n height: 3px;\n\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n\n border-radius: 2px;\n\n transform: scaleX(0);\n\n transition: transform .22s cubic-bezier(.2, .9, .27, 1);\n\n /* Theme dependent */\n opacity: .95;\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, 1),\n rgba(118, 75, 162, 1)\n );\n }\n\n &:hover, &:focus-visible {\n transform: translateY(-2px);\n }\n\n &:not(.selected).mentions-me::after {\n animation: scale-x 1s ease-in-out infinite;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(244, 196, 32, 1),\n rgba(255, 107, 107, 1)\n );\n }\n\n &.selected {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n &::after {\n transform: scaleX(1);\n }\n }\n\n &.hidden {\n display: none;\n }\n\n & > .fas {\n position: relative;\n }\n }\n }\n\n & > .queue-list {\n height: calc(100% - 60px);\n\n position: relative;\n top: -60px;\n\n padding-top: 60px;\n padding-bottom: 10px;\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n right: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > #clear-queue {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-container {\n display: flex;\n flex-wrap: wrap;\n width: calc(100% - 15vw);\n\n & > #right-content {\n display: flex;\n width: 100%;\n height: 100%;\n\n & > #main-container {\n display: flex;\n flex-direction: column;\n gap: 0px;\n width: calc(100% - 15vw);\n height: 100%;\n\n padding-top: 69px;\n\n position: relative;\n\n & > #edit-details {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 4px;\n\n width: calc(100% - 20vmin);\n height: 69px;\n\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-top: none;\n border-radius: 8px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease;\n\n /* Theme dependent */\n background: rgba(30, 34, 45, 1);\n border-color: rgba(143, 163, 255, .2);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n inset 0 1px 0px rgba(255, 255, 255, .05);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .central {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n flex: 1;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: 1em;\n\n & > .page-title {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(119, 166, 215, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n\n & > a {\n color: inherit;\n\n white-space: nowrap;\n text-overflow: ellipsis;\n\n overflow: hidden;\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > a {\n color: inherit;\n }\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: calc(1rem + 4px);\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n\n & > .subheader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: .9em;\n\n & > .item-comment {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n &.none {\n opacity: .6;\n }\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n white-space: nowrap;\n\n overflow: auto hidden;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: .85rem;\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .nav-item-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 41px;\n height: 41px;\n\n position: absolute;\n top: 14px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: 0;\n }\n\n &#previous-item-button {\n left: calc(5vmin - calc(41px / 2));\n }\n &#next-item-button {\n right: calc(5vmin - calc(41px / 2));\n }\n\n & > i {\n font-size: 16px;\n }\n }\n\n & > #ai-analysis-container {\n flex-shrink: 0;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 12px;\n margin-bottom: 0;\n padding: 10px;\n\n overflow: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .2);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n align-items: center;\n gap: 6px;\n\n margin-bottom: 8px;\n\n & > .fa {\n font-size: 1.1em;\n }\n\n & > .title {\n font-size: .95em;\n letter-spacing: .3px;\n }\n\n & > .assessment {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .8em;\n font-weight: 700;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.review {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.suspicious {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.bad {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n &.error {\n /* Theme dependent */\n background: rgba(158, 158, 158, .25);\n }\n }\n\n & > .confidence {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .75em;\n font-weight: 600;\n }\n }\n\n & > .explanation {\n border-left: 3px solid;\n\n border-radius: 4px;\n margin-bottom: 6px;\n padding: 6px 8px;\n\n font-size: .8em;\n line-height: 1.3;\n\n /* Theme dependent */\n border-left-color: rgba(143, 163, 255, .4);\n }\n\n & > .issues {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n & > .issue {\n border-radius: 6px;\n padding: 4px 10px;\n\n font-size: .75em;\n font-weight: 600;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.medium {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.high {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.critical {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n }\n }\n }\n\n & > .notice {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 8px;\n\n border-left: 4px solid;\n border-radius: 4px;\n\n margin: 10px;\n padding: 8px 12px;\n\n font-size: .9em;\n\n &.edit-war {\n /* Theme dependent */\n color: rgba(120, 27, 20, 1);\n border-left-color: rgba(247, 50, 20, 1);\n background: rgba(255, 205, 199, 1);\n }\n\n &.outdated {\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-left-color: rgba(255, 193, 7, 1);\n background: rgba(255, 243, 205, 1);\n\n &.pending {\n /* Theme dependent */\n color: rgba(12, 84, 96, 1);\n border-left-color: rgba(23, 162, 184, 1);\n background: rgba(209, 236, 241, 1);\n }\n }\n\n & > .text {\n flex: 1;\n }\n\n & > .button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .85em;\n font-weight: 600;\n white-space: nowrap;\n text-decoration: none;\n\n transition: color .2s ease,\n border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-color: rgba(255, 193, 7, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .1);\n\n background: rgba(255, 235, 159, .45);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > i {\n font-size: 14px;\n\n transition: transform .3s ease;\n }\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n color: rgba(80, 60, 0, 1);\n border-color: rgba(255, 193, 7, .6);\n box-shadow: 0 4px 16px rgba(255, 193, 7, .25);\n\n background: rgba(255, 235, 159, .65);\n\n & > i {\n transform: translateX(3px);\n\n &.restore {\n transform: rotateZ(180deg);\n }\n }\n }\n }\n }\n\n & > .diff-scroll-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n opacity: 1;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > i {\n font-size: 16px;\n }\n\n &#diff-scroll-up {\n top: 77px;\n }\n &#diff-scroll-down {\n bottom: 8px;\n }\n }\n\n & > #diff-container {\n flex: 1;\n\n padding: 12px;\n\n scroll-behavior: smooth;\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(20, 22, 28, .3),\n transparent\n );\n\n & > .loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n & > .loading-spinner {\n margin-bottom: 24px;\n\n font-size: 56px;\n\n animation: logo-loader 2s ease-in-out infinite;\n }\n\n & > .loading-text {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n text-align: center;\n font-weight: 500;\n letter-spacing: .3px;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 1);\n }\n }\n\n & > table {\n width: 100%;\n\n border: 1px solid;\n border-collapse: separate;\n border-spacing: 0;\n\n border-radius: 14px;\n margin-bottom: 24px;\n\n overflow: hidden;\n\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: .8em;\n line-height: 1.6;\n vertical-align: baseline;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .1),\n inset 0 -1px 0px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(143, 163, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(35, 40, 52, .5),\n rgba(30, 35, 48, .4)\n );\n -webkit-backdrop-filter: blur(16px) saturate(110%);\n backdrop-filter: blur(16px) saturate(110%);\n\n & > tbody {\n .mw-diff-movedpara-left, .mw-diff-movedpara-right {\n text-decoration: none;\n }\n\n & > tr {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease;\n\n &:hover {\n & > td {\n /* Theme dependent */\n background: rgba(143, 163, 255, .12);\n }\n }\n\n &:not(.diff-addedline, .diff-deletedline) {\n & > td {\n /* Theme dependent */\n background: rgba(255, 255, 255, .02);\n }\n }\n\n .flash-highlight {\n animation: flash-highlight 1s ease-out infinite;\n }\n\n & > td {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease,\n color .25s ease;\n\n &:not(.diff-marker) {\n width: 50%;\n\n padding: 10px 14px;\n\n transition: background .25s ease;\n\n /* Theme dependent */\n color: rgba(200, 210, 230, 1);\n }\n\n &.diff-lineno {\n -webkit-user-select: none;\n user-select: none;\n\n border-bottom: 1px solid;\n\n padding: 10px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-align: center;\n letter-spacing: .6px;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .12),\n rgba(158, 115, 212, .08)\n );\n }\n\n &.diff-marker {\n -webkit-user-select: none;\n user-select: none;\n\n width: 40px;\n\n border-right: 1px solid;\n\n padding: 10px 8px;\n\n font-weight: 700;\n text-align: center;\n\n /* Theme dependent */\n border-right-color: rgba(143, 163, 255, .15);\n\n color: rgba(160, 170, 200, .9);\n\n background: linear-gradient(90deg,\n rgba(40, 45, 60, .3),\n rgba(35, 40, 52, .2)\n );\n\n &::before {\n content: attr(data-marker);\n }\n }\n\n &.diff-empty {\n /* Theme dependent */\n background: rgba(20, 25, 35, .3);\n }\n\n &:is(.diff-addedline, .diff-deletedline) {\n position: relative;\n\n border-left: 4px solid;\n\n transition: background .25s ease,\n border-left-color .25s ease,\n box-shadow .25s ease;\n\n &.diff-addedline {\n /* Theme dependent */\n border-left-color: rgba(76, 175, 80, .9);\n\n background: rgba(76, 175, 80, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(129, 199, 132, 1);\n background: rgba(129, 199, 132, .18);\n box-shadow: inset 0 0 12px rgba(76, 175, 80, .15);\n }\n }\n &.diff-deletedline {\n /* Theme dependent */\n border-left-color: rgba(244, 67, 54, .9);\n\n background: rgba(244, 67, 54, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(255, 112, 97, 1);\n background: rgba(255, 112, 97, .18);\n box-shadow: inset 0 0 12px rgba(244, 67, 54, .15);\n }\n }\n }\n\n & > div {\n & > :is(ins, del) {\n border-radius: 6px;\n padding: 2px 6px;\n\n font-weight: 600;\n text-decoration: none;\n\n transition: background .25s ease,\n transform .15s ease;\n }\n\n & > ins {\n /* Theme dependent */\n background: rgba(130, 169, 26, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(139, 195, 74, .6);\n\n transform: scale(1.08);\n }\n }\n & > del {\n /* Theme dependent */\n background: rgba(244, 67, 54, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 112, 97, .6);\n\n transform: scale(1.08);\n }\n }\n }\n\n a {\n text-decoration: none;\n\n /* Theme dependent */\n color: rgba(107, 163, 216, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n text-decoration: underline;\n }\n }\n }\n }\n }\n }\n }\n\n & > #pending-changes-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n\n position: fixed;\n left: 50%;\n bottom: 63px;\n z-index: 2;\n\n transform: translateX(-50%);\n\n &.hidden {\n display: none;\n }\n\n & > :is(.accept, .reject) {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n\n border-radius: 10px 10px 0 0;\n padding: 8px 12px;\n\n font-size: .95em;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease,\n border-color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.accept {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .14);\n box-shadow: 0 10px 26px rgba(46, 125, 50, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(46, 125, 50, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(46, 125, 50, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n &.reject {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .14);\n box-shadow: 0 10px 26px rgba(155, 40, 34, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(155, 40, 34, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(155, 40, 34, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n }\n }\n\n & > #progress-bar-container {\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-direction: column;\n\n position: absolute;\n top: 0px;\n bottom: 56px;\n right: 0px;\n\n padding: 0;\n\n overflow: hidden;\n\n & > .progress-bar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 180px;\n height: 32px;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 16px;\n margin-bottom: 10px;\n margin-right: 10px;\n\n overflow: hidden;\n\n font-size: .85em;\n font-weight: 400;\n\n opacity: 1;\n\n transition: width .3s ease,\n opacity .3s ease,\n border-color .3s ease,\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .1),\n rgba(158, 115, 212, .1)\n );\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.error {\n /* Theme dependent */\n border-color: rgba(239, 68, 68, .8);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .1),\n rgba(220, 38, 38, .1)\n );\n\n & > .progress-bar-overlay {\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .6),\n rgba(220, 38, 38, .6)\n );\n }\n }\n\n & > .progress-bar-overlay {\n width: 0;\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 16px;\n\n transition: width .4s cubic-bezier(.4, 0, .2, 1),\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .6),\n rgba(158, 115, 212, .6)\n );\n }\n\n & > .progress-bar-text {\n max-width: 100%;\n\n position: relative;\n\n padding: 0 12px;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .2);\n\n color: rgba(255, 255, 255, 1);\n }\n }\n }\n\n & > #bottom-tools {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n\n max-width: calc(100% - 20vmin);\n width: fit-content;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 8px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-radius: 16px;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .bottom-tool-item {\n position: relative;\n\n white-space: nowrap;\n\n transition: opacity .2s ease;\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n\n & > .bottom-tool-trigger {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease;\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.active {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n\n & > .bottom-tool-chevron {\n transform: rotate(180deg);\n }\n }\n\n & > .bottom-tool-chevron {\n font-size: .75em;\n\n transition: transform .2s ease;\n }\n }\n }\n\n & > .bottom-tool-action {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n }\n }\n\n & > #copy-link {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-details {\n width: 15vw;\n\n position: relative;\n\n border-left: 1px solid;\n\n /* Theme dependent */\n border-left-color: rgba(54, 62, 81, 1);\n\n & > #right-top {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n align-content: center;\n justify-content: center;\n\n width: 100%;\n height: 69px;\n\n border-bottom: 2px solid;\n border-left: 1px solid;\n border-bottom-left-radius: 8px;\n\n padding: 8px 15px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .tabs {\n display: flex;\n justify-content: center;\n width: 100%;\n\n & > .tab {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 2px solid;\n\n padding: 10px;\n\n opacity: .75;\n\n transition: background .35s cubic-bezier(.4, 0, .2, 1),\n opacity .35s cubic-bezier(.4, 0, .2, 1),\n box-shadow .35s cubic-bezier(.4, 0, .2, 1),\n border-color .35s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n &:hover, &:focus-visible {\n opacity: 1;\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 75, 162, .25)\n );\n }\n\n &.hidden {\n display: none;\n }\n\n &:first-child {\n border-radius: 10px 0 0 10px;\n }\n &:last-child {\n border-radius: 0 10px 10px 0;\n }\n }\n }\n\n & > .icons {\n display: flex;\n justify-content: center;\n width: 100%;\n\n font-size: 1.4em;\n\n & > .hidden {\n display: none;\n }\n }\n }\n\n & > .section {\n display: flex;\n flex-direction: column;\n height: calc(50% - calc(69px / 2) - 15px);\n\n margin: 10px 10px 0 10px;\n\n border: 1px solid;\n border-radius: 16px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n background: rgba(30, 35, 45, .8);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n\n padding: 14px 14px 12px;\n\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n background: rgba(30, 35, 45, .8);\n\n & > .title {\n font-weight: 600;\n font-size: .85em;\n text-transform: uppercase;\n letter-spacing: .07em;\n white-space: nowrap;\n\n & > i {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n\n margin-right: 4px;\n\n font-size: .9em;\n\n transition: transform .5s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n transform: rotate(180deg);\n }\n }\n }\n\n & > .pills {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n\n & > .pill {\n border: 1px solid;\n border-radius: 10px;\n padding: 4px 8px;\n\n font-size: .75em;\n font-weight: 500;\n\n white-space: nowrap;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(224, 228, 240, 1);\n background: rgba(140, 132, 255, .1);\n\n &.uw-1 {\n /* Theme dependent */\n border-color: rgba(107, 163, 216, .8);\n background: rgba(107, 163, 216, .1);\n color: rgba(107, 163, 216, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .8);\n background: rgba(143, 163, 255, .15);\n color: rgba(143, 163, 255, 1);\n }\n }\n &.uw-2 {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .8);\n background: rgba(255, 193, 7, .1);\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n color: rgba(255, 193, 7, 1);\n }\n }\n &.uw-3 {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, .8);\n background: rgba(255, 87, 34, .1);\n color: rgba(255, 87, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n background: rgba(255, 87, 34, .15);\n color: rgba(255, 87, 34, 1);\n }\n }\n &.uw-4 {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .8);\n background: rgba(244, 67, 54, .1);\n color: rgba(244, 67, 54, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, 1);\n background: rgba(244, 67, 54, .15);\n color: rgba(244, 67, 54, 1);\n }\n }\n &.uw-4im {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, .8);\n background: rgba(178, 34, 34, .1);\n color: rgba(178, 34, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, 1);\n background: rgba(178, 34, 34, .15);\n color: rgba(178, 34, 34, 1);\n }\n }\n\n &.ub {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, .8);\n background: rgba(255, 99, 132, .1);\n color: rgba(255, 99, 132, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, 1);\n background: rgba(255, 99, 132, .15);\n color: rgba(255, 99, 132, 1);\n }\n }\n }\n }\n }\n\n & > .queue-list {\n flex: 1;\n height: 100%;\n\n padding: 4px;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .3);\n }\n\n & > .footer {\n cursor: pointer;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n\n padding: 10px 14px;\n\n border-top: 1px solid;\n\n font-size: .85em;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(30, 35, 45, .8);\n border-top-color: rgba(143, 163, 255, .2);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n & > i {\n transform: translateX(3px);\n }\n }\n\n & > i {\n transition: transform .2s ease;\n }\n }\n }\n\n &:has(#user-contributions.hidden) {\n & > #page-history {\n height: calc(100% - 89px);\n }\n }\n &:has(#page-history.hidden) {\n & > #user-contributions {\n height: calc(100% - 89px);\n }\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n left: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > .height-adjust {\n touch-action: none;\n cursor: row-resize;\n\n height: 10px;\n width: 100%;\n\n position: absolute;\n left: 0;\n top: calc(50% - 5px);\n z-index: 3;\n }\n }\n }\n }\n }\n\n & > .bottom-tool-menu {\n display: none;\n max-width: calc(100vw - 40px);\n min-width: 200px;\n\n position: absolute;\n left: 0;\n bottom: calc(100% + 8px);\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n overflow-y: visible;\n\n animation: bottom-tool-menu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n }\n\n & > .menu-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border-radius: 8px;\n padding: 10px 12px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.hidden {\n display: none;\n }\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n\n & > i:first-child {\n opacity: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n opacity: 1;\n }\n }\n\n & > i:first-child {\n width: 18px;\n\n font-size: 1.1em;\n text-align: center;\n\n opacity: .8;\n\n transition: opacity .2s ease;\n }\n\n & > span {\n flex: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n margin-left: auto;\n\n font-size: .85em;\n\n opacity: .5;\n\n transition: opacity .2s ease;\n }\n\n & > .submenu {\n cursor: default;\n\n display: none;\n min-width: 240px;\n\n position: absolute;\n left: calc(100% + 4px);\n top: -6px;\n z-index: 4;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n color: var(--body-color);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n }\n\n & > .bottom-subcontent-title {\n border-bottom: 1px solid;\n\n margin-bottom: 12px;\n padding-bottom: 8px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n }\n\n & > .bottom-subcontent-input-title {\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > :is(select, input[type=\"text\"]) {\n width: 100%;\n\n font-size: .9em;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n\n & > .bottom-subcontent-button {\n --background: 123, 143, 245;\n\n display: block;\n width: 100%;\n\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n font-weight: 600;\n }\n }\n }\n\n &:is(#revert-menu, #warn-menu) {\n max-height: calc(100vh - 120px);\n\n overflow: hidden auto;\n\n & > .warning-menu {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 280px;\n\n position: relative;\n\n border-radius: 12px;\n padding: 8px;\n\n & > .warning-menu-no-items {\n text-align: center;\n padding: 20px;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n }\n\n & > .favorites-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 4px;\n\n & > .favorites-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .9);\n\n & > .icon {\n font-size: 1.1em;\n }\n }\n\n & > .favorites-container {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n }\n\n & > .favorites-separator {\n height: 1px;\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n }\n\n & > .favorites-section:not(:has(.warning-menu-item)) {\n display: none;\n\n & ~ .favorites-separator {\n display: none;\n }\n }\n\n & > .menu-option {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n color: rgba(224, 228, 240, 1);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .12);\n\n & > .icon {\n opacity: 1;\n transform: scale(1.1);\n }\n\n & > .submenu-arrow {\n opacity: 1;\n transform: translateX(2px);\n }\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .15);\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n opacity: .85;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > span:not(.icon):not(.submenu-arrow) {\n flex: 1;\n\n font-weight: 500;\n }\n\n & > .submenu-arrow {\n flex-shrink: 0;\n\n font-size: .8em;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n }\n }\n }\n\n & > .warning-submenu {\n display: none;\n max-width: calc(100vw - 60px);\n min-width: 420px;\n max-height: calc(100vh - 120px);\n\n position: absolute;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n overflow-y: auto;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(30, 33, 42, .98);\n -webkit-backdrop-filter: blur(25px);\n backdrop-filter: blur(25px);\n\n &.show {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n }\n\n .warning-menu-item {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n background: rgba(102, 126, 234, .12);\n }\n\n &.favorite-item {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n\n &.dragging {\n opacity: 0.5;\n transform: scale(0.95);\n }\n }\n\n & > .favorite-star {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border-radius: 4px;\n\n font-size: 1.2em;\n line-height: 1;\n\n transition: transform .2s cubic-bezier(.4, 0, .2, 1),\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .4);\n\n &:hover {\n transform: scale(1.2);\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .8);\n }\n\n &.favorited {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 152, 0, 1);\n }\n }\n\n &.spin {\n animation: star-spin 0.5s cubic-bezier(.4, 0, .2, 1);\n }\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > .warning-menu-title {\n flex: 1;\n\n font-size: .92em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 228, 240, 1);\n }\n\n & > .fa-circle-question {\n flex-shrink: 0;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .6);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .warning-menu-buttons {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n\n margin-left: 8px;\n }\n\n & > .warning-menu-buttons > .warning-menu-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 7px 14px;\n\n font-size: .82em;\n font-weight: 500;\n text-transform: capitalize;\n\n transition: border-color .2s ease,\n background .2s ease,\n color .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, .95);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .22);\n }\n\n &:active {\n transform: translateY(0);\n }\n\n &.warning-menu-no-warn-button {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .2);\n color: rgba(255, 193, 7, .95);\n background: rgba(255, 152, 0, .1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .4);\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 152, 0, .22);\n }\n }\n }\n }\n\n & > .levels-menu {\n display: none;\n min-width: 0px;\n\n position: fixed;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(28, 30, 38, .98);\n -webkit-backdrop-filter: blur(24px);\n backdrop-filter: blur(24px);\n\n &.show {\n display: flex;\n gap: 6px;\n }\n\n & > .levels-menu-item {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .95em;\n font-weight: 600;\n text-align: center;\n white-space: nowrap;\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n background: rgba(255, 255, 255, .05);\n border: 1px solid rgba(255, 255, 255, .1);\n\n &:hover {\n transform: translateY(-2px);\n background: rgba(255, 255, 255, .08);\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n\n &:active {\n transform: translateY(0);\n }\n }\n }\n\n .queue-list {\n overflow: hidden auto;\n\n &:is(#user-contributions-content, #page-history-content) {\n & > .queue-item {\n margin: 4px 0;\n }\n }\n\n & > .queue-empty {\n text-align: center;\n padding: 40px 20px;\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n }\n\n & > .historical-bar {\n height: 4px;\n width: 100%;\n\n position: relative;\n\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n\n & > .label {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n font-size: 1em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n\n & > .queue-item {\n cursor: pointer;\n\n display: flex;\n\n position: relative;\n\n border: 1px solid;\n border-radius: .75rem;\n\n margin: 4px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .4);\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n &:hover, &:focus-within {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 12px oklch(0 0 0 / 0.3);\n\n background: rgba(40, 43, 52, .6);\n }\n\n &.current {\n /* Theme dependent */\n border-color: linear-gradient(90deg,\n rgba(40, 43, 52, .4),\n rgba(40, 43, 82, .6)\n );\n box-shadow: 0 0 0 1px rgba(60, 63, 122, 1) inset;\n\n background: rgba(40, 43, 82, .6);\n\n & > .item-body {\n & > .item-tags {\n & > .tag {\n /* Theme dependent */\n color: rgba(145, 145, 165, 1);\n background: rgba(60, 63, 122, .4);\n border-color: rgba(60, 63, 122, .6);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .4);\n border-color: rgba(255, 193, 7, .6);\n }\n }\n }\n }\n }\n\n &.mentions-me {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 1) inset;\n\n background: rgba(40, 43, 52, .6);\n }\n\n & > .item-color {\n --ores-color: rgba(128, 128, 128, 1);\n\n flex-shrink: 0;\n width: 4px;\n\n position: relative;\n\n opacity: .85;\n\n /* Theme dependent */\n background: var(--ores-color);\n }\n\n & > .item-body {\n --ores-color: rgba(128, 128, 128, 1);\n --diff-color: rgba(128, 128, 128, 1);\n\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: .5rem;\n\n min-width: 0;\n\n padding: .75rem 1rem;\n\n & > .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: .75rem;\n\n & > .page-title {\n display: flex;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n font-size: clamp(.825rem, .85rem + .35vw, .95rem);\n font-weight: 600;\n\n word-wrap: break-word;\n word-break: break-word;\n\n line-height: 1.35;\n\n /* Theme dependent */\n color: rgba(205, 204, 202, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n }\n\n & > .timestamp {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 4px;\n\n min-width: 3ex;\n\n padding-top: 1px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n width: 100%;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 500;\n\n hyphens: auto;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n }\n\n & > .chips {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-grow: 1;\n gap: 4px;\n\n & > .ores-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--ores-color);\n background: color-mix(in srgb, var(--ores-color) 15%, transparent);\n }\n\n & > .diff-chips {\n display: flex;\n align-items: center;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: var(--diff-color);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .item-comment {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n overflow: hidden;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n font-style: italic;\n white-space: nowrap;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .item-tags {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .5rem;\n\n & > .tag {\n display: flex;\n align-items: center;\n gap: 2px;\n\n padding: 1px .5rem;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .7rem;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(135, 135, 135, 1);\n background: rgba(45, 44, 51, 1);\n border-color: rgba(38, 37, 35, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border-color: rgba(255, 193, 7, .4);\n }\n }\n }\n }\n\n & > .remove-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n\n position: absolute;\n right: 0px;\n bottom: 0px;\n\n border-top-left-radius: 8px;\n\n line-height: 1;\n\n transition: color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n background: rgba(255, 255, 255, 0);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 70, 0, 1);\n background: rgba(255, 70, 0, .15);\n }\n }\n }\n }\n\n .tooltip {\n min-width: 0;\n max-height: 80vh;\n\n position: fixed;\n left: 0;\n top: 0;\n z-index: calc(var(--max-z-index) - 3);\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 4px 6px;\n\n overflow-wrap: break-word;\n overflow: hidden auto;\n\n font-size: .95em;\n line-height: 1.45;\n word-wrap: break-word;\n white-space: normal;\n\n animation: tooltip-enter .1s ease-out forwards;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n box-shadow: 0 10px 30px rgba(6, 12, 24, .6),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n color: rgba(234, 240, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .03),\n rgba(255, 255, 255, .01)\n );\n -webkit-backdrop-filter: blur(14px) brightness(.7);\n backdrop-filter: blur(14px) brightness(.7);\n\n &:not(.buttons) {\n pointer-events: none;\n\n max-width: 460px;\n }\n\n &.buttons {\n display: flex;\n flex-direction: row;\n gap: 8px;\n\n z-index: calc(var(--max-z-index) - 2);\n\n white-space: nowrap;\n\n & > .button {\n cursor: pointer;\n\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 4px 8px;\n\n font-size: .95em;\n font-weight: 500;\n letter-spacing: .3px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .05);\n\n color: rgba(240, 245, 255, .92);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .08),\n rgba(255, 255, 255, .02)\n );\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .14),\n rgba(255, 255, 255, .06)\n );\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 1px 4px rgba(0, 0, 0, .3),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .tooltip-title {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-bottom: 1px solid;\n\n border-radius: 6px;\n margin-bottom: 12px;\n padding: 8px 10px;\n\n font-size: 1.04em;\n font-weight: 700;\n letter-spacing: .25px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .05);\n\n color: rgba(255, 255, 255, .92);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(0, 0, 0, .04)\n );\n -webkit-backdrop-filter: blur(6px);\n backdrop-filter: blur(6px);\n }\n\n & > .tooltip-item {\n display: flex;\n flex-direction: column;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 10px;\n margin: 10px 0;\n padding: 10px 12px;\n\n overflow: hidden;\n overflow-wrap: anywhere;\n\n word-wrap: break-word;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .075),\n rgba(0, 0, 0, .25)\n );\n\n &:is(.user-warnings, .user-blocks) {\n & > .tooltip-item-level {\n display: block;\n width: 100%;\n\n border-bottom: 1px solid;\n\n border-radius: 6px 6px 0 0;\n padding: 6px 10px;\n\n font-size: .95em;\n font-weight: 700;\n letter-spacing: .3px;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 120, .25);\n\n color: rgba(255, 255, 120, .95);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 120 .22),\n rgba(255, 255, 120, .08)\n );\n }\n\n & > .tooltip-item-details {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n\n & > :is(.tooltip-item-user, .tooltip-item-time) {\n font-size: .82em;\n font-weight: 400;\n\n opacity: .8;\n\n &.tooltip-item-user {\n /* Theme dependent */\n color: rgba(150, 210, 255, .9);\n }\n &.tooltip-item-time {\n /* Theme dependent */\n color: rgba(220, 225, 235, .9);\n\n & > span:not(:first-of-type) {\n margin-left: 1ex;\n }\n }\n }\n }\n }\n\n & > .tooltip-more {\n border-top: 1px solid;\n\n border-radius: 8px;\n margin-top: 14px;\n padding-top: 10px;\n\n font-size: .92em;\n font-style: italic;\n text-align: center;\n\n opacity: .95;\n\n /* Theme dependent */\n border-top-color: rgba(255, 255, 255, .04);\n\n color: rgba(240, 240, 255, .75);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .015),\n rgba(0, 0, 0, .03)\n );\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n }\n }\n }\n\n .confirmation-modal-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 6);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease-out;\n\n &.closing {\n animation: fade-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal {\n max-width: 500px;\n min-width: 400px;\n\n border: 1px solid;\n\n border-radius: 16px;\n\n word-wrap: break-word;\n\n animation: scale-in .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .7),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: rgba(41, 47, 60, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.closing {\n animation: scale-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal-header {\n border-bottom: 1px solid;\n\n padding: 20px 24px;\n\n /* Theme dependent */\n border-bottom-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-title {\n font-size: 1.2em;\n font-weight: 700;\n }\n }\n\n & > .confirmation-modal-body {\n max-height: 70vh;\n\n padding: 24px;\n\n line-height: 1.5;\n\n overflow: hidden auto;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n\n & > .confirmation-modal-username {\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(91, 154, 255, 1);\n }\n\n & > .confirmation-modal-input {\n width: 100%;\n\n border: 1px solid;\n border-radius: 4px;\n\n margin-top: 10px;\n padding: 8px;\n\n /* Theme dependent */\n color: white;\n border-color: rgba(255, 255, 255, .2);\n background: rgba(0, 0, 0, .3);\n }\n }\n\n & > .confirmation-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n\n border-top: 1px solid;\n\n padding: 16px 24px;\n\n /* Theme dependent */\n border-top-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-footer-right {\n display: flex;\n gap: 12px;\n }\n\n &.confirmation-modal-footer-vertical {\n flex-direction: column;\n align-items: stretch;\n\n & > .confirmation-modal-button {\n width: 100%;\n }\n }\n }\n\n .confirmation-modal-button {\n font-size: .95em;\n font-weight: 500;\n }\n }\n }\n\n .notification-panel {\n pointer-events: none;\n\n display: flex;\n flex-direction: column;\n width: 480px;\n max-height: 600px;\n\n position: absolute;\n left: 15px;\n top: 55px;\n z-index: calc(var(--max-z-index) - 9);\n\n border: 1px solid;\n border-radius: 18px;\n\n overflow: hidden;\n\n opacity: 0;\n\n transform: translateY(-20px) scale(.95);\n\n transition: opacity .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 20px 60px rgba(0, 0, 0, .8),\n 0 0 0 1px rgba(255, 255, 255, .08),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n\n background: rgba(25, 27, 36, .96);\n -webkit-backdrop-filter: blur(25px) brightness(0.95);\n backdrop-filter: blur(25px) brightness(0.95);\n\n a {\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(160, 195, 255, 1);\n }\n\n &:visited {\n /* Theme dependent */\n color: rgba(150, 185, 255, 1);\n }\n }\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n\n & > .notification-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border-bottom: 1px solid;\n\n padding: 18px 22px;\n\n font-size: 1.12em;\n font-weight: 700;\n letter-spacing: 0.3px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .08);\n\n color: rgba(245, 245, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(120, 145, 255, .12),\n rgba(140, 100, 200, .08)\n );\n\n & > .mark-all-read {\n cursor: pointer;\n\n font-size: 0.78em;\n font-weight: 500;\n letter-spacing: 0.2px;\n\n padding: 6px 12px;\n border-radius: 6px;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n background: rgba(120, 170, 255, .08);\n\n &:hover {\n /* Theme dependent */\n background: rgba(120, 170, 255, .15);\n color: rgba(160, 200, 255, 1);\n }\n\n &:active {\n opacity: .85;\n }\n }\n }\n\n & > .notification-list {\n max-height: 520px;\n\n overflow: hidden auto;\n\n padding: 8px;\n\n & > .notifications-empty {\n padding: 40px 20px;\n\n text-align: center;\n\n font-size: 0.95em;\n\n /* Theme dependent */\n color: rgba(120, 125, 145, 1);\n\n & strong {\n /* Theme dependent */\n color: rgba(150, 155, 175, 1);\n }\n }\n\n & > .notification {\n cursor: pointer;\n\n display: flex;\n align-items: flex-start;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 18px;\n margin-bottom: 8px;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(50, 55, 75, .4),\n rgba(40, 45, 65, .3)\n );\n\n &:hover {\n opacity: 1;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .3);\n box-shadow: 0 8px 24px rgba(120, 170, 255, .15),\n inset 0 1px 0 rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(80, 100, 160, .15),\n rgba(70, 85, 145, .1)\n );\n\n transform: translateY(-2px);\n }\n\n &.unread {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .5);\n box-shadow: 0 0 20px rgba(120, 170, 255, .2),\n inset 0 1px 0 rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(120, 170, 255, .1),\n rgba(100, 145, 255, .05)\n );\n }\n\n &.read {\n opacity: .72;\n\n border-color: rgba(255, 255, 255, .04);\n }\n\n & > .notification-icon {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n\n border-radius: 10px;\n\n overflow: hidden;\n\n background: rgba(60, 75, 120, .5);\n\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n & > .notification-content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 5px;\n\n & > .notification-header {\n margin: 0;\n\n font-size: .95rem;\n font-weight: 600;\n letter-spacing: 0.2px;\n\n /* Theme dependent */\n color: rgba(235, 240, 255, 1);\n }\n\n & > .notification-body {\n font-size: .82rem;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 180, 205, 1);\n }\n\n & > .notification-links {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n\n margin-top: 6px;\n\n & > a {\n border: none;\n\n padding: 4px 8px;\n border-radius: 5px;\n\n font-size: .8rem;\n font-weight: 500;\n text-decoration: none;\n\n background: rgba(120, 170, 255, .12);\n opacity: 1;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n color: rgba(140, 185, 255, 1);\n\n &:hover {\n opacity: 1;\n\n background: rgba(120, 170, 255, .22);\n\n /* Theme dependent */\n color: rgba(180, 210, 255, 1);\n }\n\n &:active {\n opacity: .85;\n\n transform: scale(0.98);\n }\n }\n }\n }\n\n & > .notification-right {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n gap: 10px;\n\n & > .notification-unread-indicator {\n cursor: pointer;\n\n width: 12px;\n height: 12px;\n\n border-radius: 50%;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n background: rgba(120, 170, 255, 1);\n box-shadow: 0 0 8px rgba(120, 170, 255, .5);\n\n &:hover, &:focus {\n transform: scale(1.35);\n\n /* Theme dependent */\n box-shadow: 0 0 16px rgba(120, 170, 255, .8);\n }\n }\n\n & > .notification-timestamp {\n font-size: .72rem;\n font-weight: 500;\n\n opacity: .8;\n\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(140, 150, 175, 1);\n }\n }\n }\n }\n }\n\n .icon-count {\n --color: 255, 255, 255;\n --background: 255, 255, 255;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n\n position: absolute;\n right: -11px;\n top: -11px;\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 50%;\n padding: 0 8px;\n\n font-family: sans-serif;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n\n transition: transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(var(--background), .3);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(var(--background), .15);\n\n color: rgba(--color, 1);\n text-shadow: 0 1px 0 rgba(0, 0, 0, .35);\n\n background: linear-gradient(135deg,\n rgba(var(--background), .7),\n rgba(var(--background), .5)\n );\n -webkit-backdrop-filter: blur(6px) brightness(0%);\n backdrop-filter: blur(6px) brightness(0%);\n\n &.red {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 255, 60, 60;\n }\n &.green {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 205, 80;\n }\n &.blue {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 120, 255;\n }\n &.yellow {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 215, 60;\n }\n &.orange {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 165, 60;\n }\n &:is(.gray, .grey) {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 150, 150, 150;\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n transform: scale(0);\n }\n }\n\n .toast-alert {\n display: flex;\n align-items: center;\n gap: 14px;\n max-width: 500px;\n min-width: 320px;\n\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: calc(var(--max-z-index) - 4);\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 20px;\n\n opacity: 0;\n\n transform: translateX(100%) scale(.8);\n\n animation: toast-alert-enter .5s cubic-bezier(.68, -.55, .265, 1.55);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 12px 40px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(25px) saturate(180%);\n backdrop-filter: blur(25px) saturate(180%);\n\n &.success {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(76, 175, 80, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .25)\n );\n }\n &.warning {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(255, 152, 0, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 152, 0, .25),\n rgba(245, 124, 0, .25)\n );\n }\n &.error {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(244, 67, 54, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .25)\n );\n }\n &.dev {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(156, 39, 176, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(156, 39, 176, .25),\n rgba(123, 31, 162, .25)\n );\n }\n\n &.show {\n opacity: 1;\n\n transform: translateX(0) scale(1);\n }\n\n &.hidden {\n animation: toast-alert-leave .4s cubic-bezier(.6, -.28, .735, .045) forwards;\n }\n\n & > .toast-icon {\n flex-shrink: 0;\n\n font-size: 1.8em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .3));\n }\n\n & > .toast-content {\n flex: 1;\n\n & > .toast-title {\n margin-bottom: 4px;\n\n font-size: 1.05em;\n font-weight: 700;\n letter-spacing: .3px;\n }\n\n & > .toast-message {\n font-size: .9em;\n line-height: 1.4;\n\n opacity: .95;\n }\n }\n\n & > .toast-close {\n cursor: pointer;\n\n flex-shrink: 0;\n\n border-radius: 6px;\n padding: 4px;\n\n font-size: 1.3em;\n\n background: transparent;\n opacity: .8;\n\n transition: opacity .2s ease,\n transform .2s ease,\n background .2s ease;\n\n &:hover {\n opacity: 1;\n\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n }\n }\n\n .minor-indicator {\n border: 1px solid;\n\n border-radius: 4px;\n margin-right: 4px;\n padding: 0 4px;\n\n font-size: .9em;\n font-weight: 700;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(153, 153, 153, 1);\n\n background: rgba(60, 64, 76, .9);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n .menu-divider {\n height: 1px;\n\n margin: 6px 8px;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n\n .profanity {\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n margin: 20px;\n padding: 20px;\n\n border-radius: 12px;\n border: 1px solid;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .8);\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .3);\n\n & > .profanity-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n\n padding-bottom: 16px;\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n\n & > .profanity-score {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n & > .score-label {\n font-size: .85em;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n }\n\n & > .score-value {\n font-size: 2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(255, 200, 100, 1);\n }\n }\n\n & > .profanity-risk {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 16px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n background: rgba(60, 64, 76, .6);\n\n &.risk-high {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n background: rgba(211, 47, 47, .2);\n border: 1px solid rgba(211, 47, 47, .4);\n }\n\n &.risk-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border: 1px solid rgba(255, 193, 7, .3);\n }\n\n &.risk-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n background: rgba(66, 165, 245, .15);\n border: 1px solid rgba(66, 165, 245, .3);\n }\n }\n }\n\n & > .profanity-matches-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .profanity-matches-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n & > .profanity-match {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n border-radius: 8px;\n padding: 12px 14px;\n border-left: 3px solid;\n\n transition: background .2s ease,\n border-color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n background: rgba(45, 50, 62, .7);\n border-left-color: rgba(255, 150, 150, .5);\n\n &:hover {\n transform: translateX(4px);\n\n /* Theme dependent */\n background: rgba(50, 56, 70, .85);\n border-left-color: rgba(255, 150, 150, .8);\n }\n\n & > .match-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: .95em;\n\n & > .match-text {\n font-family: 'Courier New', monospace;\n font-weight: 600;\n\n border-radius: 4px;\n padding: 4px 8px;\n\n /* Theme dependent */\n color: rgba(255, 180, 180, 1);\n background: rgba(211, 47, 47, .2);\n }\n\n & > .match-arrow {\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .match-name {\n font-family: 'Courier New', monospace;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n }\n\n & > .match-details {\n display: flex;\n gap: 16px;\n\n & > .match-stat {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n & > .stat-label {\n font-size: .75em;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .stat-value {\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n &.severity-critical {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n }\n &.severity-high {\n /* Theme dependent */\n color: rgba(255, 150, 100, 1);\n }\n\n &.severity-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n &.severity-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n }\n }\n }\n }\n\n & > .match-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n margin-top: 6px;\n padding: 10px 12px;\n border-radius: 6px;\n\n font-size: .85em;\n line-height: 1.5;\n\n /* Theme dependent */\n background: rgba(30, 33, 43, .6);\n border: 1px solid rgba(100, 150, 255, .2);\n\n & > .fa {\n margin-top: 2px;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(100, 150, 255, .8);\n }\n\n & > .note-text {\n flex: 1;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n }\n }\n }\n\n & > .profanity-no-matches {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n padding: 20px;\n\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(100, 200, 100, 1);\n }\n }\n\n & > #settings-container {\n z-index: calc(var(--max-z-index) - 7);\n\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n\n opacity: 0;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n\n & > .settings {\n transform: scale(1);\n }\n }\n\n & > .settings {\n display: flex;\n max-width: 1100px;\n width: 90vw;\n\n border: 1px solid;\n\n border-radius: 20px;\n\n overflow: hidden;\n\n transform: scale(.75);\n\n transition: transform .1s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(30, 33, 42, .95);\n -webkit-backdrop-filter: blur(30px);\n backdrop-filter: blur(30px);\n\n & > div {\n height: 80vh;\n\n &.settings-left {\n width: 250px;\n\n border-right: 1px solid;\n\n padding: 20px 0;\n\n overflow-y: auto;\n\n /* Theme dependent */\n border-right-color: rgba(255, 255, 255, .1);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(255, 255, 255, .05)\n );\n\n & > .settings-category {\n &:not(:last-child) {\n margin-bottom: 20px;\n }\n\n & > .settings-category-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n margin-bottom: 4px;\n padding: 12px 20px;\n\n font-size: .7em;\n font-weight: 800;\n letter-spacing: 1.5px;\n text-transform: uppercase;\n }\n\n & > .settings-left-menu-compact {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n padding: 0 12px;\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 10px;\n padding: 12px;\n\n font-size: 1.2em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:first-child {\n margin-left: 12px;\n }\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n }\n }\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n border-radius: 10px;\n margin: 2px 12px;\n padding: 12px 20px;\n\n font-size: .95em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n & > span > i {\n height: 1em;\n aspect-ratio: 1 / 1;\n\n margin-right: 12px;\n\n text-align: center;\n }\n }\n }\n }\n\n &.settings-right {\n flex: 1;\n\n padding: 20px 30px;\n\n overflow-y: auto;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .5);\n\n & > .hidden {\n display: none;\n }\n\n a {\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n color: rgba(176, 192, 255, 1);\n }\n }\n\n pre, code {\n border-radius: 4px;\n padding: 2px 4px;\n\n font-size: .95em;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n\n .settings-compact-grid {\n & > .compact {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n & > .numeric-input-container {\n & > .numeric-input {\n width: calc(100% - 70px);\n }\n }\n\n & > select {\n width: 100%;\n }\n }\n }\n\n .settings-section, .settings-toggles-section {\n display: block;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 25px;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n\n background: rgba(35, 38, 48, .8);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n .settings-section-title {\n margin-bottom: 5px;\n\n font-size: 1em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n &.collapse-title {\n margin-bottom: 0;\n }\n }\n\n .settings-section-desc {\n margin-bottom: 0;\n\n font-size: .85em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .pad-list {\n margin: 8px 0;\n padding-left: 20px;\n }\n\n &:not(:last-child) {\n margin-bottom: 30px;\n }\n\n &.compact {\n margin-bottom: 0;\n padding: 18px;\n\n & > .settings-section-title {\n font-size: 1.05em;\n\n &.collapse-title {\n margin-bottom: 15px;\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 12px;\n\n font-size: .85em;\n }\n }\n\n &.inline {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .6);\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .settings-section-content {\n flex: 1;\n }\n }\n\n &.collapsed {\n & > .collapse-title::after {\n transform: rotate(-180deg);\n }\n }\n\n & > .collapse-title {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n &::after{\n content: \"\\f077\";\n\n float: right;\n\n font-family: \"Font Awesome 6 Free\";\n font-weight: 900;\n\n transition: transform .2s ease;\n }\n }\n\n & > .collapsible-content {\n padding: initial;\n\n overflow: hidden;\n\n transition: padding .2s ease;\n\n &.collapsed {\n padding: 0;\n }\n }\n\n & > .settings-section-title {\n margin-bottom: 15px;\n\n font-size: 1.4em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 8px;\n }\n }\n\n & > .settings-section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n\n margin-bottom: 15px;\n\n font-size: 1.2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 0;\n }\n\n & > .settings-section-header-icon {\n font-size: 1.3em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .2));\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 20px;\n\n font-size: .95em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .checkbox-container {\n display: flex;\n flex-wrap: wrap;\n\n & > div {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 200px;\n\n margin-bottom: 8px;\n\n &:hover {\n & > .checkbox-box {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .checkbox-box {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: block;\n\n position: relative;\n\n border-radius: 5px;\n\n font-size: .95em;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(213, 213, 213, 1);\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n position: absolute;\n width: 0;\n height: 0;\n\n border-radius: 5px;\n\n opacity: 0;\n\n &:checked ~ .checkmark {\n /* Theme dependent */\n background: linear-gradient(45deg,\n rgba(100, 61, 219, 1),\n rgba(217, 21, 239, 1)\n );\n\n &::after {\n opacity: 1;\n }\n }\n }\n\n & > .checkmark {\n width: 1.3em;\n height: 1.3em;\n\n position: relative;\n left: 0;\n top: 0;\n\n border-radius: 5px;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(204, 204, 204, 1);\n\n &::after {\n content: \"\";\n\n width: .25em;\n height: .5em;\n\n position: absolute;\n left: .45em;\n top: .25em;\n\n border-width: 0 .15em .15em 0;\n border-style: solid;\n\n opacity: 0;\n\n transform: rotate(45deg);\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, 1);\n }\n }\n }\n }\n }\n\n .numeric-input-container {\n display: flex;\n\n & > .numeric-input-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n width: 35px;\n height: 35px;\n\n border: 1px solid;\n\n border-radius: 8px;\n\n font-size: 1.3em;\n\n transition: background .2s ease,\n border-color .2s ease,\n color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .8);\n\n &:hover {\n transform: scale(1.05);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n }\n\n & > .numeric-input {\n width: 100px;\n\n border-radius: 8px;\n margin: 0 5px;\n padding: 6px 12px;\n\n font-size: 1.1em;\n }\n }\n\n .volume-control {\n display: block;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 20px 0;\n padding: 20px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .volume-control-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n\n margin-bottom: 16px;\n\n & > .volume-control-info {\n flex: 1;\n\n & > .volume-control-title {\n margin-bottom: 6px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .volume-control-desc {\n font-size: .9em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .volume-control-preview {\n --background: 123, 143, 245;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 18px;\n\n font-size: .9em;\n font-weight: 500;\n }\n }\n\n & > .volume-control-slider-container {\n display: flex;\n align-items: center;\n gap: 16px;\n\n & > .volume-control-slider {\n flex: 1;\n height: 6px;\n\n outline: none;\n\n border-radius: 3px;\n\n -webkit-appearance: none;\n appearance: none;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n\n &::-webkit-slider-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n\n &::-moz-range-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border: none;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n }\n\n & > .volume-control-input {\n width: 70px;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-size: .95em;\n text-align: center;\n }\n }\n }\n\n .settings-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 60px;\n height: 32px;\n\n position: relative;\n\n &:hover {\n & > .toggle-switch {\n transform: scale(1.02);\n }\n }\n\n &.active {\n & > .toggle-switch {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n & > .toggle-slider {\n left: 30px;\n\n /* Theme dependent */\n box-shadow: 0 4px 10px rgba(0, 0, 0, .3),\n 0 2px 4px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .toggle-switch {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n border: 2px solid;\n\n border-radius: 16px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n\n & > .toggle-slider {\n width: 24px;\n height: 24px;\n\n position: absolute;\n left: 2px;\n top: 2px;\n\n border-radius: 50%;\n\n transition: left .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n 0 1px 2px rgba(0, 0, 0, .15);\n\n background: rgba(255, 255, 255, 1);\n }\n }\n }\n\n .settings-radio-group {\n display: flex;\n flex-direction: row;\n gap: 12px;\n\n border-radius: 100vh;\n padding: 8px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-radio-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n flex: 1;\n\n text-align: center;\n\n border-radius: 100vh;\n padding: 10px 16px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 1);\n }\n\n &.selected {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n color: rgba(224, 224, 224, 1);\n }\n }\n }\n\n .settings-slider {\n display: flex;\n flex-direction: column;\n gap: 14px;\n\n border-radius: 14px;\n padding: 16px 20px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-slider-labels {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n & > .settings-slider-labels > .settings-slider-label-left,\n & > .settings-slider-labels > .settings-slider-label-right {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &.active {\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .percent {\n font-size: .85em;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n }\n\n & > .settings-slider-labels > .settings-slider-label-right {\n text-align: right;\n }\n\n & > .settings-slider-track {\n cursor: pointer;\n\n height: 8px;\n\n position: relative;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n &::before {\n content: '';\n\n width: var(--fill, 50%);\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .6),\n rgba(118, 75, 162, .6)\n );\n }\n\n & > .settings-slider-thumb {\n cursor: grab;\n\n width: 22px;\n height: 22px;\n\n position: absolute;\n top: 50%;\n\n border: 2px solid;\n\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n transition: transform .15s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .4),\n 0 0 12px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: translate(-50%, -50%) scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 12px rgba(0, 0, 0, .5),\n 0 0 20px rgba(102, 126, 234, .5);\n }\n\n &:active, &.dragging {\n cursor: grabbing;\n\n transform: translate(-50%, -50%) scale(1.2);\n\n /* Theme dependent */\n box-shadow: 0 4px 16px rgba(0, 0, 0, .5),\n 0 0 24px rgba(102, 126, 234, .6);\n }\n }\n }\n }\n\n .palette-selector {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n\n margin-top: 20px;\n\n & > .palette-option {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 12px;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 20px rgba(20, 20, 30, .4);\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4);\n }\n\n & > .palette-name {\n pointer-events: none;\n\n font-size: .9em;\n font-weight: 600;\n text-align: center;\n }\n\n & > .palette-preview {\n pointer-events: none;\n\n display: flex;\n gap: 4px;\n height: 40px;\n\n border-radius: 8px;\n margin-bottom: 12px;\n\n overflow: hidden;\n\n & > canvas {\n flex: 1;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .tracklist {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n\n & > .track {\n position: relative;\n\n border-radius: 8px;\n\n overflow: hidden;\n\n & > .thumbnail {\n display: block;\n width: 100%;\n aspect-ratio: 1 / 1;\n\n overflow: hidden;\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n\n overflow: hidden;\n }\n }\n\n & > .info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n\n padding: 10px 12px;\n\n /* Theme dependent */\n background: linear-gradient(180deg,\n rgba(0, 0, 0, 0),\n rgba(0, 0, 0, .35),\n rgba(0, 0, 0, .65)\n );\n\n & > .title {\n font-size: .95em;\n font-weight: 600;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n\n color: rgba(255, 255, 255, 1);\n }\n\n & > :is(.artist, .length) {\n font-size: .8em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n }\n }\n\n & > .preview-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0;\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n top: 8px;\n\n border-radius: 50%;\n padding: 0;\n }\n }\n }\n\n .control-container {\n border: 1px solid;\n\n border-radius: 12px;\n margin-bottom: 15px;\n padding: 18px 22px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .control-container-title {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.margin-top {\n margin-top: 10px;\n }\n }\n\n & > .control-keys {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n & > div {\n display: flex;\n align-items: center;\n width: max-content;\n\n border: 1px solid;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-weight: 500;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .3);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .9);\n\n &:not(.key-select):hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(60, 64, 78, .95);\n }\n\n &.key-select {\n border: 2px dashed;\n\n font-style: italic;\n\n /* Theme dependent */\n border-color: rgba(192, 192, 192, .6);\n box-shadow: 0 0 10px rgba(192, 192, 192, .4);\n\n background: rgba(192, 192, 192, .1);\n }\n\n &.duplicate {\n border: 2px dashed;\n\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n box-shadow: 0 0 10px rgba(255, 87, 34, .5);\n\n background: rgba(255, 87, 34, .1);\n }\n\n & > .key-elem-title {\n margin-right: 10px;\n }\n\n &.add, & > .remove {\n cursor: pointer;\n }\n }\n }\n\n & > .control-actions {\n .control-action {\n border-left: 2px solid;\n\n margin-top: 12px;\n padding-left: 16px;\n\n /* Theme dependent */\n border-left-color: rgba(102, 126, 234, .5);\n\n & > .control-action-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n margin-bottom: 8px;\n\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n span {\n margin-right: 5px;\n }\n\n & > .control-action-title-left {\n white-space: nowrap;\n\n overflow-x: auto;\n\n & > span {\n width: 17px;\n }\n\n & > select {\n border-radius: 6px;\n margin: 0 5px;\n padding: 6px 10px;\n }\n\n & > .params {\n font-size: .85em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n & > .condition-parameter {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n margin: 0 4px;\n\n & > select,\n & > input:not([type=checkbox]) {\n border-radius: 6px;\n padding: 6px 10px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n }\n }\n }\n\n & > .control-action-title-right {\n display: flex;\n\n & > span {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display:flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n\n border-radius: 5px;\n margin-right: 0;\n\n font-size: 1.2em;\n\n transition: background .1s ease;\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n }\n }\n }\n\n & > .action-parameter {\n border: 1px solid;\n\n border-radius: 8px;\n margin-top: 10px;\n padding: 12px 14px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .3);\n\n & > .parameter-title {\n margin-bottom: 8px;\n\n font-size: .9em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n\n & > select,\n & > input:not([type=checkbox]),\n & > duration-input {\n width: 100%;\n\n border-radius: 6px;\n padding: 8px 12px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 20px;\n height: 20px;\n }\n }\n }\n\n & > .control-bottom-container {\n display: flex;\n justify-content: space-between;\n\n margin-top: 10px;\n\n & > div {\n display: flex;\n\n & > .add-action-button {\n width: max-content;\n\n border-radius: 8px;\n padding: 8px 16px;\n\n font-weight: 500;\n }\n }\n }\n }\n }\n\n .text-input-container {\n display: flex;\n gap: 12px;\n\n border-style: 2px dashed;\n\n border-radius: 12px;\n margin-top: 18px;\n padding: 16px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .35);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 0.15),\n rgba(118, 75, 162, 0.15)\n );\n\n & > input[type=\"text\"] {\n flex: 1;\n\n border-style: dashed;\n\n border-radius: 10px;\n padding: 10px 16px;\n\n font-size: .95em;\n\n &:focus {\n border-style: solid;\n }\n }\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n\n margin-top: 20px;\n\n & > .stat-card {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n width: 100%;\n height: 150px;\n\n background-color: transparent;\n\n perspective: 1000px;\n\n transition: transform .3s ease;\n\n &:hover, &:active {\n transform: scale(1.05);\n\n & > .inside {\n transform: rotateY(180deg);\n\n &::before {\n opacity: 1;\n }\n }\n }\n\n & > .inside {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n transform-style: preserve-3d;\n\n transition: transform 0.8s linear(\n 0, 0.005, 0.02 2.2%, 0.046 4.5%, 0.182 11.5%,\n 0.318 16.3%, 0.459 20.6%, 0.601 24.6%, 0.738 28.6%,\n 0.863 32.7%, 0.954 37%, 1.015 41.8%, 1.049 47.4%,\n 1.059, 1.047 57.3%, 1.03 63.5%, 1.012 70.9%,\n 1.002 79.5%, 1\n );\n\n &::before {\n inset: -2px;\n\n border-radius: 14px;\n padding: 2px;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n }\n\n & > :is(.front, .back) {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n position: absolute;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n text-align: center;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .25);\n\n &.front {\n justify-content: center;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .15),\n rgba(118, 75, 162, .15)\n );\n }\n &.back {\n transform: rotateY(180deg);\n\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(118, 75, 162, .15),\n rgba(102, 126, 234, .15)\n );\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 4px;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .4);\n }\n &::-webkit-scrollbar-track {\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n }\n\n & > .stat-value {\n margin-bottom: 8px;\n\n font-size: 2.2em;\n font-weight: 700;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n /* Theme independent */\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .stat-label {\n margin-bottom: 4px;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .stat-sublabel {\n font-size: .8em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n &:not(:last-child) {\n margin-bottom: 8px;\n }\n }\n }\n }\n }\n }\n\n .changelog-content {\n & > .changelog-header {\n border-bottom: 2px solid;\n\n padding-bottom: 24px;\n margin-bottom: 8px;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n & > h1 {\n margin: 0 0 10px 0;\n\n font-size: 2.5em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n\n & > i {\n margin-right: 12px;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > .changelog-subtitle {\n margin: 0 0 20px 0;\n\n font-size: 1.1em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .9);\n }\n\n & > .changelog-nav {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n gap: 8px;\n\n & > .changelog-nav-item {\n cursor: pointer;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 6px 16px;\n\n font-size: .85em;\n font-weight: 600;\n text-decoration: none;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(200, 200, 200, .9);\n background: rgba(102, 126, 234, .08);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n color: rgba(255, 255, 255, 1);\n background: rgba(102, 126, 234, .2);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .3),\n rgba(118, 168, 255, .3)\n );\n box-shadow: 0 0 12px rgba(102, 126, 234, .3);\n }\n }\n }\n }\n\n & > .changelog-divider {\n height: 2px;\n\n margin: 48px auto 8px;\n\n border-radius: 1px;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(102, 126, 234, .4) 20%,\n rgba(118, 168, 255, .4) 50%,\n rgba(102, 126, 234, .4) 80%,\n transparent\n );\n }\n\n & > .changelog-version {\n margin-top: 32px;\n padding: 24px;\n\n border: 1px solid;\n border-radius: 16px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(30, 33, 42, .4);\n\n & > .changelog-version-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n\n border-bottom: 1px solid;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n & > .version-badge-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n margin-bottom: 12px;\n\n & > .version-badge {\n display: inline-block;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 4px 16px;\n\n font-size: .8em;\n font-weight: 700;\n font-family: 'Courier New', monospace;\n letter-spacing: .5px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(118, 168, 255, 1);\n background: rgba(102, 126, 234, .12);\n }\n\n & > .version-tag {\n display: inline-block;\n\n border-radius: 20px;\n padding: 4px 12px;\n\n font-size: .7em;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 1px;\n\n &.latest {\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .4);\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 1.6em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .changelog-version-subtitle {\n margin: 0;\n\n font-size: .9em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .7);\n\n & > i {\n margin-right: 4px;\n }\n }\n }\n\n & > .changelog-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: 24px;\n\n margin: 0 auto;\n padding: 0;\n\n & > .card {\n position: relative;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n overflow: hidden;\n\n transition: border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n background: rgba(40, 43, 52, .6);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &::before {\n content: '';\n\n height: 3px;\n\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n }\n\n &:hover {\n transform: translateY(-4px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5),\n 0 0 0 1px rgba(102, 126, 234, .2);\n\n background: rgba(40, 43, 52, .85);\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n transform: scale(1.1) rotate(5deg);\n }\n }\n\n &.featured {\n grid-column: 1 / -1;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: linear-gradient(135deg,\n rgba(40, 43, 52, .8),\n rgba(50, 53, 62, .8)\n );\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 168, 255, .25)\n );\n }\n }\n\n & > .card-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n\n border-radius: 12px;\n margin-bottom: 16px;\n\n transition: transform .3s ease;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n\n & > i {\n font-size: 24px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 168, 255, 1)\n );\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > h2 {\n margin: 0 0 12px 0;\n\n font-size: 1.35em;\n font-weight: 700;\n letter-spacing: -0.02em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .95);\n }\n\n & > p {\n margin: 0 0 16px 0;\n\n font-size: .95em;\n line-height: 1.6em;\n\n /* Theme dependent */\n color: rgba(118, 168, 255, .9);\n }\n\n & > ul {\n margin: 0;\n padding-left: 24px;\n\n font-size: .9em;\n line-height: 1.7em;\n\n /* Theme dependent */\n color: rgba(229, 229, 229, .9);\n\n & > li {\n margin-bottom: 8px;\n padding-left: 4px;\n\n &::marker {\n /* Theme dependent */\n color: rgba(102, 126, 234, .8);\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n & > strong {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n }\n\n & > code {\n border-radius: 4px;\n padding: 2px 6px;\n\n font-family: 'Courier New', monospace;\n font-size: .9em;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n color: rgba(118, 168, 255, 1);\n }\n\n & > ul {\n margin-top: 6px;\n padding-left: 20px;\n\n & > li {\n font-size: .95em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .85);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .about-content {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 0;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .25);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(30, 33, 42, .95),\n rgba(25, 28, 36, .9)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & > .about-version {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n\n padding: 32px;\n\n font-size: 1.3em;\n font-weight: 700;\n letter-spacing: .5px;\n\n /* Theme dependent */\n box-shadow: 0 4px 20px rgba(143, 163, 255, .25),\n inset 0 1px 0 rgba(255, 255, 255, .15),\n inset 0 -1px 0 rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .25),\n rgba(118, 75, 162, .2)\n );\n\n & > .fa {\n font-size: 1.5em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n filter: drop-shadow(0 2px 8px rgba(143, 163, 255, .6));\n }\n }\n\n & > .about-tagline {\n padding: 24px 32px;\n\n text-align: center;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 255, .08);\n\n & > p {\n margin: 0;\n\n font-size: 1.05em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(180, 185, 200, 1);\n }\n }\n\n & > .about-links {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n padding: 16px;\n\n & > .link-card {\n display: flex;\n align-items: center;\n gap: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n margin-bottom: 12px;\n padding: 16px 20px;\n\n text-decoration: none;\n\n transition:\n border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease,\n border-left-color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n border-left: 3px solid rgba(143, 163, 255, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .6) 40%\n );\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &:hover {\n transform: translateX(6px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .5);\n border-left-color: rgba(143, 163, 255, .8);\n box-shadow: 0 6px 24px rgba(143, 163, 255, .2),\n 0 2px 12px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .15),\n rgba(118, 75, 162, .08) 50%\n );\n\n & > .link-card-icon {\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .25);\n }\n\n & > .link-card-arrow {\n transform: translateX(4px);\n\n opacity: 1;\n }\n }\n\n & > .link-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n\n border-radius: 10px;\n\n font-size: 1.3em;\n\n transition:\n transform .3s ease,\n background .3s ease;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .15);\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .link-card-content {\n flex: 1;\n text-align: left;\n\n & > .link-card-title {\n margin-bottom: 4px;\n\n font-size: 1em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .link-card-desc {\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n & > .link-card-arrow {\n font-size: 1.2em;\n\n opacity: .5;\n\n transition:\n transform .3s ease,\n opacity .3s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .about-footer {\n padding: 0;\n\n & > .footer-divider {\n height: 1px;\n\n margin: 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(143, 163, 255, .3) 20%,\n rgba(143, 163, 255, .3) 80%,\n transparent\n );\n }\n\n & > .about-credits {\n padding: 24px;\n\n & > div {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(max(280px, calc(50% - 6px)), 1fr));\n gap: 12px;\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .credit-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n border-radius: 14px;\n padding: 14px 16px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n border-top: 2px solid rgba(143, 163, 255, .18);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .4) 30%\n );\n\n &:hover {\n transform: translateY(-3px) scale(1.01);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n border-top-color: rgba(143, 163, 255, .5);\n box-shadow: 0 6px 20px rgba(143, 163, 255, .18),\n 0 2px 8px rgba(0, 0, 0, .25);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .1),\n rgba(40, 43, 52, .6) 40%\n );\n }\n\n & > .credit-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n\n border-radius: 50%;\n\n font-size: 1.1em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .15)\n );\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .credit-info {\n flex: 1;\n min-width: 0;\n text-align: left;\n\n & > .credit-name {\n position: relative;\n overflow: hidden;\n\n margin-bottom: 2px;\n\n font-size: .95em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n & > span {\n display: inline-block;\n white-space: nowrap;\n }\n }\n\n & > .credit-role {\n font-size: .8em;\n line-height: 1.4;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n &:hover {\n & > .credit-info {\n & > .credit-name > span {\n animation: scroll-text 3s linear infinite;\n }\n }\n }\n }\n\n & > .copyright-card {\n cursor: pointer;\n\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n text-align: center;\n overflow: hidden;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: rgba(35, 38, 46, .3);\n\n & > .copyright-title {\n margin-bottom: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > .copyright-desc {\n font-size: .75em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(140, 140, 140, 1);\n }\n }\n }\n }\n }\n }\n\n &#ollama-server-url {\n & > .connection-status-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n &:has(#settings-ollama-connection-status:empty) {\n display: none;\n }\n\n &.testing {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.connected {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .7);\n box-shadow: 0 2px 8px rgba(76, 175, 80, .4);\n\n background: rgba(76, 175, 80, .1);\n }\n &.failed {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > #settings-connection-status {\n font-size: .9em;\n }\n }\n }\n\n &#ollama-model-select {\n .models-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n text-align: center;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n &.searching {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .7);\n box-shadow: 0 2px 8px rgba(143, 163, 255, .4);\n\n background: rgba(143, 163, 255, .1);\n }\n &.none {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.error {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > p {\n font-size: .9em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n & > #settings-ollama-models {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 8px;\n\n &:not(:empty) {\n margin-top: 8px;\n }\n\n & > .model {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 12px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(50, 54, 66, .9);\n }\n\n &.selected {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 0 15px rgba(143, 163, 255, .5);\n\n background: rgba(143, 163, 255, .1);\n\n & > .model-top {\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .model-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n\n & > .fa {\n /* Theme dependent */\n color: rgba(128, 128, 128, .5);\n }\n\n & > .model-name {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .pseudo-indicator {\n pointer-events: none;\n\n opacity: 0;\n }\n }\n\n & > .model-bottom {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n }\n }\n }\n\n &#ollama-setup {\n & > .settings-section-title {\n /* Theme dependent */\n color: rgba(255, 54, 34, 1);\n }\n & > .settings-section-desc {\n border-left: 4px solid;\n\n border-radius: 6px;\n padding: 10px;\n\n /* Theme dependent */\n border-left-color: rgba(255, 193, 7, 1);\n\n background: rgba(255, 193, 7, .125);\n\n color: rgba(225, 225, 225, 1);\n }\n }\n\n &.save {\n & > .save-settings-header {\n margin-bottom: 16px;\n }\n\n & > .save-settings-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .save-settings-card {\n border: 1px solid;\n border-radius: 12px;\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .5);\n box-shadow: 0 2px 12px rgba(0, 0, 0, .2);\n\n transition: border-color .3s ease, box-shadow .3s ease;\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n }\n\n & > .card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(50, 54, 66, .6),\n rgba(40, 43, 52, .6)\n );\n border-bottom: 1px solid rgba(255, 255, 255, .06);\n\n & > .card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 10px;\n\n font-size: 1.25em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(143, 163, 255, .15);\n }\n\n & > .card-header-content {\n flex: 1;\n\n & > .card-title {\n font-size: 1.1em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(232, 232, 232, 1);\n }\n\n & > .card-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n }\n }\n\n & > .card-toggle {\n flex-shrink: 0;\n }\n }\n\n & > .card-body {\n padding: 12px;\n\n & > .action-buttons-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n\n & > .action-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(46, 52, 66, .6);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .25);\n background: rgba(56, 62, 76, .7);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n }\n\n & > .action-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 8px;\n\n font-size: 1.15em;\n flex-shrink: 0;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n\n & > .action-card-content {\n flex: 1;\n\n & > .action-card-title {\n font-size: .95em;\n font-weight: 600;\n margin-bottom: 1px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .action-card-desc {\n font-size: .85em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n &.export-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .2),\n rgba(56, 142, 60, .2)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.import-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .5);\n background: rgba(76, 175, 80, .1);\n\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .3),\n rgba(56, 142, 60, .3)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n }\n\n &.reset-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .2),\n rgba(183, 28, 28, .2)\n );\n color: rgba(211, 47, 47, 1);\n }\n }\n }\n }\n\n & > .status-message {\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n animation: scale-in .3s ease;\n\n &.hidden {\n display: none;\n }\n\n & > .status-content {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n & > .status-icon {\n font-size: 1.25em;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n & > .status-text {\n flex: 1;\n\n & > .status-title {\n font-size: .95em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(240, 240, 240, 1);\n }\n\n & > .status-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(210, 210, 210, 1);\n }\n }\n }\n\n &.success {\n /* Theme dependent */\n border: 1px solid rgba(76, 175, 80, .4);\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .15),\n rgba(56, 142, 60, .1)\n );\n box-shadow: 0 4px 16px rgba(76, 175, 80, .2);\n\n & > .status-content > .status-icon {\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.error {\n /* Theme dependent */\n border: 1px solid rgba(211, 47, 47, .4);\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .15),\n rgba(183, 28, 28, .1)\n );\n box-shadow: 0 4px 16px rgba(211, 47, 47, .2);\n\n & > .status-content > .status-icon {\n color: rgba(211, 47, 47, 1);\n }\n }\n\n &.info {\n /* Theme dependent */\n border: 1px solid rgba(255, 193, 7, .4);\n background: linear-gradient(135deg,\n rgba(255, 193, 7, .15),\n rgba(255, 152, 0, .1)\n );\n box-shadow: 0 4px 16px rgba(255, 193, 7, .2);\n\n & > .status-content > .status-icon {\n color: rgba(255, 193, 7, 1);\n }\n }\n }\n\n & > .import-textarea {\n width: 100%;\n min-height: 140px;\n\n border: 2px solid;\n\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n font-family: 'Courier New', Consolas, monospace;\n font-size: .88em;\n line-height: 1.6;\n\n resize: vertical;\n\n animation: scale-in .3s ease;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n background: rgba(20, 23, 32, .8);\n color: rgba(220, 220, 220, 1);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3);\n\n &:focus {\n outline: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .6);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3),\n 0 0 0 3px rgba(143, 163, 255, .15);\n }\n\n &.hidden {\n display: none;\n }\n\n &::placeholder {\n /* Theme dependent */\n color: rgba(130, 130, 130, 1);\n }\n }\n }\n }\n }\n }\n\n .list-container {\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border: 1px solid;\n\n border-radius: 8px;\n margin-bottom: 8px;\n padding: 8px;\n padding-left: 15px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n &.empty {\n padding: 20px;\n\n text-align: center;\n\n opacity: .6;\n }\n\n & > div {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n a > {\n font-weight: 600;\n word-break: break-all;\n }\n\n & > span {\n font-size: .85em;\n\n opacity: .7;\n }\n\n & > .add-action-button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n\n border-radius: 6px;\n\n font-size: 1em;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n\n &.remove-button {\n /* Theme dependent */\n background: rgba(211, 47, 47, .1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(211, 47, 47, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(211, 47, 47, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n }\n }\n }\n }\n }\n\n .settings-compact-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 18px;\n\n margin-bottom: 25px;\n }\n\n .draggable-order-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n\n &.is-dragging .draggable-order-item {\n pointer-events: none;\n\n &:hover {\n transform: none;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: none;\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n opacity: .5;\n\n color: inherit;\n }\n }\n }\n\n & > .draggable-order-item-wrapper {\n position: relative;\n\n transition: transform .2s cubic-bezier(0.2, 0, 0, 1);\n\n &.dragging {\n z-index: 4;\n\n &::after {\n content: '';\n\n width: 100%;\n height: 100%;\n\n border: 2px dashed;\n\n border-radius: 10px;\n\n position: absolute;\n top: 0;\n left: 0;\n\n pointer-events: none;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4),\n inset 0 0 20px rgba(102, 126, 234, .15);\n\n background: rgba(102, 126, 234, .1);\n }\n\n & > .draggable-order-item {\n visibility: hidden;\n }\n }\n }\n\n .draggable-order-item {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 10px;\n padding: 14px 18px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n content: '\\f0c9';\n\n font-family: 'Font Awesome 6 Free';\n font-size: .9em;\n font-weight: 900;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n color .2s ease;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 6px 24px rgba(0, 0, 0, .4);\n\n background: rgba(50, 54, 66, .9);\n\n &::before {\n opacity: .8;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n &:active {\n cursor: grabbing;\n\n transform: scale(1.02);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n box-shadow: 0 8px 32px rgba(102, 126, 234, .3);\n\n background: rgba(60, 65, 80, .95);\n }\n\n &.disabled {\n opacity: .5;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .05);\n\n background: rgba(30, 32, 38, .6);\n\n & > .draggable-order-item-name {\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .draggable-order-item-toggle {\n /* Theme dependent */\n background: rgba(80, 80, 80, .5);\n\n &::before {\n transform: translateX(0);\n\n /* Theme dependent */\n background: rgba(120, 120, 120, 1);\n }\n }\n\n &:hover {\n opacity: .7;\n\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n }\n }\n\n & > .draggable-order-item-name {\n flex: 1;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(230, 230, 230, 1);\n }\n\n & > .draggable-order-item-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 44px;\n height: 24px;\n\n border-radius: 100vh;\n\n position: relative;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 75, 162, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .3);\n\n &::before {\n content: '';\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n position: absolute;\n top: 3px;\n left: 3px;\n\n transform: translateX(20px);\n\n transition: transform .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, .2);\n }\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5);\n }\n }\n }\n }\n }\n }\n }\n }\n\n select, input:not([type=range]), textarea, button {\n border: 1px solid transparent;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-family: inherit;\n font-size: inherit;\n color: var(--color, inherit);\n\n transition: border .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 8px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .3), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .9);\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .4), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), 1);\n }\n &:not(input, textarea):active {\n /* Theme dependent */\n box-shadow: 0 1px 4px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .2), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .95);\n }\n\n &[type=number] {\n -moz-appearance: textfield;\n appearance: textfield;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n appearance: none;\n\n margin: 0;\n }\n }\n }\n\n button {\n cursor: pointer !important;\n\n &:hover {\n transform: translateY(-2px);\n }\n &:active {\n transform: translateY(0);\n }\n }\n\n duration-input {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n font-family: inherit;\n font-size: .9em;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n background: rgba(40, 43, 52, .7);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n background: rgba(40, 43, 52, .85);\n }\n\n & > .infinity-label {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 10px 14px;\n\n font-weight: 500;\n font-size: .95em;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(220, 220, 220, 1);\n background: rgba(35, 38, 48, .6);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2);\n\n &::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n\n position: absolute;\n top: 50%;\n right: 12px;\n\n font-size: 13px;\n line-height: 1;\n\n opacity: 0;\n transform: translateY(-50%) scale(0);\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n & > span {\n flex: 1;\n letter-spacing: .3px;\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(45, 48, 58, .8);\n box-shadow: 0 3px 10px rgba(0, 0, 0, .3);\n }\n\n &.selected {\n border-color: rgba(102, 126, 234, .5);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .2) 0%,\n rgba(118, 75, 162, .2) 100%\n );\n box-shadow: 0 3px 12px rgba(102, 126, 234, .25),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n &::after {\n opacity: 1;\n transform: translateY(-50%) scale(1);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .6);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25) 0%,\n rgba(118, 75, 162, .25) 100%\n );\n box-shadow: 0 4px 16px rgba(102, 126, 234, .35),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n }\n }\n }\n\n & > .duration-inputs {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n\n opacity: 1;\n transform: scale(1);\n\n transition: opacity .2s ease,\n transform .2s cubic-bezier(.4, 0, .2, 1);\n\n & > label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n\n & > span {\n font-size: .75em;\n font-weight: 600;\n letter-spacing: .5px;\n text-align: center;\n text-transform: uppercase;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .85);\n }\n\n & > input {\n cursor: text;\n\n width: 100%;\n\n border: 1px solid;\n border-radius: 6px;\n padding: 8px 10px;\n\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: .95em;\n font-weight: 500;\n text-align: center;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(230, 230, 230, 1);\n background: rgba(30, 33, 42, .9);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n\n &::placeholder {\n color: rgba(150, 154, 170, .6);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(35, 38, 48, 1);\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &:focus {\n outline: none;\n border-color: rgba(102, 126, 234, .6);\n background: rgba(40, 43, 52, 1);\n box-shadow: 0 0 0 2px rgba(102, 126, 234, .2),\n 0 2px 10px rgba(102, 126, 234, .15),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n }\n }\n\n &:has(.infinity-label.selected) > .duration-inputs {\n opacity: .4;\n transform: scale(.98);\n pointer-events: none;\n }\n }\n\n #reset-statistics-button {\n float: right;\n\n font-size: 1rem;\n\n /* Theme dependent */\n --background: 211, 51, 51;\n }\n\n #settings-ollama-refresh-models {\n float: right;\n\n font-size: 1rem;\n }\n }\n\n .ws-username-highlight {\n position: relative;\n\n &::before {\n content: \"\";\n\n pointer-events: none;\n\n position: absolute;\n inset: 0;\n\n border-radius: 10px;\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n }\n }\n}"; /***/ }, /***/ 4192(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.generateRandomUUID = generateRandomUUID; function GenerateUUID() { if (crypto && crypto.randomUUID) return crypto.randomUUID(); return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c === "x" ? r : r & 3 | 8; return v.toString(16); }); } const size = 256; const cache = []; function Fill() { if (cache.length < size) cache.push(GenerateUUID()); requestIdleCallback(Fill); } if (typeof requestIdleCallback === "function") requestIdleCallback(Fill); function generateRandomUUID() { if (cache.length === 0) return GenerateUUID(); return cache.pop(); } /***/ }, /***/ 4041(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.CreateDOMElement = CreateDOMElement; function CreateDOMElement(tag, options = {}) { const $el = document.createElement(tag); if ("id" in options) $el.id = options.id; if ("class" in options) $el.className = options.class; if ("text" in options) $el.textContent = options.text; if ("html" in options) $el.innerHTML = options.html; if ("content" in options) $el.append(options.content); if ("value" in options) $el.value = options.value; if ("attributes" in options) for (const [key, value] of Object.entries(options.attributes || {})) $el.setAttribute(key, value); if ("dataset" in options) for (const [key, value] of Object.entries(options.dataset || {})) $el.dataset[key] = value; if ("style" in options) for (const [key, value] of Object.entries(options.style || {})) $el.style.setProperty(key, value); return $el; } /***/ }, /***/ 5643(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.fullTrim = void 0; const fullTrim = str => { const lines = str.split("\n"), length = lines.length; let start = true, indent = Infinity; let temp = [], parsed = []; for (let i = 0; i < length; i++) { const line = lines[i]; if (line.trim() === "") { if (start) { continue; } else { temp.push(""); } } else { if (start) { start = false; } else { parsed = parsed.concat(temp); temp = []; } const leadingSpaces = line.match(/^(\s*)/)[0].length; indent = Math.min(indent, leadingSpaces); parsed.push(line); } } const parsedLength = parsed.length; if (parsedLength === 0) { return ""; } const result = []; for (let i = 0; i < parsedLength; i++) { const line = parsed[i].trimEnd(); if (line === "") { result.push(""); } else { result.push(line.slice(indent)); } } return result.join("\n"); }; exports.fullTrim = fullTrim; /***/ }, /***/ 2852(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Memory = void 0; class Memory { constructor(options = {}) { this.order = []; this.store = new Map; this.timeouts = new Map; if ("timeout" in options) this.timeout = options.timeout; if ("size" in options) this.maxSize = options.size; } clear() { this.order = []; this.store.clear(); this.timeouts.clear(); } has(key) { return this.store.has(key); } get(key) { return this.store.get(key); } set(key, value) { const existingIndex = this.order.indexOf(key); if (existingIndex !== -1) this.order.splice(existingIndex, 1); this.order.push(key); this.store.set(key, value); if (this.timeouts.has(key)) clearTimeout(this.timeouts.get(key)); if (this.timeout !== undefined) this.timeouts.set(key, setTimeout(() => { this.delete(key); }, this.timeout)); if (this.maxSize !== undefined && this.store.size > this.maxSize) this.delete(this.order.shift()); } add(key) { if (!this.store.has(key)) this.set(key, true); } delete(key) { const index = this.order.indexOf(key); if (index !== -1) this.order.splice(index, 1); this.store.delete(key); clearTimeout(this.timeouts.get(key)); this.timeouts.delete(key); } size() { return this.store.size; } } exports.Memory = Memory; /***/ }, /***/ 2595(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Stack = void 0; class Stack { constructor(maxSize = 50) { this.items = []; this.maxSize = maxSize; } push(item) { this.items.push(item); if (this.items.length > this.maxSize) this.items.shift(); } pop() { return this.items.pop(); } unshift(item) { this.items.unshift(item); if (this.items.length > this.maxSize) this.items.pop(); } shift() { return this.items.shift(); } peek() { return this.items[this.items.length - 1]; } clear() { this.items = []; } get length() { return this.items.length; } set length(v) { this.items.length = Math.min(v, this.maxSize); } } exports.Stack = Stack; /***/ }, /***/ 6873(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Trie = void 0; var _scriptEsm = __webpack_require__(4192); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } /* const Node = { UUID: <UUID>, defined: <boolean>, value: <any>, terminal: <boolean>, children: Map<any, Node> }; */ var _Trie_brand = new WeakSet; class Trie { constructor(options = {}) { _classPrivateMethodInitSpec(this, _Trie_brand); this.order = {}; this.store = new Map; this.timeouts = new Map; if ("timeout" in options) this.timeout = options.timeout; if ("size" in options) this.maxSize = options.size; } clear() { this.order = {}; this.store.clear(); this.timeouts.clear(); } has(...keys) { var _scope$get; const lastKey = keys.pop(); let scope = this.store; for (const key of keys) { if (!scope.has(key)) return false; const temp = scope.get(key); if (temp.terminal) return false; scope = temp.children; } return ((_scope$get = scope.get(lastKey)) === null || _scope$get === void 0 ? void 0 : _scope$get.defined) === true; } get(...keys) { var _scope$get2; const lastKey = keys.pop(); let scope = this.store; for (const key of keys) { if (!scope.has(key)) return undefined; const temp = scope.get(key); if (temp.terminal) return undefined; scope = temp.children; } return (_scope$get2 = scope.get(lastKey)) === null || _scope$get2 === void 0 ? void 0 : _scope$get2.value; } set(...keys) { var _scope$get4; const value = keys.pop(); let UUID = ((keys, _scope$get3) => { const lastKey = keys.pop(); let scope = this.store; for (const key of keys) { if (!scope.has(key)) return undefined; const temp = scope.get(key); if (temp.terminal) return undefined; scope = temp.children; } return (_scope$get3 = scope.get(lastKey)) === null || _scope$get3 === void 0 ? void 0 : _scope$get3.UUID; })(keys); delete this.order[UUID]; if (UUID === undefined) UUID = (0, _scriptEsm.generateRandomUUID)(); const finalKey = keys.pop(); let scope = this.store; for (const key of keys) { if (scope.has(key)) { var _temp$children; const temp = scope.get(key); temp.terminal = false; (_temp$children = temp.children) !== null && _temp$children !== void 0 ? _temp$children : temp.children = new Map; scope = temp.children; } else { const temp = { defined: false, terminal: false, children: new Map }; scope.set(key, temp); scope = temp.children; } } const final = (_scope$get4 = scope.get(finalKey)) !== null && _scope$get4 !== void 0 ? _scope$get4 : { terminal: true }; final.UUID = UUID; final.defined = true; final.value = value; scope.set(finalKey, final); this.order[UUID] = keys.concat([ finalKey ]); if (this.timeouts.has(UUID)) clearTimeout(this.timeouts.get(UUID)); if (this.timeout !== undefined) this.timeouts.set(UUID, setTimeout(() => { _assertClassBrand(_Trie_brand, this, _deleteByUUID).call(this, UUID); }, this.timeout)); if (this.maxSize !== undefined && Object.keys(this.order).length > this.maxSize) _assertClassBrand(_Trie_brand, this, _deleteByUUID).call(this, this.order.shift()); } add(key) { if (!this.store.has(key)) this.set(key, true); } delete(...keys) { const UUID = ((keys, _scope$get5) => { const lastKey = keys.pop(); let scope = this.store; for (const key of keys) { if (!scope.has(key)) return undefined; const temp = scope.get(key); if (temp.terminal) return undefined; scope = temp.children; } return (_scope$get5 = scope.get(lastKey)) === null || _scope$get5 === void 0 ? void 0 : _scope$get5.UUID; })(keys); if (UUID !== undefined) _assertClassBrand(_Trie_brand, this, _deleteByUUID).call(this, UUID); } size() { return Object.keys(this.order).length; } } exports.Trie = Trie; function _deleteByUUID(UUID) { var _final$children; if (this.timeouts.has(UUID)) clearTimeout(this.timeouts.get(UUID)); this.timeouts.delete(UUID); const keys = this.order[UUID]; delete this.order[UUID]; const scopes = [ { children: this.store } ]; let scope = this.store; for (const key of keys) { const temp = scope.get(key); scopes.push(temp); scope = temp.children; } const final = scopes.pop(); final.defined = false; delete final.value; if (((_final$children = final.children) === null || _final$children === void 0 ? void 0 : _final$children.size) > 0) return; for (let i = scopes.length - 1; i >= 0; i--) { const scope = scopes[i]; const key = keys.pop(); scope.children.delete(key); if (scope.children.size > 0 || scope.defined) break; scope.terminal = true; delete scope.children; } } /***/ }, /***/ 4551(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.truncate = truncate; function truncate(str, len) { return str.length > len ? `${str.substring(0, len - 3).trimEnd()}...` : str; } /***/ }, /***/ 1289(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.convertToUTCString = void 0; const convertToUTCString = date => `${date.getUTCFullYear().toString().padStart(4, "0")}-` + `${(date.getUTCMonth() + 1).toString().padStart(2, "0")}-` + `${date.getUTCDate().toString().padStart(2, "0")}T` + `${date.getUTCHours().toString().padStart(2, "0")}:` + `${date.getUTCMinutes().toString().padStart(2, "0")}:` + `${date.getUTCSeconds().toString().padStart(2, "0")}`; exports.convertToUTCString = convertToUTCString; /***/ }, /***/ 8678(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Ollama = exports.AI = void 0; var _namespaces = __webpack_require__(4018); var _scriptEsm = __webpack_require__(5643); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _AI_brand = new WeakSet; class AI { static registerProvider(name, providerClass) { AI.providers[name] = providerClass; } setup(type, item) { if (this.analysis[type].has(item.id)) { const analysis = this.analysis[type].get(item.id); analysis.count++; return analysis.request; } const abortController = new AbortController; const request = this.fetch(type, item, abortController.signal); this.analysis[type].set(item.id, { request, abortController, count: 1 }); request.finally(() => { this.analysis[type].delete(item.id); }); return request; } async fetch(type, item, abortSignal) { return { error: "No service has been selected" }; } constructor(ws, config) { _classPrivateMethodInitSpec(this, _AI_brand); _defineProperty(this, "analysis", { edit: new Map, username: new Map }); _defineProperty(this, "cache", { username: new Set }); _defineProperty(this, "analyze", { edit: item => this.setup("edit", item), username: item => { if (this.cache["username"].has(item.user.name)) { return Promise.resolve({ flag: false, confidence: 1, issues: [], explanation: "Username previously analyzed." }); } this.cache["username"].add(item.user.name); return this.setup("username", item); } }); _defineProperty(this, "cancel", { all: (type = true) => { if (type === true) { for (const type of Object.keys(this.analysis)) for (const id of (_this$analysis$type = this.analysis[type]) === null || _this$analysis$type === void 0 ? void 0 : _this$analysis$type.keys()) { var _this$analysis$type; this.cancel[type](id); } } else { for (const id of (_this$analysis$type2 = this.analysis[type]) === null || _this$analysis$type2 === void 0 ? void 0 : _this$analysis$type2.keys()) { var _this$analysis$type2; this.cancel[type](id); } } }, edit: id => { const analysis = this.analysis["edit"].get(id); if (analysis) { analysis.count--; if (analysis.count <= 0) { analysis.abortController.abort("Edit analysis canceled by user"); this.analysis["edit"].delete(id); } } }, username: id => { const analysis = this.analysis["username"].get(id); if (analysis) { analysis.count--; if (analysis.count <= 0) { analysis.abortController.abort("Username analysis canceled by user"); this.analysis["username"].delete(id); } } } }); _defineProperty(this, "prompt", { edit: async item => { var _namespaces$find, _item$tags; const diffText = _assertClassBrand(_AI_brand, this, _parseDiff).call(this, item.diff); const namespace = (_namespaces$find = _namespaces.namespaces.find(ns => ns.id === item.ns)) !== null && _namespaces$find !== void 0 ? _namespaces$find : _namespaces.namespaces[0]; let userType = "registered"; if (item.user.temp) userType = "temporary (unregistered)"; else if (item.user.ip) userType = "IP (unregistered)"; const categories = item.page.categories.join(", ") || "(none)"; const isBLP = item.page.categories.some(c => /living people/i.test(c)); return (0, _scriptEsm.fullTrim)(`\nYou are an automated Wikipedia item reviewer. Analyze the following item and determine whether the CHANGES INTRODUCED violate Wikipedia policy.\n\nCRITICAL: You are evaluating what this item CHANGED, not the page content before it. The diff shows removed lines (prefixed "-") and added lines (prefixed "+"). Only ADDED content can be a new violation. Removing bad content is a GOOD item. Adding references, citations, and sources is GOOD — it improves verifiability, not the opposite.\n\nitem CONTEXT:\n- Page: "${item.page.title}" (${namespace.name} namespace)\n- Categories: ${categories}${isBLP ? "\n- ⚠ BLP: This page is about a living person. Unsourced negative claims are a serious concern." : ""}\n- User: "${item.user.name}" (${userType}, warning level: ${item.user.warning}/4)\n- ORES vandalism probability: ${(item.ores * 100).toFixed(0)}%\n- Size change: ${item.sizediff > 0 ? "+" : ""}${item.sizediff} bytes\n- Flagged minor: ${item.minor ? "yes" : "no"}\n- Summary: ${item.comment || "(empty)"}\n- Tags: ${((_item$tags = item.tags) === null || _item$tags === void 0 ? void 0 : _item$tags.join(", ")) || "(none)"}\n\nWHAT TO CHECK:\n1. VANDALISM: Does the item add nonsense, profanity as attacks, hoaxes, blanking, or deliberate misinformation? (WP:VANDALISM)\n2. NPOV: Does the item add clearly biased or one-sided language that is not presented neutrally? (WP:NPOV)\n3. VERIFIABILITY: Does the item add claims that are extraordinary or contentious WITHOUT any sourcing? Note: adding "<ref>" tags, URLs, or citation templates is adding sources — this is the OPPOSITE of a verifiability problem. (WP:V)\n4. ORIGINAL RESEARCH: Does the item add novel analysis, synthesis, or unpublished interpretation not attributable to any source? Simply adding text IS NOT original research if it restates commonly known facts or is sourced. Adding citations is NEVER original research. (WP:NOR)\n5. BLP: If this is a BLP article, does the item add unsourced or poorly-sourced negative material about the subject? (WP:BLP)\n\nWHAT IS NOT A VIOLATION:\n- Adding references, citations, "<ref>" tags, or URLs (this IMPROVES the article)\n- Removing vandalism or bad content\n- Fixing grammar, spelling, formatting, or wikilinks\n- Content about controversial topics written in a neutral, encyclopedic tone\n- Wikipedia is NOT censored — explicit content on appropriate pages is allowed (WP:NOTCENSORED)\n- Absent or auto-generated item summaries (e.g. "/* Section name */") are normal, not violations\n- ORES scores and warning levels are hints — do NOT treat them as evidence by themselves\n\nASSESSMENT SCALE:\n- "Good": No policy issues. Normal constructive item.\n- "Review": Minor concerns; a human should glance at it.\n- "Suspicious": Likely problematic; warrants close scrutiny.\n- "Bad": Clear policy violation.\n\nWhen in doubt between two ratings, choose the LESS severe one. Most items on Wikipedia are constructive — reflect that in your assessments.\n\nFor issues, use short policy codes (e.g. "WP:VANDALISM", "WP:NPOV", "WP:BLP"). Keep your explanation to 1-3 sentences.\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: <b>Clear vandalism</b> — added <code>lol hacked</code> which violates <i>WP:VANDALISM</i>.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n\nDIFF:\n${diffText}\n`); }, username: async item => { var _item$page; return (0, _scriptEsm.fullTrim)(`\nYou are an automated Wikipedia username policy reviewer. Determine whether the username below violates Wikipedia's username policy.\n\nUSERNAME: ${item.user.name}\nPAGE CONTEXT: ${((_item$page = item.page) === null || _item$page === void 0 ? void 0 : _item$page.title) || "(unknown)"}\n\nThe page context is provided ONLY to check for potential conflict-of-interest (e.g. a user named "AcmeCorp" iteming the Acme Corporation article). A controversial page topic does NOT make the username problematic.\n\nVIOLATION CATEGORIES (flag ONLY if the username clearly and unambiguously fits one):\n\n1. Offensive — The name is unambiguously profane, threatening, sexually explicit, or promotes vandalism. Merely edgy, weird, or humorous names do NOT qualify. (WP:U#OFFENSIVE)\n2. Disruptive — The name clearly declares intent to disrupt or vandalize (e.g. "I Will Vandalize"). (WP:U#DISRUPTIVE)\n3. Libelous — The name makes a clearly false or disparaging claim about a specific real person, or reveals private personal information. (WP:U#LIBEL)\n4. Misleading — The name impersonates a specific real person, or falsely claims special permissions by including terms like "admin", "sysop", "bureaucrat", "checkuser". (WP:U#MISLEADING)\n5. Promotional — The name is a URL or email address whose clear purpose is advertising or revenue. Containing a brand name alone is NOT enough. (WP:U#PROMO)\n6. Shared — The name unambiguously represents a company, organization, or role rather than an individual (e.g. "XYZ Foundation", "Secretary of ABC"). Names like "JohnAtAcme" or "AcmeFan123" are fine — they clearly identify an individual. (WP:U#SHARED)\n\nDECISION RULES:\n- Flag ONLY clear, unambiguous violations. Borderline = no flag.\n- Numbers at the end of a username (e.g. "itemor2847", "WikiFan99") are completely normal and NOT a violation of any kind.\n- Creative, odd, humorous, or meaningless usernames are NOT violations.\n- Containing a real word that could be offensive in some context is NOT enough — the name must be clearly and intentionally offensive.\n- When in doubt: do NOT flag. Set flag to false.\n- If not flagging, set explanation to "No violation."\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: Username contains <code>sysop</code> which falsely implies <i>WP:U#MISLEADING</i> permissions.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n`); } }); this.ws = ws; this.settings = ws.store.settings.AI; this.config = config; } async test() { return false; } async models() { return []; } } exports.AI = AI; function _parseDiff(diffHtml) { var _container$textConten; const container = document.createElement("div"); container.innerHTML = diffHtml; const lines = []; for (const row of container.querySelectorAll("tr")) { const deleted = row.querySelector(".diff-deletedline"); const added = row.querySelector(".diff-addedline"); const context = row.querySelector(".diff-context"); if (deleted) lines.push(`- ${deleted.textContent.trim()}`); if (added) lines.push(`+ ${added.textContent.trim()}`); else if (context) lines.push(` ${context.textContent.trim()}`); } if (lines.length > 0) return lines.join("\n"); // Fallback: strip HTML tags and return plain text return ((_container$textConten = container.textContent) === null || _container$textConten === void 0 ? void 0 : _container$textConten.trim()) || ""; } _defineProperty(AI, "providers", {}); const EDIT_RESPONSE_FORMAT = { type: "object", properties: { issues: { type: "array", items: { type: "object", properties: { policy: { type: "string" }, severity: { type: "string", enum: [ "Low", "Medium", "High", "Critical" ] } }, required: [ "policy", "severity" ] } }, explanation: { type: "string" }, assessment: { type: "string", enum: [ "Good", "Review", "Suspicious", "Bad" ] }, confidence: { type: "number", minimum: 0, maximum: 1 } }, required: [ "assessment", "confidence", "issues", "explanation" ] }; const USERNAME_RESPONSE_FORMAT = { type: "object", properties: { issues: { type: "array", items: { type: "object", properties: { policy: { type: "string", enum: [ "Offensive", "Disruptive", "Libelous", "Misleading", "Promotional", "Shared" ] }, severity: { type: "string", enum: [ "Low", "Medium", "High", "Critical" ] } }, required: [ "policy", "severity" ] } }, explanation: { type: "string" }, flag: { type: "boolean" }, confidence: { type: "number", minimum: 0, maximum: 1 } }, required: [ "flag", "confidence", "issues", "explanation" ] }; class Ollama extends AI { async test() { try { const response = await fetch(`${this.config.server}/api/version`, { method: "GET" }); return response.ok; } catch (error) { return false; } } async models() { try { const response = await fetch(`${this.config.server}/api/tags`, { method: "GET", headers: { "Content-Type": "application/json" } }); if (!response.ok) throw new Error(`Ollama API error: ${response.status} ${response.statusText}`); const data = await response.json(); return data.models || []; } catch (error) { throw error; } } async fetch(type, item, signal = null) { try { const prompt = this.prompt[type](item); const fetchOptions = { method: "POST", headers: { "Content-Type": "application/json" } }; const body = { model: this.config.model, prompt: await prompt, stream: false, options: { temperature: .1, top_p: .9, num_predict: 1024 }, format: type === "edit" ? EDIT_RESPONSE_FORMAT : USERNAME_RESPONSE_FORMAT }; fetchOptions.body = JSON.stringify(body); if (signal) fetchOptions.signal = signal; let response; try { response = await fetch(`${this.config.server}/api/generate`, fetchOptions); if (!response.ok) throw new Error(`Ollama API error: ${response.status} ${response.statusText}`); const data = await response.json(); if (!data.response) throw new Error("Empty response from Ollama"); return JSON.parse(data.response); } catch (err) { return { error: err.message || "Ollama request failed" }; } } catch (error) { return { error: error.message || "Ollama request failed" }; } } } exports.Ollama = Ollama; AI.registerProvider("Ollama", Ollama); /***/ }, /***/ 8169(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.AudioManager = void 0; var _scriptEsm = __webpack_require__(4192); var _zengine = __webpack_require__(1258); const audio = { startup: { type: "sound", title: "Startup Sound", description: "Sound played when WikiShield starts up.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/startup.wav" }, music: { type: "category", title: "Music", description: "Background music tracks.", volume: 1, properties: { zen_mode: { type: "sound", title: "Zen Mode", description: "Background audio played in Zen mode.", volume: 1, data: "custom://zen_mode", preview: false } } }, ui: { type: "category", title: "User Interface Sounds", description: "Sounds used for user interface interactions.", volume: 1, properties: { click: { type: "sound", title: "Click Sound", description: "Sound played when clicking on interface elements.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/click.wav" } } }, queue: { type: "category", title: "Queue Sounds", description: "Sounds played for queue events.", volume: 1, properties: { ores: { type: "sound", title: "ORES Alert", description: "Sound played due to a high ORES score.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/ores.wav" }, mention: { type: "sound", title: "Mention Alert", description: "Sound played when your username is mentioned in an edit.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/mention.wav" } } }, notification: { type: "category", title: "Notification Sounds", description: "Sounds played for various notifications.", volume: 1, properties: { alert: { type: "sound", title: "Alert Sound", description: "Sound played for alerts.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/alert.wav" }, message: { type: "sound", title: "Message Sound", description: "Sound played for messages.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/message.wav" }, toast: { type: "sound", title: "Toast Sound", description: "Sound played for toast notifications.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/toast.wav" } } }, action: { type: "category", title: "Action Sounds", description: "Sounds played for various user actions.", volume: 1, properties: { default: { type: "sound", title: "Default Action Sound", description: "Sound played for default actions.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/action.wav" }, failed: { type: "sound", title: "Failed Action Sound", description: "Sound played when an action fails.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/failed.wav" }, report: { type: "sound", title: "Report Action Sound", description: "Sound played for report actions.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/report.wav" } } } }; class AudioManager { constructor(ws) { this.ws = ws; this.audio = audio; this.soundEffects = new Map; this.previews = new Map; this.previewing = false; } async init() { this.zengine = new _zengine.Zengine; this.zengine.debug = this.ws.__DEV__; await this.zengine.init(); this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"]); } async playSound(soundPath, signal, preview = false, callback) { if (!preview) { const zenMode = this.ws.store.settings.zen_mode; if (zenMode.enabled && !zenMode.sound.enabled) return; } const sound = this.getSound(soundPath); if (!sound || !sound.data) return; const volume = this.getVolume(soundPath); const audio = new Audio(sound.data); audio.volume = !preview && this.previewing ? 0 : volume; if ("mediaSession" in navigator) { navigator.mediaSession.setActionHandler("play", () => {}); navigator.mediaSession.setActionHandler("pause", () => {}); navigator.mediaSession.setActionHandler("previoustrack", () => {}); navigator.mediaSession.setActionHandler("nexttrack", () => {}); } const muteId = (0, _scriptEsm.generateRandomUUID)(); if (preview) { this.muteId = muteId; this.previewing = true; this.stopPreviews(); this._muteAll(); this.previews.set(audio, soundPath); } this.soundEffects.set(audio, soundPath); const promise = new Promise((resolve, reject) => { audio.resolve = resolve; audio.reject = reject; }); audio.onended = () => { audio.resolve(); this.soundEffects.delete(audio); if (preview) { this.previewing = false; setTimeout(() => { if (this.muteId === muteId) this._unmuteAll(); }, 250); this.previews.delete(audio); } }; audio.onerror = () => { audio.resolve(); this.soundEffects.delete(audio); if (preview) { this.previewing = false; setTimeout(() => { if (this.muteId === muteId) this._unmuteAll(); }, 250); this.previews.delete(audio); } }; let played = false; audio.onplay = () => { if (played) return; played = true; if (callback) callback(); }; signal === null || signal === void 0 || signal.addEventListener("abort", () => { audio.pause(); audio.src = ""; audio.resolve(); this.soundEffects.delete(audio); if (preview) { this.previewing = false; setTimeout(() => { if (this.muteId === muteId) { this._unmuteAll(); } }, 250); this.previews.delete(audio); } }); audio.play(); return promise; } async previewSound(soundPath) { const sound = this.getSound(soundPath); if (!sound || !sound.data) return; this._muteAll(); const audio = new Audio(sound.data); audio.volume = this.getVolume(soundPath); this.previews.set(audio, soundPath); const cleanup = () => { this.previews.delete(audio); if (this.previews.size === 0) this._unmuteAll(); }; audio.onended = cleanup; audio.onerror = cleanup; await audio.play(); } stopPreviews() { for (const audio of this.previews.keys()) { audio.resolve(); audio.pause(); audio.onended = null; audio.onerror = null; audio.src = ""; } this.previews.clear(); this._unmuteAll(); } onvolumechanged() { this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"]); if (this.previewing) for (const [audio, soundPath] of this.previews.entries()) { const newVolume = this.getVolume(soundPath); audio.volume = newVolume; } else for (const [audio, soundPath] of this.soundEffects.entries()) { const newVolume = this.getVolume(soundPath); audio.volume = newVolume; } } _muteAll() { for (const audio of this.soundEffects.keys()) audio.volume = 0; } _unmuteAll() { for (const [audio, soundPath] of this.soundEffects.entries()) audio.volume = this.getVolume(soundPath); } getSound(path) { let current = { type: "category", properties: this.audio }; for (const segment of path) { if (current.type === "category") current = current.properties[segment]; else return null; if (!current) return null; } return current; } getVolume(path) { const volumes = this.ws.store.settings.audio.volume; let volume = volumes.master; let current = { type: "category", properties: this.audio }; const pathParts = [ "master" ]; for (const segment of path) { pathParts.push(segment); if (current.type === "category") current = current.properties[segment]; else return volume; if (!current) break; const specificVolume = volumes[pathParts.join(".")]; if (specificVolume !== undefined) volume *= specificVolume; } return volume; } } exports.AudioManager = AudioManager; /***/ }, /***/ 1258(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Zengine = void 0; class MusicEngine { constructor() { this.audioContext = null; this.masterGain = null; this.isPlaying = false; this.debug = false; this.layers = { bass: { oscillators: [], gains: [], compressor: null }, pad: { oscillators: [], gains: [], filter: null, reverb: null } }; this.nextChordTimeout = null; this.baseFrequency = 65.41; this.currentKey = 0; this.chordLibrary = { maj7: { bass: [ 0 ], pad: [ 0, 7, 11, 16, 19 ], tension: .1 }, min7: { bass: [ 0 ], pad: [ 0, 7, 10, 15, 19 ], tension: .15 }, maj9: { bass: [ 0 ], pad: [ 0, 7, 11, 14, 19 ], tension: .12 }, min9: { bass: [ 0 ], pad: [ 0, 7, 10, 14, 19 ], tension: .18 }, sus2: { bass: [ 0 ], pad: [ 0, 7, 12, 14, 19 ], tension: .25 }, sus4: { bass: [ 0 ], pad: [ 0, 7, 12, 17, 19 ], tension: .28 }, add9: { bass: [ 0 ], pad: [ 0, 7, 14, 16, 21 ], tension: .15 }, madd9: { bass: [ 0 ], pad: [ 0, 7, 14, 15, 21 ], tension: .2 }, openvoice: { bass: [ 0 ], pad: [ 0, 7, 12, 19, 24 ], tension: .08 }, "6add9": { bass: [ 0 ], pad: [ 0, 7, 9, 14, 19 ], tension: .18 } }; this.chordCompatibility = { maj7: [ "maj9", "min7", "sus2", "add9", "openvoice", "6add9" ], min7: [ "maj7", "min9", "sus4", "madd9", "openvoice" ], maj9: [ "maj7", "add9", "sus2", "6add9", "openvoice" ], min9: [ "min7", "madd9", "sus2", "maj9" ], sus2: [ "maj7", "maj9", "add9", "openvoice", "sus4" ], sus4: [ "maj7", "sus2", "min7", "openvoice" ], add9: [ "maj9", "sus2", "maj7", "openvoice", "6add9" ], madd9: [ "min9", "min7", "add9", "sus2" ], openvoice: [ "sus2", "maj7", "add9", "maj9" ], "6add9": [ "maj7", "maj9", "add9", "sus2" ] }; this.currentChordName = "maj7"; this.currentTension = .1; } init() { if (!this.audioContext) { this.audioContext = new (window.AudioContext || window.webkitAudioContext); this.masterGain = this.audioContext.createGain(); this.masterGain.connect(this.audioContext.destination); this.masterGain.gain.value = .2; this.setupLayerEffects(); } } async start() { if (this.isPlaying) return; this.init(); if (this.audioContext.state === "suspended") await this.audioContext.resume(); this.isPlaying = true; this.currentKey = Math.floor(Math.random() * 12); this.playNextChord(); } setupLayerEffects() { const bassComp = this.audioContext.createDynamicsCompressor(); bassComp.threshold.value = -30; bassComp.knee.value = 40; bassComp.ratio.value = 12; bassComp.attack.value = .003; bassComp.release.value = .25; bassComp.connect(this.masterGain); this.layers.bass.compressor = bassComp; const padFilter = this.audioContext.createBiquadFilter(); padFilter.type = "lowpass"; padFilter.frequency.value = 1200; padFilter.Q.value = .5; const padDelay = this.audioContext.createDelay(2); padDelay.delayTime.value = .4; const delayGain = this.audioContext.createGain(); delayGain.gain.value = .3; padFilter.connect(padDelay); padDelay.connect(delayGain); delayGain.connect(padFilter); padFilter.connect(this.masterGain); this.layers.pad.filter = padFilter; this.layers.pad.reverb = { delay: padDelay, gain: delayGain }; } playNextChord() { if (!this.isPlaying) return; const nextChord = this.chooseNextChord(); const prevChord = this.currentChordName; this.currentChordName = nextChord; this.currentTension = this.chordLibrary[nextChord].tension; if (this.debug) { console.log("[MusicEngine] Chord changed", { from: prevChord, to: nextChord, tension: this.currentTension, key: this.currentKey, timestamp: this.audioContext.currentTime }); } if (Math.random() < .08) { const oldKey = this.currentKey; this.currentKey = (this.currentKey + [ 2, 5, 7 ][Math.floor(Math.random() * 3)]) % 12; if (this.debug) console.log("[MusicEngine] Key changed", { from: oldKey, to: this.currentKey }); } this.transitionToChord(nextChord); const nextDelay = 12e3 + Math.random() * 1e4; this.nextChordTimeout = setTimeout(() => this.playNextChord(), nextDelay); } chooseNextChord() { const compatible = this.chordCompatibility[this.currentChordName] || Object.keys(this.chordLibrary); const weighted = compatible.map(name => { const tension = this.chordLibrary[name].tension; const weight = tension < .2 ? 2 : 1; return { name, weight }; }); const total = weighted.reduce((sum, item) => sum + item.weight, 0); let random = Math.random() * total; for (const item of weighted) { random -= item.weight; if (random <= 0) return item.name; } return compatible[0]; } transitionToChord(chordName) { const chord = this.chordLibrary[chordName]; if (!chord) return; const fadeDuration = 6 + Math.random() * 3; [ "bass", "pad" ].forEach(layerName => this.createLayer(layerName, chord[layerName], fadeDuration)); } createLayer(layerName, noteOffsets, fadeDuration) { if (!(noteOffsets !== null && noteOffsets !== void 0 && noteOffsets.length)) return; const now = this.audioContext.currentTime; const layer = this.layers[layerName]; if (layer.gains && layer.gains.length > 0) { const oldOscillators = [ ...layer.oscillators ]; const oldGains = [ ...layer.gains ]; oldGains.forEach(gain => { try { gain.gain.cancelScheduledValues(now); gain.gain.setValueAtTime(gain.gain.value, now); gain.gain.linearRampToValueAtTime(0, now + fadeDuration); } catch (e) {} }); setTimeout(() => { oldOscillators.forEach(osc => { try { osc.stop(); osc.disconnect(); } catch (e) {} }); oldGains.forEach(gain => { try { gain.disconnect(); } catch (e) {} }); }, fadeDuration * 1e3 + 100); } const newOscillators = []; const newGains = []; const frequencies = []; noteOffsets.forEach((offset, index) => { const frequency = this.baseFrequency * Math.pow(2, (this.currentKey + offset) / 12); frequencies.push(frequency); const osc = this.audioContext.createOscillator(); osc.type = layerName === "bass" ? "sine" : "triangle"; osc.frequency.value = frequency; osc.detune.value = (Math.random() - .5) * 6; const gain = this.audioContext.createGain(); gain.gain.value = 0; osc.connect(gain); if (layerName === "bass" && layer.compressor) gain.connect(layer.compressor); else if (layer.filter) gain.connect(layer.filter); osc.start(now); newOscillators.push(osc); newGains.push(gain); const volume = layerName === "bass" ? .15 : .08 - index * .01; gain.gain.setValueAtTime(0, now); gain.gain.linearRampToValueAtTime(volume, now + fadeDuration); }); if (this.debug) console.log("[MusicEngine] Layer created", { layer: layerName, frequencies, volumes: newGains.map(g => g.gain.value), fadeDuration }); layer.oscillators = newOscillators; layer.gains = newGains; } stop() { this.isPlaying = false; if (this.nextChordTimeout) clearTimeout(this.nextChordTimeout); if (this.debug) console.log("[MusicEngine] Stopping music engine", { timestamp: this.audioContext.currentTime }); const now = this.audioContext.currentTime; const fadeDuration = .5; Object.values(this.layers).forEach(layer => { if (layer.gains) { layer.gains.forEach(gain => { try { gain.gain.setValueAtTime(gain.gain.value, now); gain.gain.linearRampToValueAtTime(0, now + fadeDuration); } catch (e) {} }); } if (layer.oscillators) { setTimeout(() => { layer.oscillators.forEach(osc => { try { osc.stop(); osc.disconnect(); } catch (e) {} }); layer.oscillators = []; if (layer.gains) { layer.gains.forEach(gain => { try { gain.disconnect(); } catch (e) {} }); layer.gains = []; } }, fadeDuration * 1e3 + 50); } }); if (this.masterGain) try { this.masterGain.gain.setValueAtTime(this.masterGain.gain.value, now); this.masterGain.gain.linearRampToValueAtTime(0, now + fadeDuration); } catch (e) {} } setMasterVolume(volume) { if (this.masterGain) { const oldVolume = this.masterGain.gain.value; this.masterGain.gain.value = volume; if (this.debug) console.log("[MusicEngine] Master volume changed", { from: oldVolume, to: volume }); } } } class Zengine { constructor() { this.audioContext = null; this.sounds = []; this.activeSounds = new Map; this.masterGainNode = null; this.isRunning = false; this.currentEnvironment = null; this.eventLoopInterval = null; this.activityLevel = 4; this.musicEngine = null; this.debug = false; } async init() { this.musicEngine = new MusicEngine; this.musicEngine.init(); this.musicEngine.debug = this.debug; const response = await fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/bbc-sounds.json"); const rawSounds = await response.json(); this.sounds = this.categorizeSounds(rawSounds); if (this.debug) console.log("[Zengine] Initialized", { soundCount: this.sounds.length, categories: [ ...new Set(this.sounds.map(s => s.category)) ] }); return this.sounds.length; } categorizeSounds(rawSounds) { return rawSounds.map(sound => { var _sound$technicalMetad; const tags = (sound.tags || []).map(t => t.toLowerCase()); const description = (sound.description || "").toLowerCase(); const duration = parseFloat(((_sound$technicalMetad = sound.technicalMetadata) === null || _sound$technicalMetad === void 0 ? void 0 : _sound$technicalMetad.duration) || sound.duration) || 0; const category = this.detectCategory(tags, description); const role = duration > 60 ? "ambient" : duration > 15 ? "feature" : "event"; return { id: sound.id, duration, description: sound.description, category, role }; }); } detectCategory(tags, description) { const text = [ ...tags, description ].join(" "); if (/rain|drizzle/i.test(text)) return "rain"; if (/ocean|sea|wave/i.test(text)) return "ocean"; if (/stream|river|water/i.test(text)) return "water-flow"; if (/wind|breeze/i.test(text)) return "wind"; if (/bird/i.test(text)) return "bird"; if (/cricket|insect/i.test(text)) return "insect"; return "other"; } generateEnvironment() { const environments = [ { name: "Gentle Rain", requiredAmbient: [ "rain" ], commonCategories: [ "bird" ], weather: "rain" }, { name: "Ocean Shore", requiredAmbient: [ "ocean" ], commonCategories: [ "bird", "wind" ], weather: "clear" }, { name: "Forest Stream", requiredAmbient: [ "water-flow" ], commonCategories: [ "bird", "insect" ], weather: "clear" } ]; const env = environments[Math.floor(Math.random() * environments.length)]; if (this.debug) console.log("[Zengine] Environment generated", { name: env.name, weather: env.weather, ambientRequirements: env.requiredAmbient, commonSounds: env.commonCategories }); return env; } getEnvironmentSounds(environment) { const allAmbient = this.sounds.filter(s => s.role === "ambient" && environment.requiredAmbient.includes(s.category)); const allEvents = this.sounds.filter(s => s.role === "event" && environment.commonCategories.includes(s.category)); return { ambient: allAmbient, events: allEvents }; } async start() { if (this.isRunning) return; if (this.sounds.length === 0) await this.init(); if (!this.musicEngine.isPlaying) await this.musicEngine.start(); if (!this.audioContext) { this.audioContext = new (window.AudioContext || window.webkitAudioContext); this.masterGainNode = this.audioContext.createGain(); this.masterGainNode.connect(this.audioContext.destination); this.masterGainNode.gain.value = .3; } if (this.audioContext.state === "suspended") await this.audioContext.resume(); this.isRunning = true; this.currentEnvironment = this.generateEnvironment(); if (this.debug) console.log("[Zengine] Engine started", { environment: this.currentEnvironment.name, audioContextState: this.audioContext.state }); await this.startAmbientLayers(); this.startEventLoop(); } async startAmbientLayers() { const envSounds = this.getEnvironmentSounds(this.currentEnvironment); const numAmbient = Math.min(envSounds.ambient.length, 2); for (let i = 0; i < numAmbient; i++) { const sound = envSounds.ambient[Math.floor(Math.random() * envSounds.ambient.length)]; if (!this.activeSounds.has(sound.id)) await this.playSound(sound, "ambient", .35 + Math.random() * .1); } } startEventLoop() { this.eventLoopInterval = setInterval(() => this.processEvents(), 3e3); if (this.debug) console.log("[Zengine] Event loop started"); } async processEvents() { if (!this.isRunning) return; const envSounds = this.getEnvironmentSounds(this.currentEnvironment); const activeEvents = Array.from(this.activeSounds.values()).filter(s => s.role !== "ambient").length; if (activeEvents < this.activityLevel && envSounds.events.length > 0 && Math.random() < .5) { const sound = envSounds.events[Math.floor(Math.random() * envSounds.events.length)]; await this.playSound(sound, "event", .12 + Math.random() * .08); } } async playSound(sound, role, volume) { if (this.activeSounds.has(sound.id)) return; try { const url = sound.url || `https://sound-effects-media.bbcrewind.co.uk/mp3/${sound.id}.mp3`; const audio = new Audio; audio.crossOrigin = "anonymous"; audio.src = url; audio.preload = "auto"; const source = this.audioContext.createMediaElementSource(audio); const gainNode = this.audioContext.createGain(); gainNode.gain.value = volume; source.connect(gainNode); gainNode.connect(this.masterGainNode); this.activeSounds.set(sound.id, { sound, audio, source, gainNode, role, volume }); if (this.debug) { console.log("[Zengine] Sound started playing", { soundId: sound.id, description: sound.description, role, volume, category: sound.category, duration: sound.duration, activeCount: this.activeSounds.size }); } audio.addEventListener("ended", () => { this.removeSound(sound.id); if (role === "ambient" && this.isRunning) setTimeout(() => this.playSound(sound, role, volume), 1e3); }); audio.addEventListener("error", () => this.removeSound(sound.id)); await audio.play(); } catch (error) { console.error("[Zengine] Sound error:", sound.id, error); } } removeSound(soundId) { const instance = this.activeSounds.get(soundId); if (instance) { try { instance.audio.pause(); instance.gainNode.disconnect(); instance.source.disconnect(); } catch (e) {} if (this.debug) console.log("[Zengine] Sound removed", { soundId, description: instance.sound.description, activeCount: this.activeSounds.size - 1 }); this.activeSounds.delete(soundId); } } stop() { if (this.musicEngine.isPlaying) this.musicEngine.stop(); this.isRunning = false; if (this.eventLoopInterval) { clearInterval(this.eventLoopInterval); this.eventLoopInterval = null; } if (this.debug) console.log("[Zengine] Engine stopping", { activeSounds: this.activeSounds.size }); this.activeSounds.forEach((instance, id) => { try { instance.audio.pause(); instance.audio.currentTime = 0; } catch (e) {} const now = this.audioContext.currentTime; instance.gainNode.gain.cancelScheduledValues(now); instance.gainNode.gain.setValueAtTime(instance.gainNode.gain.value, now); instance.gainNode.gain.linearRampToValueAtTime(0, now + .5); setTimeout(() => this.removeSound(id), 500); }); if (this.audioContext && this.audioContext.state === "running") this.audioContext.suspend(); if (this.debug) console.log("[Zengine] Engine stopped"); } setMasterVolume(volume) { if (this.masterGainNode) { const oldVolume = this.masterGainNode.gain.value; this.masterGainNode.gain.value = volume; if (this.debug) console.log("[Zengine] Master volume changed", { from: oldVolume, to: volume, musicEngineVolume: volume * .25 }); } this.musicEngine.setMasterVolume(volume * .25); } } exports.Zengine = Zengine; /***/ }, /***/ 870(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.conditions = void 0; var _queue = __webpack_require__(372); const conditions = exports.conditions = { true: { title: "True", check: (ws, item, params) => true }, false: { title: "False", check: (ws, item, params) => false }, "account-admin": { title: "You are an admin", check: (ws, item, params) => ws.groups.sysop === true }, "item-selected": { title: "An item is selected", check: (ws, item, params) => item !== null }, "edit-selected": { title: "An edit is selected", check: (ws, item, params) => _queue.Queue.groups[item === null || item === void 0 ? void 0 : item.type] === "edit" }, "logevent-selected": { title: "A logentry is selected", check: (ws, item, params) => _queue.Queue.groups[item === null || item === void 0 ? void 0 : item.type] === "logevent" }, revertable: { title: "Current item is revertable", check: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return false; return true; } }, pending: { title: "Current item is pending review", check: (ws, item, params) => { if (!ws.queue.pending.has(item.id)) return false; return true; } }, "user-registered": { title: "Selected user is registered", check: (ws, item, params) => item.user.anon === false }, "user-ip": { title: "Selected user is an IP address", check: (ws, item, params) => item.user.ip === true }, "user-temp": { title: "Selected user is a temporary account", check: (ws, item, params) => item.user.temp === true }, "user-empty-talk": { title: "Selected user's talk page is empty", check: (ws, item, params) => item.user.talk === undefined }, "user-blocked": { title: "Selected user is blocked", check: (ws, item, params) => item.user.blocked === true }, "user-edit-count": { title: "Selected user's edit count is", parameters: (ws, item) => [ { id: "condition", title: "Condition", type: "choice", options: [ "<", "≤", "=", "≥", ">" ], default: "=" }, { id: "count", title: "Edit count", type: "number", default: 0 } ], check: (ws, item, params) => { const count = item.user.editcount === -1 ? Infinity : item.user.editcount || 0; const target = Number(params.count); switch (params.condition) { case "<": return count < target; case "≤": return count <= target; case "=": return count === target; case "≥": return count >= target; case ">": return count > target; default: return false; } } }, "user-final-warning": { title: "Selected user at final warning level", check: (ws, item, params) => item.user.warning === "4" || item.user.warning === "4im" }, "user-has-warnings": { title: "Selected user has no warnings", check: (ws, item, params) => item.user.warning !== "0" }, "edit-pending": { title: "Edit is pending", check: (ws, item, params) => ws.queue.pending.has(item === null || item === void 0 ? void 0 : item.id) }, "edit-minor": { title: "Edit is marked as minor", check: (ws, item, params) => item.minor === true }, "edit-size": { title: "Edit size is", parameters: (ws, item) => [ { id: "condition", title: "Condition", type: "choice", options: [ "<", "≤", "=", "≥", ">" ], default: "=" }, { id: "size", title: "Size", type: "number", default: 0 } ], check: (ws, item, params) => { const size = item.sizediff || 0; const target = Number(params.size); switch (params.condition) { case "<": return size < target; case "≤": return size <= target; case "=": return size === target; case "≥": return size >= target; case ">": return size > target; default: return false; } } }, "abs-edit-size": { title: "Absolute edit size is", parameters: (ws, item) => [ { id: "condition", title: "Condition", type: "choice", options: [ "<", "≤", "=", "≥", ">" ], default: "=" }, { id: "size", title: "Size", type: "number", min: 0, default: 0 } ], check: (ws, item, params) => { const size = Math.abs(item.sizediff || 0); const target = Number(params.size); switch (params.condition) { case "<": return size < target; case "≤": return size <= target; case "=": return size === target; case "≥": return size >= target; case ">": return size > target; default: return false; } } }, "edit-ores-score": { title: "Edit ORES score is", parameters: (ws, item) => [ { id: "condition", title: "Condition", type: "choice", options: [ "<", "≤", "=", "≥", ">" ], default: "=" }, { id: "score", title: "Score", type: "number", min: 0, max: 1, default: 0 } ], check: (ws, item, params) => { const score = item.ores_score || 0; const target = Number(params.score); switch (params.condition) { case "<": return score < target; case "≤": return score <= target; case "=": return score === target; case "≥": return score >= target; case ">": return score > target; default: return false; } } }, "user-highlighted": { title: "Selected user is highlighted", check: (ws, item, params) => ws.store.highlight.users.has(item.user.name) }, "user-whitelisted": { title: "Selected user is whitelisted", check: (ws, item, params) => ws.store.whitelist.users.has(item.user.name) }, "page-highlighted": { title: "Selected page is highlighted", check: (ws, item, params) => ws.store.highlight.pages.has(item.page.title) }, "page-whitelisted": { title: "Selected page is whitelisted", check: (ws, item, params) => ws.store.whitelist.pages.has(item.page.title) }, "page-watched": { title: "Selected page is watched", check: (ws, item, params) => item.page.watched === true }, "tag-highlighted": { title: "Selected edit has a highlighted tag", check: (ws, item, params) => { for (const tag of item.tags) { if (ws.store.highlight.tags.has(tag)) return true; } return false; } }, "tag-whitelisted": { title: "Selected edit has a whitelisted tag", check: (ws, item, params) => { for (const tag of item.tags) { if (ws.store.whitelist.tags.has(tag)) return true; } return false; } }, "in-recent-queue": { title: "In recent changes queue", check: (ws, item, params) => ws.queue.current.type === "recent" }, "in-pending-queue": { title: "In pending changes queue", check: (ws, item, params) => ws.queue.current.type === "pending" }, "in-user-queue": { title: "In user creations queue", check: (ws, item, params) => ws.queue.current.type === "users" }, "in-watchlist-queue": { title: "In watchlist queue", check: (ws, item, params) => ws.queue.current.type === "watchlist" } }; /***/ }, /***/ 9808(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.validateShortcut = exports.controls = exports.buildShortcut = void 0; const controls = exports.controls = new Set([ "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "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", "-", "=", "[", "]", "\\", ";", "'", ",", ".", "/", "_", "+", "{", "}", "|", ":", '"', "<", ">", "?", " ", "arrowleft", "arrowup", "arrowdown", "arrowright" ]); const buildShortcut = event => { const order = [ "ctrl", "shift", "alt" ]; const parts = []; order.forEach(mod => { if (event[`${mod}Key`]) parts.push(mod); }); const key = event.key.toLowerCase(); if (controls.has(key)) parts.push(key); return parts.join("+"); }; exports.buildShortcut = buildShortcut; const validateShortcut = shortcut => { const parts = shortcut.toLowerCase().split("+"); if (parts.length === 0) return false; const seen = new Set; for (const part of parts) { if (seen.has(part)) return false; seen.add(part); if (part !== "ctrl" && part !== "shift" && part !== "alt" && !controls.has(part)) return false; } return parts.some(part => part !== "ctrl" && part !== "shift" && part !== "alt"); }; exports.validateShortcut = validateShortcut; /***/ }, /***/ 985(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.events = void 0; var _queue = __webpack_require__(372); var _wikishield = __webpack_require__(7054); var _warnings = __webpack_require__(955); var _welcomes = __webpack_require__(863); var _scriptEsm = __webpack_require__(5643); const events = exports.events = { "next-item": { title: "Go to next item", icon: "fas fa-arrow-right", script: (ws, item, params) => { ws.queue.next(); return { valid: true }; } }, "previous-item": { title: "Go to previous item", icon: "fas fa-arrow-left", script: (ws, item, params) => { ws.queue.previous(); return { valid: true }; } }, "clear-queue": { title: "Clear queue", icon: "fas fa-trash-can", valid: (ws, item, params) => { if (ws.queue.current.type === "pending") return { valid: false, reason: "Pending edits queue cannot be cleared." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.clear(ws.queue.current.type); return { valid: true }; } }, "next-queue": { title: "Go to next queue", icon: "fas fa-forward", script: (ws, item, params) => { const queues = _queue.Queue.types.map(type => ({ name: type, ...ws.store.settings.queue[type] })); queues.sort((a, b) => a.order - b.order); const index = queues.findIndex(queue => queue.name === ws.queue.current.type); ws.queue.switch(queues[(index + 1) % queues.length].name); return { valid: true }; } }, "previous-queue": { title: "Go to previous queue", icon: "fas fa-forward", script: (ws, item, params) => { const queues = _queue.Queue.types.map(type => ({ name: type, ...ws.store.settings.queue[type] })); queues.sort((a, b) => a.order - b.order); const index = queues.findIndex(queue => queue.name === ws.queue.current.type); ws.queue.switch(queues[(index - 1 + queues.length) % queues.length].name); return { valid: true }; } }, "accept-pending-edit": { title: "Accept pending edit", icon: "fas fa-check", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Accepting pending edit", valid: (ws, item, params) => { if (!ws.rights.review) return { valid: false, reason: "You do not have permission to review pending changes." }; if (!ws.queue.pending.has(item.id)) return { valid: false, reason: "Pending edit can only be accepted when a pending edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { const pending = ws.queue.pending.get(item.id); if (!pending) return { valid: false, reason: "Pending edit not found." }; const count = `${pending.count || ""} pending revision${pending.count === 1 ? "" : "s"}`; const join = array => { switch (array.length) { case 0: case 1: { return array[0] || ""; } // removed by dead control flow case 2: { return `${array[0]} and ${array[1]}`; } // removed by dead control flow default: { return `${array.slice(0, -1).join(", ")}, and ${array[array.length - 1]}`; } // removed by dead control flow } }; const users = Object.entries(pending.users || {}).map(user => [ ws.api.user(user[0]), user[1] ]); users.sort((a, b) => b[1] - a[1]); // sort by number of edits const overflow = Math.max(users.reduce((sum, user) => { const len = user[0].length; if (sum[0] + len <= 250) return [ sum[0] + len, sum[1] + 1 ]; return sum; }, [ 0, 0 ])[1], 1); let userText = ""; const len = users.length; if (len > overflow) { const display = users.slice(0, overflow).map(user => user[0]); const remaining = len - display.length; userText = `${display.join(", ")}, and ${remaining} other${remaining === 1 ? "" : "s"}`; } else userText = join(users.map(user => user[0])); return await ws.api.acceptPendingEdit(item.pending.revid, ws.api.summary(`Accepted ${count} by ${userText}`, params.summary)); }, successful: (ws, item, params) => { ws.store.statistics.pending_changes_reviewed.accepted++; } }, "reject-pending-edit": { title: "Reject pending edit", icon: "fas fa-xmark", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Rejecting pending edit", valid: (ws, item, params) => { if (!ws.rights.review) return { valid: false, reason: "You do not have permission to review pending changes." }; if (!ws.queue.pending.has(item.id)) return { valid: false, reason: "Pending edit can only be rejected when a pending edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { const pending = ws.queue.pending.get(item.id); if (!pending) return { valid: false, reason: "Pending edit not found." }; const count = `${pending.count || ""} pending revision${pending.count === 1 ? "" : "s"}`; const join = array => { switch (array.length) { case 0: case 1: { return array[0] || ""; } // removed by dead control flow case 2: { return `${array[0]} and ${array[1]}`; } // removed by dead control flow default: { return `${array.slice(0, -1).join(", ")}, and ${array[array.length - 1]}`; } // removed by dead control flow } }; const users = Object.entries(pending.users || {}).map(user => [ ws.api.user(user[0]), user[1] ]); users.sort((a, b) => b[1] - a[1]); // sort by number of edits const overflow = Math.max(users.reduce((sum, user) => { const len = user[0].length; if (sum[0] + len <= 250) return [ sum[0] + len, sum[1] + 1 ]; return sum; }, [ 0, 0 ])[1], 1); let userText = ""; const len = users.length; if (len > overflow) { const display = users.slice(0, overflow).map(user => user[0]); const remaining = len - display.length; userText = `${display.join(", ")}, and ${remaining} other${remaining === 1 ? "" : "s"}`; } else userText = join(users.map(user => user[0])); return await ws.api.rejectPendingEdit(item.id, pending.prior, item.page.title, ws.api.summary(`Rejected ${count} by ${userText} to [[Special:Diff/${pending.prior}|last stable revision]]`, params.summary)); }, successful: (ws, item, params) => { ws.store.statistics.pending_changes_reviewed.rejected++; } }, revert: { title: "Revert and auto warn/report", icon: "fas fa-undo-alt", parameters: (ws, item) => [ { id: "warning", title: "Warning template", type: "choice", options: Object.keys(_warnings.warningsLookup), default: Object.keys(_warnings.warningsLookup)[0] } ], progress: "Reverting edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be reverted when an edit is selected." }; const warning = (0, _warnings.getWarningFromLookup)(params.warning); if (!("summary" in warning)) return { valid: false, reason: "Selected warning template does not support reverting." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags; const warning = (0, _warnings.getWarningFromLookup)(params.warning); await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Reverting yourself", `You are about to revert your own edit. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to revert their edit?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to revert the edit on it?`) === false || (_item$tags = item.tags) !== null && _item$tags !== void 0 && _item$tags.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to revert it?`) === false) return { valid: false, reason: "Revert cancelled by user." }; const rollback = await (async () => await ws.api.rollbackEdit(item.page.title, item.user.name, ws.api.summary(`Reverted edits by ${ws.api.user(item.user.name)}`, warning.summary)))(); if (!rollback.valid) return rollback; else { ws.store.statistics.reverts_made.total++; switch (item.type) { case "recent": { ws.store.statistics.reverts_made.from_recent_changes++; } break; case "pending": { ws.store.statistics.reverts_made.from_pending_changes++; } break; case "watchlist": { ws.store.statistics.reverts_made.from_watchlist++; } break; case "abuselog": { ws.store.statistics.reverts_made.from_abuse_log++; } break; default: { ws.store.statistics.reverts_made.from_loaded_edits++; } break; } } let oldLevel; const warn = await (async () => { const talk = `User talk:${item.user.name}`; const monthSection = ws.util.monthSectionName(); const content = (await ws.api.getPagesContent([ talk ]))[talk] || ""; const sections = ws.util.getPageSections(content); let section = "new"; const len = sections.length; for (let i = 0; i < len; i++) if (sections[i].title === monthSection) section = i + 1; let level; oldLevel = ws.queue.getWarningLevel(content); if (typeof warning.auto === "string") level = warning.auto; else if (typeof warning.auto === "function") level = warning.auto(item, oldLevel); else level = warning.auto[oldLevel]; const template = warning.templates.find(template => template.name === level.toString()); if (!template) return { valid: true }; // no warning to issue, still wanna check for reporting let summary = "Message about "; if (_queue.Queue.groups[item.type] === "edit") // kinda redundant but whatever summary += `[[Special:Diff/${item.id}|your edit]] on [[${item.page.title}]]`; else if (item.type === "abuselog") { if (item.revid) summary += `[[Special:Diff/${item.revid}|your edit]] on [[${item.page.title}]]`; else summary += `[[Special:AbuseLog/${item.id}|your contribution]] on [[${item.page.title}]]`; } else summary += `[[${item.page.title}]]`; let newContent = ""; if (section === "new") newContent = `{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)`; else newContent = `${sections[section - 1].heading}\n${sections[section - 1].content}\n\n{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)`; const result = await ws.api.editSection(talk, section, monthSection, newContent, ws.api.summary(summary, `${warning.name} (${template.name})`)); if (result.valid) { ws.queue.talks.set(item.user.name, true); const levels = [ "0", "1", "2", "3", "4", "4im" ]; if (levels.indexOf(level) > levels.indexOf(item.user.warning || "0")) ws.queue.warnings.set(item.user.name, level); ws.store.statistics.warnings_issued.total++; switch (level) { case "1": { ws.store.statistics.warnings_issued.level_1++; } break; case "2": { ws.store.statistics.warnings_issued.level_2++; } break; case "3": { ws.store.statistics.warnings_issued.level_3++; } break; case "4": { ws.store.statistics.warnings_issued.level_4++; } break; case "4im": { ws.store.statistics.warnings_issued.level_4im++; } break; } } return result; })(); if (!warn.valid) return warn; if (oldLevel === "4" || oldLevel === "4im") if (warning.reportable && ws.store.settings.auto_report.enabled && ws.store.settings.auto_report.for.has(params.warning)) { const report = await (async () => { if (await ws.api.areUsersBlocked([ item.user.name ])[item.user.name]) return { valid: false, reason: "User cannot be reported because they are blocked." }; return await ws.api.append(_wikishield.WikiShield.config.pages.AIV, null, (0, _scriptEsm.fullTrim)(`\n * {{vandal|${item.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)\n `), ws.api.summary(`Reporting ${ws.api.user(item.user.name)}`), page => { var _ws$util$getPageSecti; const content = (_ws$util$getPageSecti = ws.util.getPageSections(page).find(section => section.title === "User-reported")) === null || _ws$util$getPageSecti === void 0 ? void 0 : _ws$util$getPageSecti.content; return { valid: !(content !== null && content !== void 0 && content.includes(`{{vandal|${item.user.name}}`) || content !== null && content !== void 0 && content.includes(`{{IPVandal|${item.user.name}}`)), reason: "User has already been reported to AIV." }; }); })(); if (!report.valid) return { valid: true }; // invalid but everything worked so no need to throw an error else { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.AIV++; } } return { valid: true }; } }, "warn-and-report": { title: "Auto warn/report", icon: "fas fa-exclamation-triangle", parameters: (ws, item) => [ { id: "warning", title: "Warning template", type: "choice", options: Object.keys(_warnings.warningsLookup), default: Object.keys(_warnings.warningsLookup)[0] } ], progress: "Warning user", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be warned when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags2; const warning = (0, _warnings.getWarningFromLookup)(params.warning); await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Warning yourself", `You are about to warn yourself. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to warn them?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`) === false || (_item$tags2 = item.tags) !== null && _item$tags2 !== void 0 && _item$tags2.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?`) === false) return { valid: false, reason: "Warn cancelled by user." }; let oldLevel; const warn = await (async () => { const talk = `User talk:${item.user.name}`; const monthSection = ws.util.monthSectionName(); const content = (await ws.api.getPagesContent([ talk ]))[talk] || ""; const sections = ws.util.getPageSections(content); let section = "new"; const len = sections.length; for (let i = 0; i < len; i++) if (sections[i].title === monthSection) section = i + 1; let level; oldLevel = ws.queue.getWarningLevel(content); if (typeof warning.auto === "string") level = warning.auto; else if (typeof warning.auto === "function") level = warning.auto(item, oldLevel); else level = warning.auto[oldLevel]; const template = warning.templates.find(template => template.name === level.toString()); if (!template) return { valid: true }; // no warning to issue, still wanna check for reporting let summary = "Message about "; if (_queue.Queue.groups[item.type] === "edit") // kinda redundant but whatever summary += `[[Special:Diff/${item.id}|your edit]] on [[${item.page.title}]]`; else if (item.type === "abuselog") { if (item.revid) summary += `[[Special:Diff/${item.revid}|your edit]] on [[${item.page.title}]]`; else summary += `[[Special:AbuseLog/${item.id}|your contribution]] on [[${item.page.title}]]`; } else summary += `[[${item.page.title}]]`; let newContent = ""; if (section === "new") newContent = `{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)`; else newContent = `${sections[section - 1].heading}\n${sections[section - 1].content}\n\n{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)`; const result = await ws.api.editSection(talk, section, monthSection, newContent, ws.api.summary(summary, `${warning.name} (${template.name})`)); if (result.valid) { ws.queue.talks.set(item.user.name, true); const levels = [ "0", "1", "2", "3", "4", "4im" ]; if (levels.indexOf(level) > levels.indexOf(item.user.warning || "0")) ws.queue.warnings.set(item.user.name, level); ws.store.statistics.warnings_issued.total++; switch (level) { case "1": { ws.store.statistics.warnings_issued.level_1++; } break; case "2": { ws.store.statistics.warnings_issued.level_2++; } break; case "3": { ws.store.statistics.warnings_issued.level_3++; } break; case "4": { ws.store.statistics.warnings_issued.level_4++; } break; case "4im": { ws.store.statistics.warnings_issued.level_4im++; } break; } } return result; })(); if (!warn.valid) return warn; if (oldLevel === "4" || oldLevel === "4im") if (warning.reportable && ws.store.settings.auto_report.enabled && ws.store.settings.auto_report.for.has(params.warning)) { const report = await (async () => { if (await ws.api.areUsersBlocked([ item.user.name ])[item.user.name]) return { valid: false, reason: "User cannot be reported because they are blocked." }; return await ws.api.append(_wikishield.WikiShield.config.pages.AIV, null, (0, _scriptEsm.fullTrim)(`\n * {{vandal|${item.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)\n `), ws.api.summary(`Reporting ${ws.api.user(item.user.name)}`), page => { var _ws$util$getPageSecti2; const content = (_ws$util$getPageSecti2 = ws.util.getPageSections(page).find(section => section.title === "User-reported")) === null || _ws$util$getPageSecti2 === void 0 ? void 0 : _ws$util$getPageSecti2.content; return { valid: !(content !== null && content !== void 0 && content.includes(`{{vandal|${item.user.name}}`) || content !== null && content !== void 0 && content.includes(`{{IPVandal|${item.user.name}}`)), reason: "User has already been reported to AIV." }; }); })(); if (!report.valid) return { valid: true }; // invalid but everything worked so no need to throw an error else { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.AIV++; } } return { valid: true }; } }, "warn-user": { title: "Warn user", icon: "fas fa-exclamation-triangle", parameters: (ws, item) => [ { id: "warning", title: "Warning template", type: "choice", options: Object.keys(_warnings.warningsLookup), default: Object.keys(_warnings.warningsLookup)[0] }, { dependencies: [ "warning" ], id: "level", title: "Warning level", type: "choice", options: dependencies => [ "auto", ..._warnings.warningsLookup[dependencies.warning].templates.filter(template => template.generic === undefined).map(template => template.name) ], default: "auto" } ], continuity: true, progress: "Issuing warning to user", valid: (ws, item, params) => { var _getWarningFromLookup; if (!item) return { valid: false, reason: "User can only be warned when an item is selected." }; else if (params.level !== "auto" && ((_getWarningFromLookup = (0, _warnings.getWarningFromLookup)(params.warning)) === null || _getWarningFromLookup === void 0 ? void 0 : _getWarningFromLookup.templates[params.level]) === null) return { valid: false, reason: "Selected warning template does not support automatic level selection." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags3; await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Warning yourself", `You are about to warn yourself. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to warn them?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`) === false || (_item$tags3 = item.tags) !== null && _item$tags3 !== void 0 && _item$tags3.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?`) === false) return { valid: false, reason: "Warning cancelled by user." }; const warning = (0, _warnings.getWarningFromLookup)(params.warning); const talk = `User talk:${item.user.name}`; const monthSection = ws.util.monthSectionName(); const content = (await ws.api.getPagesContent([ talk ]))[talk] || ""; const sections = ws.util.getPageSections(content); let section = "new"; const len = sections.length; for (let i = 0; i < len; i++) if (sections[i].title === monthSection) section = i + 1; let level; if (params.level === "auto") { if (typeof warning.auto === "string") level = warning.auto; else if (typeof warning.auto === "function") level = warning.auto(item, ws.queue.getWarningLevel(content)); else level = warning.auto[ws.queue.getWarningLevel(content)]; } else level = params.level; const template = warning.templates.find(template => template.name === level.toString()); if (!template) { if (params.level !== "auto") return { valid: false, reason: "Selected warning template does not support the specified level." }; return { valid: true }; // no warning to issue, still wanna check for reporting } let summary = "Message about "; if (_queue.Queue.groups[item.type] === "edit") summary += `[[Special:Diff/${item.id}|your edit]] on [[${item.page.title}]]`; else if (item.type === "abuselog") { if (item.revid) summary += `[[Special:Diff/${item.revid}|your edit]] on [[${item.page.title}]]`; else summary += `[[Special:AbuseLog/${item.id}|your contribution]] on [[${item.page.title}]]`; } else summary += `[[${item.page.title}]]`; let newContent = ""; if (section === "new") newContent = `{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)`; else newContent = `${sections[section - 1].heading}\n${sections[section - 1].content}\n\n{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)`; const result = await ws.api.editSection(talk, section, monthSection, newContent, ws.api.summary(summary, `${warning.name} (${template.name})`)); if (result.valid) { ws.queue.talks.set(item.user.name, true); const levels = [ "0", "1", "2", "3", "4", "4im" ]; if (levels.indexOf(level) > levels.indexOf(item.user.warning || "0")) ws.queue.warnings.set(item.user.name, level); ws.store.statistics.warnings_issued.total++; switch (level) { case "1": { ws.store.statistics.warnings_issued.level_1++; } break; case "2": { ws.store.statistics.warnings_issued.level_2++; } break; case "3": { ws.store.statistics.warnings_issued.level_3++; } break; case "4": { ws.store.statistics.warnings_issued.level_4++; } break; case "4im": { ws.store.statistics.warnings_issued.level_4im++; } break; } } return result; } }, "rollback-edit": { title: "Rollback edit", icon: "fas fa-undo-alt", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" }, { id: "hide_username", title: "Hide username", type: "choice", options: [ "Yes", "No" ], default: "No" } ], progress: "Rolling back edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be rolled back when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags4; await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Rollbacking own edit", `You are about to revert your own edit. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`) === false || (_item$tags4 = item.tags) !== null && _item$tags4 !== void 0 && _item$tags4.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to rollback it?`) === false) return { valid: false, reason: "Rollback cancelled by user." }; const user = params.hide_username === "Yes" ? "" : ` by ${ws.api.user(item.user.name)}`; return await ws.api.rollbackEdit(item.page.title, item.user.name, ws.api.summary(`Reverted edits${user}`, params.summary)); }, successful: (ws, item, params) => { ws.store.statistics.reverts_made.total++; switch (item.type) { case "recent": { ws.store.statistics.reverts_made.from_recent_changes++; } break; case "pending": { ws.store.statistics.reverts_made.from_pending_changes++; } break; case "watchlist": { ws.store.statistics.reverts_made.from_watchlist++; } break; case "abuselog": { ws.store.statistics.reverts_made.from_abuse_log++; } break; default: { ws.store.statistics.reverts_made.from_loaded_edits++; } break; } } }, "rollback-goodfaith-edit": { title: "Rollback good faith edit", icon: "fas fa-undo-alt", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" }, { id: "hide_username", title: "Hide username", type: "choice", options: [ "Yes", "No" ], default: "No" } ], progress: "Rolling back good faith edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be rolled back when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags5; await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Rollbacking own edit", `You are about to revert your own edit. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`) === false || (_item$tags5 = item.tags) !== null && _item$tags5 !== void 0 && _item$tags5.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to rollback it?`) === false) return { valid: false, reason: "Rollback cancelled by user." }; const user = params.hide_username === "Yes" ? "" : ` by ${ws.api.user(item.user.name)}`; return await ws.api.rollbackEdit(item.page.title, item.user.name, ws.api.summary(`Reverted [[Wp:AGF|Good faith]] edits${user}`, params.summary)); }, successful: (ws, item, params) => { ws.store.statistics.reverts_made.total++; ws.store.statistics.reverts_made.good_faith++; switch (item.type) { case "recent": { ws.store.statistics.reverts_made.from_recent_changes++; } break; case "pending": { ws.store.statistics.reverts_made.from_pending_changes++; } break; case "watchlist": { ws.store.statistics.reverts_made.from_watchlist++; } break; case "abuselog": { ws.store.statistics.reverts_made.from_abuse_log++; } break; default: { ws.store.statistics.reverts_made.from_loaded_edits++; } break; } } }, "undo-edit": { title: "Undo edit", icon: "fas fa-undo", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" }, { id: "hide_username", title: "Hide username", type: "choice", options: [ "Yes", "No" ], default: "No" } ], progress: "Undoing edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be undone when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags6; await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Undoing own edit", `You are about to undo your own edit. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to undo their edit?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to undo the edit on it?`) === false || (_item$tags6 = item.tags) !== null && _item$tags6 !== void 0 && _item$tags6.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to undo it?`) === false) return { valid: false, reason: "Undo cancelled by user." }; const user = params.hide_username === "Yes" ? "" : ` by ${ws.api.user(item.user.name)}`; return await ws.api.undoEdit(item.page.title, item.id, ws.api.summary(`Undid revision ${ws.api.revision(item.id)}${user}`, params.summary)); } }, "restore-edit": { title: "Restore edit", icon: "fas fa-redo", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Restoring edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be restored when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => await ws.api.restoreEdit(item.page.title, item.id, ws.api.summary(`Restored revision ${ws.api.revision(item.id)} by ${ws.api.user(item.user.name)}`, params.summary)) }, "send-message-to-user-talk": { title: "Send message to user talk page", icon: "fas fa-comment", parameters: (ws, item) => [ { id: "heading", title: "Section heading", type: "text" }, { id: "message", title: "Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC))", type: "text" } ], progress: "Sending message to user talk page", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Message can only be sent when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => await ws.api.editSection(`User talk:${item.user.name}`, "new", params.heading, params.message, ws.api.summary(`Message from ${ws.api.username}: ${params.heading}`)) }, "send-message-to-page-talk": { title: "Send message to page talk page", icon: "fas fa-comment", parameters: (ws, item) => [ { id: "heading", title: "Section heading", type: "text" }, { id: "message", title: "Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC))", type: "text" } ], progress: "Sending message to page talk page", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Message can only be sent when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { const title = item.page.title.split(":"); let ns = "Talk"; if (title.length > 1) ns = title[0].toLowerCase().includes("talk") ? title[0] : `${title[0]} talk`; const page = `${ns}:${title.length === 1 ? title[0] : title.slice(1).join(":")}`; return await ws.api.editSection(page, "new", params.heading, params.message, ws.api.summary(`Message from ${ws.api.username}: ${params.heading}`)); } }, "report-user-to-aiv": { title: "Report user to AIV", icon: "fas fa-flag", parameters: (ws, item) => [ { id: "reason", title: "Reason", type: "choice", options: [ "Vandalism past final warning", "Vandalism-only account", "Vandalism after recent release of block", "Spambot or compromised account", "Long-term abuse" ], default: "Vandalism past final warning" }, { id: "summary", title: "Summary (optional)", type: "text" } ], continuity: true, progress: "Reporting user to AIV", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be reported when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { if (item.user.name === ws.api.username) return { valid: false, reason: "You cannot report yourself, silly!" }; await ws.gui.settings.waitForClose(); if (ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to report them?`) === false) return { valid: false, reason: "User report cancelled by user." }; if (await ws.api.areUsersBlocked([ item.user.name ])[item.user.name]) return { valid: false, reason: "User cannot be reported because they are blocked." }; return await ws.api.append(_wikishield.WikiShield.config.pages.AIV, null, (0, _scriptEsm.fullTrim)(`\n * {{vandal|${item.user.name}}} &ndash; ${params.reason}${params.summary ? `: ${params.summary}` : ""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)\n `), ws.api.summary(`Reporting ${ws.api.user(item.user.name)}`), page => { var _ws$util$getPageSecti3; const content = (_ws$util$getPageSecti3 = ws.util.getPageSections(page).find(section => section.title === "User-reported")) === null || _ws$util$getPageSecti3 === void 0 ? void 0 : _ws$util$getPageSecti3.content; return { valid: !(content !== null && content !== void 0 && content.includes(`{{vandal|${item.user.name}}`) || content !== null && content !== void 0 && content.includes(`{{IPVandal|${item.user.name}}`)), reason: "User has already been reported to AIV." }; }); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.AIV++; } }, "report-user-to-uaa": { title: "Report user to UAA", icon: "fas fa-user-slash", parameters: (ws, item) => [ { id: "reason", title: "Reason", type: "choice", options: [ "Disruptive username", "Offensive username", "Promotional username", "Misleading username" ], default: "Disruptive username" }, { id: "summary", title: "Summary (optional)", type: "text" } ], continuity: true, progress: "Reporting user to UAA", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be reported when an item is selected." }; else if (item.user.anon) return { valid: false, reason: "User cannot be reported because they are anonymous." }; return { valid: true }; }, script: async (ws, item, params) => { if (item.user.name === ws.api.username) return { valid: false, reason: "You cannot report yourself, silly!" }; await ws.gui.settings.waitForClose(); if (ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to report them?`) === false) return { valid: false, reason: "User report cancelled by user." }; if (await ws.api.areUsersBlocked([ item.user.name ])[item.user.name]) return { valid: false, reason: "User cannot be reported because they are blocked." }; const username = params.reason === "Offensive username" ? "offensive username" : ws.api.user(item.user.name); return await ws.api.append(_wikishield.WikiShield.config.pages.UAA, null, (0, _scriptEsm.fullTrim)(`\n * {{user-uaa|${item.user.name}}} &ndash; ${params.reason}${params.summary ? `: ${params.summary}` : ""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)\n `), ws.api.summary(`Reporting ${username}`), page => { var _ws$util$getPageSecti4; return { valid: !((_ws$util$getPageSecti4 = ws.util.getPageSections(page).find(section => section.title === "User-reported")) !== null && _ws$util$getPageSecti4 !== void 0 && _ws$util$getPageSecti4.content.includes(`{{user-uaa|${item.user.name}}`)), reason: "User has already been reported to UAA." }; }); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.UAA++; } }, "request-page-protection": { title: "Request page protection", icon: "fas fa-shield-alt", parameters: (ws, item) => [ { id: "level", title: "Protection level", type: "choice", options: [ ...ws.api.hasPendingChanges ? [ "Pending changes protection" ] : [], "Semi-protection", "Extended-confirmed protection", "Full protection", "Move protection", "Template protection" ], default: "Semi-protection" }, { id: "reason", title: "Reason", type: "choice", options: [ "Generic", "Persistent vandalism", "Disruptive editing", "Edit warring", "BLP violations", "Sockpuppetry", "Arbitration enforcement" ], default: "Generic" }, { id: "duration", title: "Duration", type: "choice", options: [ "Temporary", "Indefinite" ], default: "Temporary" }, { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Requesting page protection", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Page protection can only be requested for edits." }; return { valid: true }; }, script: async (ws, item, params) => { // what in the skibidi is this structured spaghetti code await ws.gui.settings.waitForClose(); if (ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to request protection for it?`) === false) return { valid: false, reason: "Page protection request cancelled by user." }; const reason = params.reason === "Generic" ? params.summary : `${params.reason} &ndash; ${params.summary}`; return await ws.api.append(_wikishield.WikiShield.config.pages.RFPP, null, `\n${(0, _scriptEsm.fullTrim)(`\n === [[${item.page.title}]] ===\n * {{pagelinks|${item.page.title}}}\n '''${params.duration} ${params.level.toLowerCase()}'''${reason ? `: ${reason}` : ""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)\n `)}`, ws.api.summary(`Requesting ${params.level} protection for [[${item.page.title}]]`), page => ({ valid: !ws.util.getPageSections(page).some(section => section.title === `[[${item.page.title}]]`), reason: "Page protection has already been requested for this page." })); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.RFPP++; } }, "request-global-block": { title: "Request global block", icon: "fas fa-ban", parameters: (ws, item) => [ { id: "reason", title: "Reason", type: "choice", options: [ "Generic", "Long-term abuse", "Cross-wiki abuse", "Spam / spambot", "Compromised account" ], default: "Generic" }, { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Requesting global block", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Global block can only be requested when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _Object$entries$find; if (item.user.name === ws.api.username) return { valid: false, reason: "You cannot request a global block for yourself, silly!" }; await ws.gui.settings.waitForClose(); if (ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to request a global block for them?`) === false) return { valid: false, reason: "Global block request cancelled by user." }; if (await ws.api.isUserGloballyLocked(item.user.name)) return { valid: false, reason: "User is globally locked." }; const reason = params.reason === "Generic" ? params.summary : `${params.reason}. ${params.summary}`; const page = (await ws.api.getPagesContent([ _wikishield.WikiShield.config.pages.SRG ], true, "meta.wikimedia.org"))[_wikishield.WikiShield.config.pages.SRG] || ""; const sections = ws.util.getPageSections(page); return await ws.api.append(_wikishield.WikiShield.config.pages.SRG, Number((_Object$entries$find = Object.entries(sections).find(([, section]) => section.level === 2 && section.title === "Requests for global (un)block")) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0]) + 1 || undefined, `\n${(0, _scriptEsm.fullTrim)(`\n === Global block for ${item.user.name} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{Luxotool|${item.user.name}}}\n ${reason ? `${reason} ` : ""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)\n `)}`, ws.api.summary(`Requesting global block for ${ws.api.user(item.user.name)}`), page => { let searching = false; let sections = []; for (const section of ws.util.getPageSections(page)) { if (section.level === 2) { if (section.title === "Requests for global (un)block") searching = true; else if (searching) break; } else if (searching && section.level === 3) sections.push(section); } sections = sections.filter(section => !section.content.match(/^{{Status\|not done}}/i)); return { valid: !sections.some(section => { const content = section.content; if (content.match(new RegExp(`{{Luxotool\\|(?:\\d+=)?\\s*${ws.util.escapeRegex(item.user.name)}}}`, "i"))) return true; else if (content.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${ws.util.escapeRegex(item.user.name)}(?:\\|hidename=1)?(?:\\||})`, "i"))) return true; return false; }), reason: "User has already been requested for global block." }; }, false, "meta.wikimedia.org"); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.global_block++; } }, "request-global-lock": { title: "Request global lock", icon: "fas fa-lock", parameters: (ws, item) => [ { id: "reason", title: "Reason", type: "choice", options: [ "Generic", "Long-term abuse", "Cross-wiki abuse", "Abusive-username", "Spam / spambot", "Compromised account" ], default: "Generic" }, { id: "summary", title: "Summary (optional)", type: "text" }, { id: "hide_username", title: "Hide username", type: "choice", options: [ "Yes", "No" ], default: "No" } ], progress: "Requesting global lock", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Global lock can only be requested when an item is selected." }; else if (item.user.anon) return { valid: false, reason: "Global lock cannot be requested for anonymous users." }; return { valid: true }; }, script: async (ws, item, params) => { var _Object$entries$find2; if (item.user.name === ws.api.username) return { valid: false, reason: "You cannot request a global lock for yourself, silly!" }; await ws.gui.settings.waitForClose(); if (ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to request a global lock for them?`) === false) return { valid: false, reason: "Global lock request cancelled by user." }; if (await ws.api.isUserGloballyLocked(item.user.name)) return { valid: false, reason: "User is already globally locked." }; const reason = params.reason === "Generic" ? params.summary : `${params.reason}. ${params.summary}`; const user = params.hide_username === "Yes" ? "" : ` for ${ws.api.centralAuthUser(item.user.name)}`; const page = (await ws.api.getPagesContent([ _wikishield.WikiShield.config.pages.SRG ], true, "meta.wikimedia.org"))[_wikishield.WikiShield.config.pages.SRG] || ""; const sections = ws.util.getPageSections(page); return await ws.api.append(_wikishield.WikiShield.config.pages.SRG, Number((_Object$entries$find2 = Object.entries(sections).find(([, section]) => section.level === 2 && section.title === "Requests for global (un)lock and (un)hiding")) === null || _Object$entries$find2 === void 0 ? void 0 : _Object$entries$find2[0]) + 1 || undefined, `\n${(0, _scriptEsm.fullTrim)(`\n === Global lock${user} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{LockHide|${item.user.name}${params.hide_username === "Yes" ? "|hidename=1" : ""}}}\n ${reason ? `${reason} ` : ""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)\n `)}`, ws.api.summary(`Requesting global lock${user}`), page => { let searching = false; let sections = []; for (const section of ws.util.getPageSections(page)) { if (section.level === 2) { if (section.title === "Requests for global (un)lock and (un)hiding") searching = true; else if (searching) break; } else if (searching && section.level === 3) sections.push(section); } sections = sections.filter(section => !section.content.match(/^{{Status\|not done}}/i)); return { valid: !sections.some(section => { const content = section.content; if (content.match(new RegExp(`{{LockHide\\|(?:\\d+=)?\\s*${ws.util.escapeRegex(item.user.name)}(\\|hidename=1)?}}`, "i"))) return true; else if (content.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${ws.util.escapeRegex(item.user.name)}(?:\\|hidename=1)?(?:\\||})`, "i"))) return true; return false; }), reason: "User has already been requested for global lock." }; }, false, "meta.wikimedia.org"); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.global_lock++; } }, "thank-user": { title: "Thank user", icon: "fas fa-handshake", progress: "Thanking user", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "User can only be thanked when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { const summary = ws.api.summary(`Thank you for [[Special:Diff/${item.id}|your edit]] on [[${item.page.title}]]`); const page = `User talk:${item.user.name}`; if (item.user.temp) { const result = await ws.api.thankRevision(item.id); if (result.valid || ws.store.settings.talk_page_thanks_for_temporary_users.enabled) { if ((await ws.api.pagesExist(page))[page] === undefined) // if talk page doesn't exist, we can use the welcome, thanks template =) await ws.api.editSection(page, "new", "Thank you!", "{{subst:Thanks-autosign}}", summary); } return result; // if the talk page thank failed, at least the revision thank went through } else if (item.user.ip) return await ws.api.editSection(page, "new", "Thank you!", "{{subst:Thanks-autosign}}", summary); else return await ws.api.thankRevision(item.id); }, successful: (ws, item, params) => { ws.store.statistics.edits_reviewed.thanked++; } }, "welcome-user": { title: "Welcome user", icon: "fas fa-paper-plane", parameters: (ws, item) => [ { id: "template", title: "Template", type: "choice", options: Object.keys(_welcomes.welcomes), default: Object.keys(_welcomes.welcomes)[0] } ], progress: "Welcoming user", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be welcomed when an item is selected." }; else if (item.user.talk !== undefined) return { valid: false, reason: "User cannot be welcomed because their talk page is not empty." }; return { valid: true }; }, script: async (ws, item, params) => await (async () => { const page = `User talk:${item.user.name}`; if ((await ws.api.pagesExist([ page ]))[page] !== undefined) return { valid: false, reason: "User cannot be welcomed because their talk page is not empty." }; let template = _welcomes.welcomes[params.template]; if (!template) return { valid: false, reason: "Selected welcome template does not exist." }; const DONT_CRASH_ANY_COMPUTERS_PLEASE = new Set([ template ]); while (typeof ((_template = template) === null || _template === void 0 ? void 0 : _template.template) === "function") { var _template, _ws$gui$dialog$toast; template = _welcomes.welcomes[template.template(ws, item)]; if (DONT_CRASH_ANY_COMPUTERS_PLEASE.has(template)) return (_ws$gui$dialog$toast = void ws.gui.dialog.toast("REPORT TO DEVELOPER", "Uh oh! Something has gone <i>cat</i>astrophically wrong. Please report this to a developer, and include the error code below:<br><br><code>WELCOME_TEMPLATE_LOOP</code>", "dev", -1)) !== null && _ws$gui$dialog$toast !== void 0 ? _ws$gui$dialog$toast : { valid: false }; if (!template) return { valid: false, reason: "Selected welcome template does not exist." }; DONT_CRASH_ANY_COMPUTERS_PLEASE.add(template); } const content = `{{subst:${template.template}}}${template.sign ? ` [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:05, 25 May 2026 (UTC)` : ""}`; return await ws.api.append(page, null, content, ws.api.summary(`Welcome to Wikipedia!`)); })(), successful: (ws, item, params) => { ws.store.statistics.users_welcomed.total++; ws.queue.talks.set(item.user.name, true); ws.gui.renderQueue(); } }, "watch-page": { title: "Watch page", icon: "fas fa-eye", progress: "Watching page", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be watched when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => await ws.api.watchPage(item.page.title, ws.util.utcString(ws.util.expiryToDate(ws.store.settings.expiry.watchlist))), successful: (ws, item, params) => { ws.store.statistics.watchlist.watched++; ws.queue.watchlist.set(item.page.title, true); } }, "unwatch-page": { title: "Unwatch page", icon: "fas fa-eye-slash", progress: "Unwatching page", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be unwatched when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => await ws.api.unwatchPage(item.page.title), successful: (ws, item, params) => { ws.store.statistics.watchlist.unwatched++; ws.queue.watchlist.set(item.page.title, false); } }, "whitelist-user": { title: "Add user to whitelist", icon: "fas fa-user-check", progress: "Adding user to whitelist", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be added to whitelist when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.whitelist.users.set(item.user.name, [ Date.now(), ws.util.expiryToDate(ws.store.settings.expiry.whitelist.users).valueOf() ]); ws.store.statistics.items_whitelisted.total++; ws.store.statistics.items_whitelisted.users++; ws.gui.renderQueue(); return { valid: true }; } }, "unwhitelist-user": { title: "Remove user from whitelist", icon: "fas fa-user-minus", progress: "Removing user from whitelist", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be removed from whitelist when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.whitelist.users.delete(item.user.name); ws.gui.renderQueue(); return { valid: true }; } }, "whitelist-page": { title: "Add page to whitelist", icon: "fas fa-check", progress: "Adding page to whitelist", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be added to whitelist when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.whitelist.pages.set(item.page.title, [ Date.now(), ws.util.expiryToDate(ws.store.settings.expiry.whitelist.pages).valueOf() ]); ws.store.statistics.items_whitelisted.total++; ws.store.statistics.items_whitelisted.pages++; ws.gui.renderQueue(); return { valid: true }; } }, "unwhitelist-page": { title: "Remove page from whitelist", icon: "fas fa-minus", progress: "Removing page from whitelist", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be removed from whitelist when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.whitelist.pages.delete(item.page.title); ws.gui.renderQueue(); return { valid: true }; } }, "highlight-user": { title: "Add user to highlighted users", icon: "fas fa-star", progress: "Adding user to highlighted users", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be added to highlighted users when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.highlight.users.set(item.user.name, [ Date.now(), ws.util.expiryToDate(ws.store.settings.expiry.highlight.users).valueOf() ]); ws.store.statistics.items_highlighted.total++; ws.store.statistics.items_highlighted.users++; ws.gui.renderQueue(); return { valid: true }; } }, "unhighlight-user": { title: "Remove user from highlighted users", icon: "fas fa-user-minus", progress: "Removing user from highlighted users", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be removed from highlighted users when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.highlight.users.delete(item.user.name); ws.gui.renderQueue(); return { valid: true }; } }, "highlight-page": { title: "Add page to highlighted pages", icon: "fas fa-star", progress: "Adding page to highlighted pages", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be added to highlighted pages when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.highlight.pages.set(item.page.title, [ Date.now(), ws.util.expiryToDate(ws.store.settings.expiry.highlight.pages).valueOf() ]); ws.store.statistics.items_highlighted.total++; ws.store.statistics.items_highlighted.pages++; ws.gui.renderQueue(); return { valid: true }; } }, "unhighlight-page": { title: "Remove page from highlighted pages", icon: "fas fa-minus", progress: "Removing page from highlighted pages", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be removed from highlighted pages when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.highlight.pages.delete(item.page.title); ws.gui.renderQueue(); return { valid: true }; } }, "refresh-user-contributions": { title: "Refresh user contributions", icon: "fas fa-rotate", progress: "Refreshing user contributions", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User contributions can only be refreshed when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { try { var _user$contributions; document.querySelector("#refresh-page-history").classList.add("refreshing"); const user = (await ws.api.parseUsers([ item.user.name ]))[0].user; ws.queue.talks.set(item.user.name, user.talk); ws.queue.contributions.set(item.user.name, user.contributions); ws.queue.blocked.set(item.user.name, user.blocked); ws.queue.blocks.set(item.user.name, user.blocks); item.user.edits = Math.max(user.edits, ((_user$contributions = user.contributions) === null || _user$contributions === void 0 ? void 0 : _user$contributions.length) || 0); item.user.warning = ws.queue.getWarningLevel(user.talk || ""); item.user.warnings = ws.queue.getWarningHistory(user.talk || ""); delete item.user.cached_contributions; ws.gui.renderQueue(); if (ws.queue.current.item === item) ws.gui.newCurrentItem(item); return { valid: true }; } catch (err) { console.error(err); return { valid: false, reason: "An error occurred while fetching user contributions." }; } } }, "refresh-page-history": { title: "Refresh page history", icon: "fas fa-rotate", progress: "Refreshing page history", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page history can only be refreshed when an item is selected." }; else if (item.type === "users") return { valid: false, reason: "Page history cannot be refreshed for user creations." }; return { valid: true }; }, script: async (ws, item, params) => { try { document.querySelector("#refresh-page-history").classList.add("refreshing"); const [history, detailsData] = await Promise.all([ ws.api.getHistory(item.page.title), ws.api.getPagesDetails(item.page.title) ]); const details = detailsData[item.page.title]; ws.queue.histories.set(item.page.title, history); item.page.metadata = details.metadata; item.page.categories = details.categories; item.page.protection = details.protection; delete item.page.cached_history; ws.gui.renderQueue(); if (ws.queue.current.item === item) ws.gui.newCurrentItem(item); return { valid: true }; } catch (err) { console.error(err); return { valid: false, reason: "An error occurred while fetching page history." }; } } }, "open-user-page": { title: "Open user page", icon: "fas fa-circle-user", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User page can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`User:${item.user.name}`)); return { valid: true }; } }, "open-user-talk": { title: "Open user talk page", icon: "fas fa-comment", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User talk page can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`User talk:${item.user.name}`)); return { valid: true }; } }, "open-user-contributions": { title: "Open user contributions", icon: "fas fa-list", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User contributions can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`Special:Contributions/${item.user.name}`)); return { valid: true }; } }, "open-user-filter-log": { title: "Open user filter log", icon: "fas fa-filter", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User filter log can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`?title=Special:AbuseLog&wpSearchUser=${encodeURIComponent(item.user.name)}`, true)); return { valid: true }; } }, "open-page": { title: "Open page", icon: "fas fa-file", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(item.page.title)); return { valid: true }; } }, "open-page-talk": { title: "Open page talk", icon: "fas fa-comments", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page talk can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { const title = item.page.title.split(":"); let ns = "Talk"; if (title.length > 1) ns = title[0].toLowerCase().includes("talk") ? title[0] : `${title[0]} talk`; const page = ws.page(`${ns}:${title.length === 1 ? title[0] : title.slice(1).join(":")}`); ws.open(page); return { valid: true }; } }, "open-page-history": { title: "Open page history", icon: "fas fa-clock-rotate-left", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page history can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`Special:PageHistory/${item.page.title}`)); return { valid: true }; } }, "open-revision": { title: "Open revision", icon: "fas fa-file-lines", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Revision can only be opened for edits." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`Special:Permalink/${item.id}`)); return { valid: true }; } }, "open-diff": { title: "Open diff", icon: "fas fa-code-compare", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Diff can only be opened for edits." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`Special:Diff/${item.id}`)); return { valid: true }; } }, "copy-link": { title: "Copy link", icon: "fas fa-link", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Link can only be copied when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { if (item.group === "edit") navigator.clipboard.writeText(ws.page(`?diff=${item.id}`, true)); else if (item.group === "logevent") navigator.clipboard.writeText(ws.page(`?title=Special:Log&logid=${item.id}`, true)); else if (item.group === "abuselog") { if (item.revid) navigator.clipboard.writeText(ws.page(`?diff=${item.revid}`, true)); else navigator.clipboard.writeText(ws.page(`?title=Special:AbuseLog/${item.id}`, true)); } else { ws.gui.dialog.toast("Cannot copy link", `Please report this issue to a developer, including the error code below:<br><br><code>UNKNOWN_ITEM_GROUP_FOR_LINK_COPY</code>`, "error", 3e3); return { valid: false }; } ws.gui.dialog.toast("Link copied", `The link has been copied to your clipboard.`, "success", 3e3); return { valid: true }; } }, "open-revert-menu": { title: "Open revert menu", icon: "fas fa-undo", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Revert menu is only available for edits." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="revert"]'); const $container = document.querySelector("#revert-menu"); $container.innerHTML = ""; ws.gui.createWarnMenu("reverts", $container, item); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "open-warn-menu": { title: "Open warn menu", icon: "fas fa-exclamation-triangle", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Warning menu is only available when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="warn"]'); const $container = document.querySelector("#warn-menu"); $container.innerHTML = ""; ws.gui.createWarnMenu("warnings", $container, item); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "open-user-menu": { title: "Open user menu", icon: "fas fa-flag", valid: (ws, item, params) => { if (!ws.queue.current.item) return { valid: false, reason: "User menu is only available when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="user"]'); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "open-page-menu": { title: "Open page menu", icon: "fas fa-flag", valid: (ws, item, params) => { if (!ws.queue.current.item) return { valid: false, reason: "Page menu is only available when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="page"]'); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "open-edit-menu": { title: "Open edit menu", icon: "fas fa-flag", valid: (ws, item, params) => { let type = ws.queue.current.item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit menu is only available for edits." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="edit"]'); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "switch-to-recent-queue": { title: "Switch to recent changes queue", icon: "fas fa-stopwatch", valid: (ws, item, params) => { if (!ws.store.settings.queue.recent.enabled) return { valid: false, reason: "Recent changes queue is not enabled." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("recent"); return { valid: true }; } }, "switch-to-pending-queue": { title: "Switch to pending changes queue", icon: "fas fa-flag", valid: (ws, item, params) => { if (!ws.store.settings.queue.pending.enabled) return { valid: false, reason: "Pending changes queue is not enabled." }; else if (!ws.rights.review) return { valid: false, reason: "You do not have permission to review pending changes." }; else if (!ws.api.hasPendingChanges) return { valid: false, reason: "The pending changes extension is not enabled on this wiki." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("pending"); return { valid: true }; } }, "switch-to-watchlist-queue": { title: "Switch to watchlist queue", icon: "fas fa-book-bookmark", valid: (ws, item, params) => { if (!ws.store.settings.queue.watchlist.enabled) return { valid: false, reason: "Watchlist queue is not enabled." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("watchlist"); return { valid: true }; } }, "switch-to-users-queue": { title: "Switch to user creation logs queue", icon: "fas fa-user-plus", valid: (ws, item, params) => { if (!ws.store.settings.queue.users.enabled) return { valid: false, reason: "User creation logs queue is not enabled." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("users"); return { valid: true }; } }, "switch-to-abuselog-queue": { title: "Switch to abuse log queue", icon: "fas fa-filter-circle-xmark", valid: (ws, item, params) => { if (!ws.store.settings.queue.abuselog.enabled) return { valid: false, reason: "Abuse log queue is not enabled." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("abuselog"); return { valid: true }; } }, "toggle-zen-mode": { title: "Toggle zen mode", icon: "fas fa-spa", script: (ws, item, params) => { var _document$querySelect; ws.store.settings.zen.enabled = !ws.store.settings.zen.enabled; (_document$querySelect = document.querySelector("#zen-mode-enable")) === null || _document$querySelect === void 0 || _document$querySelect.classList.toggle("active", ws.store.settings.zen.enabled); ws.gui.updateZenMode(); return { valid: true }; } }, "toggle-consecutive-edits": { title: "Toggle consecutive edits", icon: "fas fa-users", valid: (ws, item, params) => { const type = ws.queue.current.type; if (type !== "recent" && type !== "watchlist") return { valid: false, reason: "Consecutive edits can only be viewed in the recent changes or watchlist queues." }; return { valid: true }; }, script: (ws, item, params) => { const $consecutive = document.querySelector("#consecutive-edits-tab"); if (!$consecutive.classList.contains("hidden")) { if ($consecutive.classList.contains("selected")) document.querySelector("latest-edits-tab").click(); else $consecutive.click(); } return { valid: true }; } } }; /***/ }, /***/ 8921(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.EventManager = void 0; var _events = __webpack_require__(985); var _conditions = __webpack_require__(870); var _scripts = __webpack_require__(5564); class EventManager { constructor(ws) { this.ws = ws; this.events = _events.events; this.conditions = _conditions.conditions; } button($el, event) { const ws = this.ws; const handleClick = e => { ws.gui.selectedMenu = null; const item = ws.queue.current.item; const params = {}; for (const param of ((_ws$gui$events$events = (_ws$gui$events$events2 = ws.gui.events.events[event]).parameters) === null || _ws$gui$events$events === void 0 ? void 0 : _ws$gui$events$events.call(_ws$gui$events$events2, ws, item)) || []) { var _ws$gui$events$events, _ws$gui$events$events2; if (param.id === "external") params[param.id] = (e === null || e === void 0 ? void 0 : e.altKey) || false; } ws.execute({ actions: [ { name: event, params } ] }); }; $el.addEventListener("click", e => handleClick(e)); } submenu($el, name) { var _current$item, _event$parameters2; const event = this.events[name]; $el.dataset.eventName = name; const current = this.ws.queue.current; const id = `${current.type}:${(_current$item = current.item) === null || _current$item === void 0 ? void 0 : _current$item.id}`; const cachedParams = {}; if ($el.dataset.eventId === id) for (const param of ((_event$parameters = event.parameters) === null || _event$parameters === void 0 ? void 0 : _event$parameters.call(event, this.ws, this.ws.queue.current.item)) || []) { var _event$parameters; const $input = $el.querySelector(`[data-paramid="${param.id}"]`); cachedParams[param.id] = $input.type === "checkbox" ? $input.checked : $input.value; } else $el.dataset.eventId = id; $el.innerHTML = ""; const $description = document.createElement("div"); $description.classList.add("bottom-subcontent-title"); $description.textContent = event.title; $el.appendChild($description); const dependencyMap = new Map; const actions = {}; const parameters = (0, _scripts.sortDependencies)(((_event$parameters2 = event.parameters) === null || _event$parameters2 === void 0 ? void 0 : _event$parameters2.call(event, this.ws, this.ws.queue.current.item)) || []); for (const param of parameters) { const $param = document.createElement("div"); $param.classList.add("bottom-subcontent-input-title"); $param.textContent = param.title; $el.appendChild($param); const dependencies = {}; for (const dependent of (_param$dependencies = param.dependencies) !== null && _param$dependencies !== void 0 ? _param$dependencies : []) { var _param$dependencies; dependencies[dependent] = actions[dependent]; } const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; let callback = null; switch (param.type) { case "choice": { const $input = document.createElement("select"); $input.dataset.paramid = param.id; $el.appendChild($input); const options = typeof param.options === "function" ? param.options(dependencies) : param.options; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $input.appendChild($option); } if (cachedParams[param.id] !== undefined) { $input.value = cachedParams[param.id]; actions[param.id] = cachedParams[param.id]; } else if ("default" in param) { $input.value = _default; actions[param.id] = _default; } callback = () => { const dependencies = {}; for (const dependent of (_param$dependencies2 = param.dependencies) !== null && _param$dependencies2 !== void 0 ? _param$dependencies2 : []) { var _param$dependencies2; dependencies[dependent] = actions[dependent]; } const value = $input.value; const options = typeof param.options === "function" ? param.options(dependencies) : param.options; $input.innerHTML = ""; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $input.appendChild($option); } if (options.includes(value)) $input.value = value; else { const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; $input.value = _default; actions[param.id] = _default; } }; $input.addEventListener("change", () => { actions[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "text": { const $input = document.createElement("input"); $input.type = "text"; $input.dataset.paramid = param.id; $el.appendChild($input); if (cachedParams[param.id] !== undefined) { $input.value = cachedParams[param.id]; actions[param.id] = cachedParams[param.id]; } else if ("default" in param) { $input.value = _default; actions[param.id] = _default; } $input.addEventListener("change", () => { actions[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "boolean": { const $input = document.createElement("input"); $input.type = "checkbox"; $input.dataset.paramid = param.id; $el.appendChild($input); if (cachedParams[param.id] !== undefined) { $input.checked = cachedParams[param.id]; actions[param.id] = cachedParams[param.id]; } else if ("default" in param) { $input.checked = _default; actions[param.id] = _default; } $input.addEventListener("change", () => { actions[param.id] = $input.checked; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "duration": { const $input = document.createElement("duration-input"); $input.dataset.paramid = param.id; $el.appendChild($input); if (cachedParams[param.id] !== undefined) { $input.value = cachedParams[param.id]; actions[param.id] = cachedParams[param.id]; } else if ("default" in param) { $input.value = _default; actions[param.id] = _default; } $input.addEventListener("change", () => { actions[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; } if (typeof callback === "function") for (const dependent of (_param$dependencies3 = param.dependencies) !== null && _param$dependencies3 !== void 0 ? _param$dependencies3 : []) { var _param$dependencies3; if (!dependencyMap.has(dependent)) dependencyMap.set(dependent, []); dependencyMap.get(dependent).push(callback); } } const $button = document.createElement("button"); $button.classList.add("bottom-subcontent-button"); $button.textContent = "Submit"; $el.appendChild($button); $button.addEventListener("click", () => { const params = {}; for (const param of parameters) { const $input = $el.querySelector(`[data-paramid="${param.id}"]`); params[param.id] = $input.value; } this.ws.execute({ actions: [ { name, params } ] }); this.ws.gui.closeMenus(); }); } } exports.EventManager = EventManager; /***/ }, /***/ 372(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Queue = void 0; var _scriptEsm = __webpack_require__(2852); var _scriptEsm2 = __webpack_require__(2595); var _profanity = __webpack_require__(6400); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _uaaQueue = new WeakMap; var _Queue_brand = new WeakSet; class Queue { static areSameGroup(a, b) { return this.groups[a] === this.groups[b]; } constructor(ws) { _classPrivateMethodInitSpec(this, _Queue_brand); _classPrivateFieldInitSpec(this, _uaaQueue, Promise.resolve()); this.ws = ws; this.queues = Object.fromEntries([ "void", ...Queue.types ].map(type => [ type, { type, item: null, previous: null, queue: [], hold: [], repeats: {}, history: new _scriptEsm2.Stack(100), memory: new _scriptEsm.Memory({ size: 1e3 }), last: { timestamp: ws.util.utcString(new Date), id: 0 } } ])); this.cache = { simple: new _scriptEsm.Memory({ size: 1e3 }), full: new _scriptEsm.Memory({ size: 250 }) }; this.current = this.queues[Queue.types[0]]; this.pending = new Map; this.watchlist = new _scriptEsm.Memory({ size: 1e3 }); this.talks = new _scriptEsm.Memory({ size: 500 }); this.warnings = new _scriptEsm.Memory({ size: 1e3, timeout: 24 * 60 * 60 * 1e3 }); // 1 day this.noWelcome = new _scriptEsm.Memory({ timeout: 60 * 60 * 1e3 }); // 1 hour this.histories = new _scriptEsm.Memory({ size: 1e3 }); this.contributions = new _scriptEsm.Memory({ size: 1e3 }); this.blocks = new _scriptEsm.Memory({ size: 1e3 }); this.blocked = new _scriptEsm.Memory({ size: 1e4 }); this.playedSound = { mention: new _scriptEsm.Memory({ timeout: 60 * 1e3 }) }; this.bypass = new _scriptEsm.Memory({ timeout: 60 * 60 * 1e3, size: 1e4 }); // 1 hour this.backoff = 2e3; } switch(type) { var _document$querySelect; if (this.current.type === type) return; else if (this.current.type === "pending") this.queues.pending.queue = this.queues.pending.queue.filter(item => this.pending.has(item.id)); document.querySelector("#clear-queue").classList.toggle("hidden", type === "pending"); this.current = this.queues[type]; if (!this.current.queue.some(item => { var _this$current$item; return item.id === ((_this$current$item = this.current.item) === null || _this$current$item === void 0 ? void 0 : _this$current$item.id); })) this.current.item = this.current.queue[0] || null; this.ws.gui.renderQueue(); this.ws.gui.newCurrentItem(this.current.item); document.querySelectorAll("#queue-tabs > .queue-tab.selected").forEach($el => $el.classList.remove("selected")); (_document$querySelect = document.querySelector(`#queue-tab-${type}`)) === null || _document$querySelect === void 0 || _document$querySelect.classList.add("selected"); } async fetch() { try { const queues = this.ws.store.settings.queue; if (queues.pending.enabled && this.ws.rights.review) { const pending = (await this.ws.api.feeds(null, { ns: "*", full: true })).pending; this.pending.clear(); Object.values(pending).forEach(item => this.pending.set(item.revid, item)); await this.outdated("pending"); } const feeds = await this.ws.api.feeds(queues.recent.enabled ? { ns: this.ws.store.settings.namespaces.join("|"), since: this.queues.recent.last.timestamp } : null, queues.pending.enabled && this.ws.rights.review ? { ns: "*", full: false } : null, queues.users.enabled ? { ns: "*", since: this.queues.users.last.timestamp } : null, queues.watchlist.enabled ? { ns: "*", since: this.queues.watchlist.last.timestamp } : null, queues.abuselog.enabled ? { ns: this.ws.store.settings.namespaces.join("|"), since: this.queues.abuselog.last.timestamp } : null); const whitelist = this.ws.store.whitelist; for (const type of Queue.types) { var _feeds$type; const lastId = this.queues[type].last.id; let q = (_feeds$type = feeds[type]) !== null && _feeds$type !== void 0 ? _feeds$type : []; const maxTimestamp = q.reduce((max, item) => Math.max(max, item.timestamp), 0); if (maxTimestamp) this.queues[type].last.timestamp = this.ws.util.utcString(new Date(maxTimestamp)); switch (Queue.groups[type]) { case "edit": { const fn = item => item.revid > lastId; if (type === "recent") q = q.filter(item => fn(item) && !whitelist.pages.has(item.title)); else q = q.filter(fn); } break; case "abuselog": { q = q.filter(item => item.id > lastId); } break; case "logevent": { q = q.filter(item => item.logid > lastId); } break; } q = q.concat(this.queues[type].hold); if (q.length > 25) this.queues[type].hold = q.splice(25).reverse(); else this.queues[type].hold = []; let changed = false; switch (type) { case "recent": { const remove = new Set; for (const a of q) for (const b of this.queues[type].queue) { var _this$current$item2; if (remove.has(b)) continue; else if (b.id === ((_this$current$item2 = this.current.item) === null || _this$current$item2 === void 0 ? void 0 : _this$current$item2.id)) continue; if (a.title === b.page.title && b.id < a.revid) remove.add(b); } for (const item of remove) { const i = this.queues[type].queue.indexOf(item); if (i > -1) { this.queues[type].queue.splice(i, 1); this.ws.gui.removeQueueItem(type, item.id); } } changed = remove.size > 0; } break; case "pending": { for (const item of this.queues[type].queue) { var _this$current$item3; if (((_this$current$item3 = this.current.item) === null || _this$current$item3 === void 0 ? void 0 : _this$current$item3.id) !== item.id && !this.pending.has(item.id)) { const i = this.queues[type].queue.indexOf(item); if (i > -1) { this.queues[type].queue.splice(i, 1); this.ws.gui.removeQueueItem(type, item.id); changed = true; } } } } break; case "users": { q = q.filter(item => !item.temp); // remove temp accounts } break; case "watchlist": { const remove = new Set; for (const a of q) for (const b of this.queues[type].queue) { var _this$current$item4; if (remove.has(b)) continue; else if (b.id === ((_this$current$item4 = this.current.item) === null || _this$current$item4 === void 0 ? void 0 : _this$current$item4.id)) continue; if (a.title === b.page.title && b.id < a.revid) remove.add(b); else if (!b.page.watched) remove.add(b); } if (q.length === 0) for (const item of this.queues[type].queue) if (!item.page.watched) remove.add(item); for (const item of remove) { const i = this.queues[type].queue.indexOf(item); if (i > -1) { this.queues[type].queue.splice(i, 1); this.ws.gui.removeQueueItem(type, item.id); } } changed = remove.size > 0; } break; } if (q.length === 0) { if (changed) this.ws.gui.renderQueue(this.queues[type].queue, this.current.edit, type); continue; } switch (Queue.groups[type]) { case "edit": { this.queues[type].last.id = q.reduce((max, item) => Math.max(max, item.revid), 0); const highlight = this.ws.store.highlight; const hasHighlight = item => { var _item$tags; return highlight.users.has(item.user) || highlight.pages.has(item.title) || ((_item$tags = item.tags) === null || _item$tags === void 0 ? void 0 : _item$tags.some(tag => highlight.tags.has(tag))); }; q = q.filter(item => { var _item$tags2; return !whitelist.users.has(item.user) && !((_item$tags2 = item.tags) !== null && _item$tags2 !== void 0 && _item$tags2.some(tag => whitelist.tags.has(tag))) && (!this.bypass.has(item.user) || hasHighlight(item)); }); // parallel const oresCache = {}; let [editCounts, ores] = await Promise.allSettled([ type === "recent" ? this.ws.api.getEditCounts(q.map(item => item.user).filter(user => !this.bypass.has(user))) : Promise.resolve([]), this.ws.api.getORES(q.filter(item => { var _item$oresscores; if ((_item$oresscores = item.oresscores) !== null && _item$oresscores !== void 0 && _item$oresscores.length) return void (oresCache[item.revid] = item.oresscores); return true; }, this.ws.store.settings.queue.ores_bias).map(item => item.revid)) ]); if (editCounts.status === "rejected") console.error("Edit counts failed:", editCounts.reason); if (editCounts.status === "fulfilled") editCounts = editCounts.value; else editCounts = {}; if (ores.status === "rejected") console.error("ORES failed:", ores.reason); if (ores.status === "fulfilled") ores = ores.value; else ores = {}; for (const [revid, score] of Object.entries(await this.ws.api.extractORES(oresCache, this.ws.store.settings.queue.ores_bias))) ores[revid] = score; const repeats = this.queues[type].repeats; const filtered = []; if (type === "recent") { const minORES = this.ws.store.settings.queue.min_ores; const max = this.ws.store.settings.queue.max_edits; q.forEach(item => { var _ref, _editCounts$item$user; if (isNaN(ores[item.revid]) && (repeats[item.revid] || 0) < 3) { repeats[item.revid] = (repeats[item.revid] || 0) + 1; return this.queues[type].hold.push(item); } delete repeats[item.revid]; const edits = (_ref = (_editCounts$item$user = editCounts[item.user]) !== null && _editCounts$item$user !== void 0 ? _editCounts$item$user : this.bypass.get(item.user)) !== null && _ref !== void 0 ? _ref : 0; if (edits > max) { this.bypass.set(item.user, edits); if (hasHighlight(item)) filtered.push(item); } else if ((ores[item.revid] || 0) >= minORES || hasHighlight(item)) filtered.push(item); }); } else q.forEach(item => { if (isNaN(ores[item.revid]) && (repeats[item.revid] || 0) < 3) { repeats[item.revid] = (repeats[item.revid] || 0) + 1; return this.queues[type].hold.push(item); } delete repeats[item.revid]; filtered.push(item); }); await this.add(type, filtered); } break; case "logevent": { let max = 0; const set = new Set; const filtered = []; q.forEach(item => { if (set.has(item.logid)) return; set.add(item.logid); if (item.logid > max) max = item.logid; filtered.push(item); }); this.queues[type].last.id = max; await this.add(type, filtered); } break; case "abuselog": { const noEditCounts = q.filter(item => item.editcount === null); let editCounts = {}; if (noEditCounts.length > 0) editCounts = await this.ws.api.getEditCounts(noEditCounts.map(item => item.user)); const maxEdits = this.ws.store.settings.queue.max_edits; let max = 0; const filtered = []; q.forEach(item => { var _item$editcount; if ((((_item$editcount = item.editcount) !== null && _item$editcount !== void 0 ? _item$editcount : editCounts[item.user]) || 0) > maxEdits) return; if (item.id > max) max = item.id; filtered.push(item); }); this.queues[type].last.id = max; await this.add(type, filtered); } break; } } await this.outdated(); this.backoff = Queue.refresh; } catch (error) { console.error(error); this.backoff = Math.min(this.backoff * 2, 12e4); } setTimeout(() => this.fetch(), this.backoff); } async outdated() { { // pending const remove = []; for (const item of this.queues.pending.queue) { if (item === this.current.item) continue; if (!this.pending.has(item.id)) remove.push(item); } if (remove.length > 0) for (const item of remove) { const i = this.queues.pending.queue.indexOf(item); if (i > -1) { this.queues.pending.queue.splice(i, 1); this.ws.gui.removeQueueItem("pending", item.id); } } } const pages = new Set; const queues = [ "recent", "watchlist", "abuselog" ]; for (const type of queues) this.queues[type].queue.forEach(item => { if (type === "abuselog" && !item.revid) return; pages.add(item.page.title); }); const latests = await this.ws.api.getLatestIds([ ...pages ]); for (const type of queues) { const remove = []; for (const item of this.queues[type].queue) { let revid = item.id; if (type === "abuselog") { if (item.revid) revid = item.revid; else continue; } const latest = latests[item.page.title]; if (latest && latest > revid) remove.push([ item.id, revid ]); } if (remove.length > 0) for (const [id, revid] of remove) { var _this$queues$type$ite; const prop = type === "abuselog" ? "revid" : "id"; if (revid === ((_this$queues$type$ite = this.queues[type].item) === null || _this$queues$type$ite === void 0 ? void 0 : _this$queues$type$ite[prop])) continue; const i = this.queues[type].queue.findIndex(qItem => qItem[prop] === revid); if (i > -1) { this.queues[type].queue.splice(i, 1); this.ws.gui.removeQueueItem(type, id); } } } this.ws.gui.renderQueue(); } async add(type, items) { const prop = { edit: "revid", logevent: "logid", abuselog: "id" }[Queue.groups[type]]; items = items.filter(item => !this.queues[type].memory.has(item[prop])); items.forEach(item => this.queues[type].memory.add(item[prop])); const len = items.length; if (len === 0) return; const play = { ores: false, mention: false }; const parsed = await this.generate(type, items, false); switch (Queue.groups[type]) { case "edit": { const threshold = this.ws.store.settings.audio.ores_alert.threshold; for (let i = 0; i < len; i++) { const item = items[i]; const data = parsed[i]; this.queues[type].queue.push(data); if (type === "recent" && data.ores >= threshold) play.ores = true; if (data.mentions.has && !this.playedSound.mention.has(data.id)) { this.playedSound.mention.add(data.id); play.mention = true; } } } break; case "logevent": { for (let i = 0; i < len; i++) { const item = items[i]; const data = parsed[i]; this.queues[type].queue.push(data); if (data.mentions.has && !this.playedSound.mention.has(data.id)) { this.playedSound.mention.add(data.id); play.mention = true; } } } break; case "abuselog": { for (let i = 0; i < len; i++) { const item = items[i]; const data = parsed[i]; this.queues[type].queue.push(data); if (data.mentions.has && !this.playedSound.mention.has(data.id)) { this.playedSound.mention.add(data.id); play.mention = true; } } } break; } this.sort(type); if (play.ores && this.ws.store.settings.audio.ores_alert.enabled) this.ws.audio.playSound([ "queue", "ores" ]); if (play.mention && this.ws.store.settings.username_highlighting.enabled) this.ws.audio.playSound([ "queue", "mention" ]); this.ws.gui.renderQueue(this.queues[type].queue, this.queues[type].item, type); } sort(type) { var _this$queues$type$ite2; let i = -1; if (this.queues[type].item) i = this.queues[type].queue.findIndex(item => item === this.queues[type].item); let sorted = this.queues[type].queue; if (i >= 0) sorted = sorted.slice(0, i).concat(sorted.slice(i + 1)); const highlight = this.ws.store.highlight; const mentions = this.ws.store.settings.username_highlighting.enabled; switch (Queue.groups[type]) { case "edit": { sorted = sorted.sort((a, b) => { if (a.history && b.history) return a.history - b.history; else if (a.history) return -1; else if (b.history) return 1; let aScore = a.ores; if (mentions && a.mentions.has) aScore += 200; if (highlight.users.has(a.user.name)) aScore += 100; if (highlight.pages.has(a.page.title)) aScore += 75; aScore += a.tags.filter(tag => highlight.tags.has(tag)).length * 50; let bScore = b.ores; if (mentions && b.mentions.has) bScore += 200; if (highlight.users.has(b.user.name)) bScore += 100; if (highlight.pages.has(b.page.title)) bScore += 75; bScore += b.tags.filter(tag => highlight.tags.has(tag)).length * 50; if (aScore === bScore) return b.id - a.id; return bScore - aScore; }); } break; case "logevent": { sorted = sorted.sort((a, b) => { if (a.history && b.history) return a.history - b.history; else if (a.history) return 1; else if (b.history) return -1; let aScore = (a.user.profanity.clamped || 0) * 100; if (mentions && a.mentions.has) aScore += 200; let bScore = (b.user.profanity.clamped || 0) * 100; if (mentions && b.mentions.has) bScore += 200; if (aScore === bScore) return b.id - a.id; return bScore - aScore; }); } break; case "abuselog": { sorted = sorted.sort((a, b) => { if (a.history && b.history) return a.history - b.history; else if (a.history) return 1; else if (b.history) return -1; let aScore = 0; if (highlight.users.has(a.user.name)) aScore += 100; if (highlight.pages.has(a.page.title)) aScore += 75; if (mentions && a.mentions.has) aScore += 200; let bScore = 0; if (highlight.users.has(b.user.name)) bScore += 100; if (highlight.pages.has(b.page.title)) bScore += 75; if (mentions && b.mentions.has) bScore += 200; if (aScore === bScore) return b.id - a.id; return bScore - aScore; }); } break; } // it's doubling up somewhere and idk why but this should fix it const existing = new Set((_this$queues$type$ite2 = this.queues[type].item) !== null && _this$queues$type$ite2 !== void 0 && _this$queues$type$ite2.id ? [ this.queues[type].item.id ] : []); sorted = sorted.filter(item => { if (existing.has(item.id)) return false; existing.add(item.id); return true; }); if (i >= 0) sorted.splice(i, 0, this.queues[type].item); this.queues[type].queue = [ ...sorted.slice(0, this.ws.store.settings.queue.max_size) ]; if (!this.queues[type].item) this.queues[type].item = this.queues[type].queue[0]; } async generate(type, items, simple, options = {}) { var _options$bypass; if (items.length === 0) return []; const bypass = (_options$bypass = options === null || options === void 0 ? void 0 : options.bypass) !== null && _options$bypass !== void 0 ? _options$bypass : false; const ws = this.ws; const username = ws.api.username; const result = []; switch (Queue.groups[type]) { case "edit": { items = items.filter(item => { const cached = (revid => { if (simple) { if (this.cache.simple.has(revid)) return this.cache.simple.get(revid); else if (this.cache.full.has(revid)) return this.cache.full.get(revid); } else if (this.cache.full.has(revid)) return this.cache.full.get(revid); return null; })(item.revid); if (cached) { var _result$push; if (item.pending && !cached.pending) cached.pending = item.pending; return (_result$push = void result.push(cached)) !== null && _result$push !== void 0 ? _result$push : false; } return true; }); items = items.map(item => { var _this$pending$get; let prior = null; if (item.pending) prior = (_this$pending$get = this.pending.get(item.revid)) === null || _this$pending$get === void 0 ? void 0 : _this$pending$get.prior; prior !== null && prior !== void 0 ? prior : prior = item.old_revid || item.parentid; return { item, prior }; }); const parsed = await ws.api.parseEdits(items, simple, this.ws.store.settings.queue.ores_bias, bypass); for (const temp of parsed) { var _data$user$contributi; const {item, prior, data} = temp; const mentions = { comment: false, diff: false }; if (username) if (data.edit.diff) { const $temp = document.createElement("div"); $temp.innerHTML = data.edit.diff; if ($temp.textContent) mentions.diff = ws.util.match(username, $temp.textContent); } this.watchlist.set(item.title, data.page.watched); this.histories.set(item.title, data.page.history); this.contributions.set(item.user, data.user.contributions); this.blocks.set(item.user, data.user.blocks); this.blocked.set(item.user, data.user.blocked); const levels = [ "0", "1", "2", "3", "4", "4im" ]; const warning = this.getWarningLevel(data.user.talk || ""); if (levels.indexOf(warning) > levels.indexOf(this.warnings.get(item.user) || "0")) this.warnings.set(item.user, warning); const object = { page: { namespace: item.ns, title: item.title, get history() { var _ws$queue$histories$g; return (_ws$queue$histories$g = ws.queue.histories.get(item.title)) !== null && _ws$queue$histories$g !== void 0 ? _ws$queue$histories$g : data.page.history; }, get watched() { var _ws$queue$watchlist$g; return (_ws$queue$watchlist$g = ws.queue.watchlist.get(item.title)) !== null && _ws$queue$watchlist$g !== void 0 ? _ws$queue$watchlist$g : data.page.watched; }, metadata: data.page.metadata, categories: data.page.categories, protection: data.page.protection }, user: { name: item.user, ip: ws.util.isIPAddress(item.user), temp: ws.util.isTempAccount(item.user), anon: ws.util.isIPAddress(item.user) || ws.util.isTempAccount(item.user), edits: Math.max(data.user.edits, ((_data$user$contributi = data.user.contributions) === null || _data$user$contributi === void 0 ? void 0 : _data$user$contributi.length) || 0), get contributions() { var _ws$queue$contributio; return (_ws$queue$contributio = ws.queue.contributions.get(item.user)) !== null && _ws$queue$contributio !== void 0 ? _ws$queue$contributio : data.user.contributions; }, warning: this.getWarningLevel(data.user.talk || ""), warnings: this.getWarningHistory(data.user.talk || ""), get blocked() { var _ws$queue$blocked$get; return (_ws$queue$blocked$get = ws.queue.blocked.get(item.user)) !== null && _ws$queue$blocked$get !== void 0 ? _ws$queue$blocked$get : data.user.blocked; }, get blocks() { var _ws$queue$blocks$get; return (_ws$queue$blocks$get = ws.queue.blocks.get(item.user)) !== null && _ws$queue$blocks$get !== void 0 ? _ws$queue$blocks$get : data.user.blocks; }, get talk() { var _ws$queue$talks$get; return (_ws$queue$talks$get = ws.queue.talks.get(item.user)) !== null && _ws$queue$talks$get !== void 0 ? _ws$queue$talks$get : data.user.talk; } }, mentions, AI: { // will be populated asynchronously edit: null, username: null }, id: item.revid, prior, timestamp: item.timestamp, comment: item.parsedcomment, minor: item.minor || false, diff: data.edit.diff, sizediff: ("sizediff" in item ? item.sizediff : item.newlen - item.oldlen) || 0, ores: data.edit.ores, tags: item.tags || [], reverts: data.page.reverts, consecutive: data.page.consecutive, propagating: false, reviewed: false, history: false, pending: item.pending || false, group: Queue.groups[type], type, simple, origin: item }; if (!simple && ws.AI) { if (ws.store.settings.AI.edit_analysis.enabled) ws.AI.analyze.edit(object).then(analysis => object.AI.edit = analysis).catch(error => object.AI.edit = { error: error.message }).finally(() => { var _this$current$item5; if (object.id === ((_this$current$item5 = this.current.item) === null || _this$current$item5 === void 0 ? void 0 : _this$current$item5.id)) ws.gui.updateAIAnalysisDisplay(object.AI.edit); }); if (!object.user.anon && !ws.store.whitelist.users.has(object.user.name) && ws.store.settings.AI.username_analysis.enabled) ws.AI.analyze.username(object).then(analysis => { object.AI.username = analysis; if (analysis.flag) this.promptUAA(object, analysis); }).catch(error => object.AI.username = { error: error.message }); } result.push(object); if (simple) this.cache.simple.set(item.revid, object); else { this.cache.full.set(item.revid, object); if (this.cache.simple.has(item.revid)) this.cache.simple.delete(item.revid); } } } break; case "logevent": { const parsed = await ws.api.parseUsers(items.map(item => item.title.replace(/^(User|User talk):/, "")), simple, bypass); const performers = await ws.api.parseUsers(items.map(item => item.user), simple, bypass); for (let i = 0; i < items.length; i++) { var _data$user$contributi2, _performer$user$contr; const item = items[i]; const data = parsed[i]; const performer = performers[i]; const user = item.title.replace(/^(User|User talk):/, ""); const mentions = { username: false, comment: false }; if (username) if (user) mentions.username = ws.util.match(username, user); this.contributions.set(user, data.user.contributions); this.contributions.set(item.user, performer.user.contributions); this.blocks.set(user, data.user.blocks); this.blocks.set(item.user, performer.user.blocks); this.blocked.set(user, data.user.blocked); this.blocked.set(item.user, performer.user.blocked); const levels = [ "0", "1", "2", "3", "4", "4im" ]; const warning = this.getWarningLevel(data.user.talk || ""); if (levels.indexOf(warning) > levels.indexOf(this.warnings.get(user) || "0")) this.warnings.set(user, warning); const performerWarning = this.getWarningLevel(performer.user.talk || ""); if (levels.indexOf(performerWarning) > levels.indexOf(this.warnings.get(item.user) || "0")) this.warnings.set(item.user, performerWarning); const userProfanity = _profanity.profanity.evaluate(user); const object = { page: { namespace: item.ns, title: item.title, history: [], get watched() { return false; }, metadata: [], categories: [], protection: {} }, user: { name: user, ip: ws.util.isIPAddress(user), temp: ws.util.isTempAccount(user), anon: ws.util.isIPAddress(user) || ws.util.isTempAccount(user), edits: Math.max(data.user.edits, ((_data$user$contributi2 = data.user.contributions) === null || _data$user$contributi2 === void 0 ? void 0 : _data$user$contributi2.length) || 0), get contributions() { var _ws$queue$contributio2; return (_ws$queue$contributio2 = ws.queue.contributions.get(user)) !== null && _ws$queue$contributio2 !== void 0 ? _ws$queue$contributio2 : data.user.contributions; }, warning: this.getWarningLevel(data.user.talk || ""), warnings: this.getWarningHistory(data.user.talk || ""), get blocked() { var _ws$queue$blocked$get2; return (_ws$queue$blocked$get2 = ws.queue.blocked.get(user)) !== null && _ws$queue$blocked$get2 !== void 0 ? _ws$queue$blocked$get2 : data.user.blocked; }, get blocks() { var _ws$queue$blocks$get2; return (_ws$queue$blocks$get2 = ws.queue.blocks.get(user)) !== null && _ws$queue$blocks$get2 !== void 0 ? _ws$queue$blocks$get2 : data.user.blocks; }, get talk() { var _ws$queue$talks$get2; return (_ws$queue$talks$get2 = ws.queue.talks.get(user)) !== null && _ws$queue$talks$get2 !== void 0 ? _ws$queue$talks$get2 : data.user.talk; }, profanity: userProfanity }, performer: { name: item.user, ip: ws.util.isIPAddress(item.user), temp: ws.util.isTempAccount(item.user), anon: ws.util.isIPAddress(item.user) || ws.util.isTempAccount(item.user), edits: Math.max(performer.user.edits, ((_performer$user$contr = performer.user.contributions) === null || _performer$user$contr === void 0 ? void 0 : _performer$user$contr.length) || 0), get contributions() { var _ws$queue$contributio3; return (_ws$queue$contributio3 = ws.queue.contributions.get(item.user)) !== null && _ws$queue$contributio3 !== void 0 ? _ws$queue$contributio3 : performer.user.contributions; }, warning: this.getWarningLevel(performer.user.talk || ""), warnings: this.getWarningHistory(performer.user.talk || ""), get blocked() { var _ws$queue$blocked$get3; return (_ws$queue$blocked$get3 = ws.queue.blocked.get(item.user)) !== null && _ws$queue$blocked$get3 !== void 0 ? _ws$queue$blocked$get3 : performer.user.blocked; }, get blocks() { var _ws$queue$blocks$get3; return (_ws$queue$blocks$get3 = ws.queue.blocks.get(item.user)) !== null && _ws$queue$blocks$get3 !== void 0 ? _ws$queue$blocks$get3 : performer.user.blocks; }, get talk() { var _ws$queue$talks$get3; return (_ws$queue$talks$get3 = ws.queue.talks.get(item.user)) !== null && _ws$queue$talks$get3 !== void 0 ? _ws$queue$talks$get3 : performer.user.talk; } }, mentions, AI: { // will be populated asynchronously username: null }, id: item.logid, timestamp: item.timestamp, comment: item.parsedcomment, ores: userProfanity.clamped || 0, filters: userProfanity.matches.map(match => ({ filter: match.name, id: match.match })), propagating: false, reviewed: false, history: false, group: Queue.groups[type], type, simple, origin: item }; if (!simple && ws.AI) { if (!object.user.anon && !ws.store.whitelist.users.has(object.user.name) && ws.store.settings.AI.username_analysis.enabled) ws.AI.analyze.username(object).then(analysis => { object.AI.username = analysis; if (analysis.flag) this.promptUAA(object, analysis); }).catch(error => object.AI.username = { error: error.message }); } result.push(object); } } break; case "abuselog": { const parsed = await ws.api.parseAbuselogs(items, simple, bypass); for (const temp of parsed) { var _data$user$contributi3, _item$diff; const {item, data} = temp; const mentions = { comment: false, diff: false }; if (username) if (data.edit.diff) { const $temp = document.createElement("div"); $temp.innerHTML = data.edit.diff; if ($temp.textContent) mentions.diff = ws.util.match(username, $temp.textContent); } this.watchlist.set(item.title, data.page.watched); this.histories.set(item.title, data.page.history); this.contributions.set(item.user, data.user.contributions); this.blocks.set(item.user, data.user.blocks); this.blocked.set(item.user, data.user.blocked); const levels = [ "0", "1", "2", "3", "4", "4im" ]; const warning = this.getWarningLevel(data.user.talk || ""); if (levels.indexOf(warning) > levels.indexOf(this.warnings.get(item.user) || "0")) this.warnings.set(item.user, warning); const results = [ "disallow", "warn", "showcaptcha", "tag", "none" ]; const len = results.length; let action = len - 1; for (let i = 0; i < len; i++) if (item.result.has(results[i])) { action = i; break; } const object = { page: { namespace: item.ns, title: item.title, get history() { var _ws$queue$histories$g2; return (_ws$queue$histories$g2 = ws.queue.histories.get(item.title)) !== null && _ws$queue$histories$g2 !== void 0 ? _ws$queue$histories$g2 : data.page.history; }, get watched() { var _ws$queue$watchlist$g2; return (_ws$queue$watchlist$g2 = ws.queue.watchlist.get(item.title)) !== null && _ws$queue$watchlist$g2 !== void 0 ? _ws$queue$watchlist$g2 : data.page.watched; }, metadata: data.page.metadata, categories: data.page.categories, protection: data.page.protection }, user: { name: item.user, ip: ws.util.isIPAddress(item.user), temp: ws.util.isTempAccount(item.user), anon: ws.util.isIPAddress(item.user) || ws.util.isTempAccount(item.user), edits: Math.max(data.user.edits, ((_data$user$contributi3 = data.user.contributions) === null || _data$user$contributi3 === void 0 ? void 0 : _data$user$contributi3.length) || 0), get contributions() { var _ws$queue$contributio4; return (_ws$queue$contributio4 = ws.queue.contributions.get(item.user)) !== null && _ws$queue$contributio4 !== void 0 ? _ws$queue$contributio4 : data.user.contributions; }, warning: this.getWarningLevel(data.user.talk || ""), warnings: this.getWarningHistory(data.user.talk || ""), get blocked() { var _ws$queue$blocked$get4; return (_ws$queue$blocked$get4 = ws.queue.blocked.get(item.user)) !== null && _ws$queue$blocked$get4 !== void 0 ? _ws$queue$blocked$get4 : data.user.blocked; }, get blocks() { var _ws$queue$blocks$get4; return (_ws$queue$blocks$get4 = ws.queue.blocks.get(item.user)) !== null && _ws$queue$blocks$get4 !== void 0 ? _ws$queue$blocks$get4 : data.user.blocks; }, get talk() { var _ws$queue$talks$get4; return (_ws$queue$talks$get4 = ws.queue.talks.get(item.user)) !== null && _ws$queue$talks$get4 !== void 0 ? _ws$queue$talks$get4 : data.user.talk; } }, mentions, AI: { // will be populated asynchronously edit: null, username: null }, id: item.id, revid: item.revid, timestamp: item.timestamp, comment: data.parsedcomment, minor: false, diff: data.edit.diff, sizediff: (_item$diff = item.diff) === null || _item$diff === void 0 ? void 0 : _item$diff.size, ores: +(1 - action / (len - 1)).toFixed(2), filters: item.entries.map(entry => ({ id: (entry === null || entry === void 0 ? void 0 : entry.filter_id) || "-1", filter: entry === null || entry === void 0 ? void 0 : entry.filter })) || [], reverts: data.page.reverts, propagating: false, reviewed: false, history: false, group: Queue.groups[type], type, simple, origin: item }; if (!simple && ws.AI) { if (ws.store.settings.AI.edit_analysis.enabled && data.edit.diff) // only analyze if diff exists ws.AI.analyze.edit(object).then(analysis => object.AI.edit = analysis).catch(error => object.AI.edit = { error: error.message }).finally(() => { var _this$current$item6; if (object.id === ((_this$current$item6 = this.current.item) === null || _this$current$item6 === void 0 ? void 0 : _this$current$item6.id)) ws.gui.updateAIAnalysisDisplay(object.AI.edit); }); if (!object.user.anon && !ws.store.whitelist.users.has(object.user.name) && ws.store.settings.AI.username_analysis.enabled) ws.AI.analyze.username(object).then(analysis => { object.AI.username = analysis; if (analysis.flag) this.promptUAA(object, analysis); }).catch(error => object.AI.username = { error: error.message }); } result.push(object); } } break; } result.forEach(item => { if (item.comment) { const parser = new DOMParser; const doc = parser.parseFromString(item.comment, "text/html"); const $preview = doc.body; $preview.querySelectorAll("[href]").forEach($link => { const href = $link.getAttribute("href"); $link.setAttribute("href", new URL(href, `https://${this.ws.server}`).href); }); $preview.querySelectorAll("[src]").forEach($img => { const src = $img.getAttribute("src"); $img.setAttribute("src", new URL(src, `https://${this.ws.server}`).href); }); $preview.querySelectorAll("[srcset]").forEach($img => { const srcset = $img.getAttribute("srcset"); const newSrcset = srcset.split(",").map(part => { const [url, descriptor] = part.trim().split(/\s+/, 2); const newUrl = new URL(url, `https://${this.ws.server}`).href; return descriptor ? `${newUrl} ${descriptor}` : newUrl; }).join(", "); $img.setAttribute("srcset", newSrcset); }); item.comment = $preview.innerHTML; const textContent = ($preview.textContent || "").trim(); item.has_comment = Boolean(textContent); if (item.mentions.comment === false) item.mentions.comment = ws.util.match(username, textContent); if (item.mentions) item.mentions.has = Object.values(item.mentions).some(v => v); } else item.has_comment = false; }); return result; } previous() { const i = this.current.queue.findIndex(item => { var _this$current$item7; return item.id === ((_this$current$item7 = this.current.item) === null || _this$current$item7 === void 0 ? void 0 : _this$current$item7.id); }); if (this.current.type === "pending") { this.current.item = this.current.queue[Math.max(i - 1, 0)]; return this.ws.gui.renderQueue(); } if (i <= 0) { if (this.current.history.length === 0) return; this.current.queue.unshift(this.current.history.pop()); this.current.item = this.current.queue[0]; return this.ws.gui.renderQueue(); } this.current.item = this.current.queue[i - 1]; this.ws.gui.renderQueue(); } next() { const i = this.current.queue.findIndex(item => { var _this$current$item8; return item.id === ((_this$current$item8 = this.current.item) === null || _this$current$item8 === void 0 ? void 0 : _this$current$item8.id); }); if (i === -1) { this.current.item = this.current.queue[0]; return this.ws.gui.renderQueue(); } if (this.current.type === "pending") { this.current.item = this.current.queue[Math.min(i + 1, this.current.queue.length - 1)]; return this.ws.gui.renderQueue(); } const leaving = this.current.item; const group = Queue.groups[leaving.type]; if (!leaving.reviewed && (group === "edit" || group === "abuselog" && leaving.revid)) { if (leaving.type === "watchlist") this.ws.api.markWatchlistSeen(leaving.page.title, leaving.id); const id = leaving.type === "abuselog" ? leaving.revid : leaving.id; [ "recent", "watchlist", "abuselog" ].filter(t => t !== leaving.type).forEach(t => { if (t === "abuselog") this.queues[t].queue = this.queues[t].queue.filter(item => { if (item.revid === id) { this.queues[t].history.push({ ...item, history: performance.now() }); return false; } return true; }); else this.queues[t].queue = this.queues[t].queue.filter(item => { if (item.id === id) { this.queues[t].history.push({ ...item, history: performance.now() }); if (t === "watchlist") this.ws.api.markWatchlistSeen(item.page.title, item.id); return false; } return true; }); }); if (group !== "abuselog") { let toRemove = this.queues.abuselog.queue.filter(item => leaving.user.name === item.user.name && leaving.page.title === item.page.title && Math.abs(new Date(leaving.timestamp).getTime() - new Date(item.timestamp).getTime()) < 10 * 1e3); if (toRemove.length > 0) { Promise.allSettled(toRemove.map(async item => { let revid = item.revid; if (!revid) revid = await this.ws.api.getAbuseLogRevid(item.id); if (revid) { item.revid = revid; return { id: item.id, revid }; } return null; })).then(result => { const remove = result.map(r => r.status === "fulfilled" ? r.value : null).filter(v => v); this.queues.abuselog.queue = this.queues.abuselog.queue.filter(item => !remove.some(r => r.revid === item.revid)); if (this.current.type === "abuselog") { remove.forEach(r => this.ws.gui.removeQueueItem("abuselog", r.id)); this.ws.gui.renderQueue(this.queues.abuselog.queue, this.queues.abuselog.item, "abuselog"); } }).catch(() => {}); } } } leaving.reviewed = true; if (leaving && this.ws.AI) this.ws.AI.cancel.edit(leaving.id); this.current.queue.splice(i, 1); this.ws.gui.removeQueueItem(this.current.type, leaving.id); if (this.current.queue.length === 0) this.current.item = null; else { if (i < this.current.queue.length) this.current.item = this.current.queue[i]; else this.current.item = this.current.queue[this.current.queue.length - 1]; } if (leaving && Queue.groups[this.current.type] === "edit") this.promptWelcome(leaving); this.current.history.push({ ...leaving, history: performance.now() }); this.ws.gui.renderQueue(); } canGoPrevious() { const i = this.current.queue.findIndex(item => { var _this$current$item9; return item.id === ((_this$current$item9 = this.current.item) === null || _this$current$item9 === void 0 ? void 0 : _this$current$item9.id); }); if (i === -1) return this.current.history.length > 0; if (this.current.type === "pending") return i > 0; else if (i === 0) return this.current.history.length > 0; else return true; } canGoNext() { const i = this.current.queue.findIndex(item => { var _this$current$item0; return item.id === ((_this$current$item0 = this.current.item) === null || _this$current$item0 === void 0 ? void 0 : _this$current$item0.id); }); if (i === -1) return Boolean(this.current.queue[0]); if (this.current.type === "pending") return i < this.current.queue.length - 1; else return true; } clear(type) { if (type === "pending") return; this.queues[type].item = null; this.queues[type].queue = []; if (this.current.type === type) { this.ws.gui.newCurrentItem(null); this.ws.gui.clearQueueItems(); } } async promptWelcome(item) { if (this.ws.store.settings.auto_welcome.enabled) return; else if (!item.user.anon) return; else if ((item.user.edits || 0) === 0) // don't welcome users with 0 edits return; else if (item.user.talk === undefined) return; else if (this.noWelcome.has(item.user.name)) return; try { var _this$talks$set; const title = `User talk:${item.user.name}`; const exists = await this.ws.api.pagesExist([ title ]); if (exists[title] !== undefined) return (_this$talks$set = void this.talks.set(item.user.name, exists[title])) !== null && _this$talks$set !== void 0 ? _this$talks$set : exists[title]; await this.ws.gui.settings.waitForClose(); const confirmed = await this.ws.gui.dialog.confirm("Auto-Welcome User", `Would you like to welcome <span class="confirmation-modal-username">${this.ws.util.escape(item.user.name)}</span>?<br><br>\n\t\t\t\t\t<span style="font-size: 0.9em; color: #888;">Editing: <strong>${this.ws.util.escape(item.page.title)}</strong></span>`, { username: item.user.name, hideUAA: false }); this.noWelcome.add(item.user.name); if (confirmed) this.ws.execute({ actions: [ { name: "welcome-user", params: { template: "Auto" } } ] }, void 0, void 0, item); } catch (error) { console.error("Error during auto-welcome check:", error); } } promptUAA(item, analysis) { _classPrivateFieldSet(_uaaQueue, this, _classPrivateFieldGet(_uaaQueue, this).then(() => _assertClassBrand(_Queue_brand, this, _promptUAAInternal).call(this, item, analysis)).catch(() => {})); return _classPrivateFieldGet(_uaaQueue, this); } async propagate(item, bypass) { if (item.propagating) return await item.propagating; if (item.simple) { let resolve; item.propagating = new Promise(res => resolve = res); const [loaded] = await this.generate(item.type, [ item.origin ], false, { bypass }); loaded.history = item.history; Object.assign(item, loaded); resolve(); item.propagating = false; } else this.generate(item.type, [ item.origin ], false, { bypass }).then(([loaded]) => { const revid = item.revid; loaded.history = item.history; Object.assign(item, loaded); item.revid = revid; }); } loadFromItem(item) { const type = this.current.type; if (Queue.areSameGroup(type, "edit") && !(type === "pending" && item.type === "edit")) { this.queues[type].queue = this.queues[type].queue.filter(i => i.id !== item.id); const i = this.queues[type].queue.findIndex(i => { var _this$current$item1; return i.id === ((_this$current$item1 = this.current.item) === null || _this$current$item1 === void 0 ? void 0 : _this$current$item1.id); }); if (i > -1) this.queues[type].queue[i] = item; } this.queues[type].item = this.queues[type].queue.find(i => i.id === item.id) || item; this.ws.gui.renderQueue(); } async loadFromRevision(title, revid) { try { this.ws.gui.updateDiffDisplay("loading"); let item; if (this.cache.full.has(revid)) item = this.cache.full.get(revid); else { let object; if (this.cache.simple.has(revid)) { const simple = this.cache.simple.get(revid); object = { revid: simple.id, parentid: simple.prior, ns: simple.page.namespace, title: simple.page.title, user: simple.user.name, timestamp: simple.timestamp, parsedcomment: simple.comment, tags: simple.origin.tags, sizediff: simple.sizediff, minor: simple.minor }; } else { const rev = await this.ws.api.getRevision(title, revid, true); if (!rev) throw new Error("Revision not found"); object = { revid: rev.revid, parentid: rev.parentid, ns: rev.ns, title, user: rev.user, timestamp: rev.timestamp, parsedcomment: rev.parsedcomment, tags: rev.tags, size: rev.size, oldlen: rev.oldlen || 0, newlen: rev.size, minor: rev.minor }; } [item] = await this.generate("edit", [ object ], false, { bypass: true }); } const type = this.current.type; if (Queue.areSameGroup(type, "edit") && type !== "pending" && type !== "abuselog") { this.queues[type].queue = this.queues[type].queue.filter(i => i.id !== item.id); const i = this.queues[type].queue.findIndex(i => { var _this$current$item10; return i.id === ((_this$current$item10 = this.current.item) === null || _this$current$item10 === void 0 ? void 0 : _this$current$item10.id); }); if (i > -1) this.queues[type].queue[i] = item; } this.queues[type].item = item; this.ws.gui.renderQueue(); } catch (error) { console.error("Error loading from revision:", error); document.querySelector("#diff-container").innerHTML = `<div class="error">Failed to load revision: ${this.ws.util.escape(error.message)}</div>`; } } getWarningLevel(text) { const levels = [ "0", "1", "2", "3", "4", "4im" ]; let highestLevel = "0"; const month = this.ws.util.monthSectionName(); const sections = this.ws.util.getPageSections(text); for (const section of sections) if (section.title === month) { const templates = section.content.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/g); if (templates === null) break; const filtered = [ ...templates.map(t => { const match = t.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/); return match ? match[1].toString() : "0"; }), highestLevel ].map(level => [ level, levels.indexOf(level) ]); highestLevel = filtered.sort((a, b) => b[1] - a[1])[0][0]; } return highestLevel; } getWarningHistory(text) { const warnings = []; const month = this.ws.util.monthSectionName(); const sections = this.ws.util.getPageSections(text); for (const section of sections) if (section.title === month) { const templateMatches = section.content.matchAll(/<!-- Template:([\w-]+?)(\d(?:i?m)?) -->([^]+?)(?=<!-- Template:|$)/g); for (let match of templateMatches) { const templateName = match[1]; const level = match[2]; const content = match[3]; const timestampMatch = content.match(/(\d{2}:\d{2}.*?\d{4} \(UTC\))/); let timestamp = timestampMatch ? timestampMatch[1] : null; if (timestamp) timestamp = timestamp.replace(/<[^>]*>/g, ""); if (timestamp) { const [, time, day, monthName, year] = timestamp.match(/(\d{2}:\d{2}), (\d{1,2}) ([A-Za-z]+) (\d{4})/); const i = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ].indexOf(monthName); timestamp = new Date(Date.UTC(year, i, day, ...time.split(":"))).toUTCString(); } else timestamp = null; let username = null; const userLinkMatch = content.match(/\[\[User(?:[ _]talk)?:([^\]|]+)/i); if (userLinkMatch) username = userLinkMatch[1].trim(); const articleMatch = content.match(/\[\[([^\]]+?)\]\]/); const article = articleMatch ? articleMatch[1] : null; warnings.push({ template: templateName, level, timestamp, username, article, section: section.title }); } } return warnings; } } exports.Queue = Queue; async function _promptUAAInternal(item, analysis) { if (item.user.anon) return; else if (this.ws.store.whitelist.users.has(item.user.name)) return; else if (!analysis.issues || analysis.issues.length === 0) // if u don't have any issue, why tf would u report 😭 return; else if (!analysis.explanation) // once again, if u don't have reasoning, why report return; const violation = analysis.issues.map(issue => `${issue.severity} ${issue.policy} violation`).join(", "); const confidence = Math.round(analysis.confidence * 100); const username = item.user.name; await this.ws.gui.settings.waitForClose(); const confirmed = await this.ws.gui.dialog.confirm("Report Username to UAA", `\n\t\t\t\tThe username <span class="confirmation-modal-username">${this.ws.util.escape(username)}</span> for ${violation}.<br><br>\n\t\t\t\t<strong>AI Confidence:</strong> ${confidence}%<br>\n\t\t\t\t<strong>Reasoning:</strong> ${analysis.explanation}<br>\n\t\t\t`, username); if (confirmed) { await this.ws.gui.settings.waitForClose(); const reason = await this.ws.gui.dialog.UAA(item.user.name); if (reason) this.ws.execute({ actions: [ { name: "report-user-to-uaa", params: { reason } } ] }, void 0, void 0, item); } } _defineProperty(Queue, "refresh", 1e3); _defineProperty(Queue, "types", [ "recent", "pending", "watchlist", "abuselog", "users" ]); _defineProperty(Queue, "groups", { void: "void", recent: "edit", pending: "edit", watchlist: "edit", edit: "edit", abuselog: "abuselog", users: "logevent" }); /***/ }, /***/ 7054(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.WikiShield = void 0; var _helpers = __webpack_require__(3241); var _manager = __webpack_require__(8169); var _api = __webpack_require__(2535); var _notifications = __webpack_require__(4674); var _progressBar = __webpack_require__(6151); var _queue = __webpack_require__(372); var _gui = __webpack_require__(8469); var _class = __webpack_require__(8678); var _manager2 = __webpack_require__(9501); var _controlKeys = __webpack_require__(9808); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _events = new WeakMap; var _WikiShield_brand = new WeakSet; class WikiShield { constructor(server, username, pendingChangesServers, dev) { _classPrivateMethodInitSpec(this, _WikiShield_brand); _classPrivateFieldInitSpec(this, _events, { ready: [] }); this.__DEV__ = dev; this.started = false; this.server = server; this.storage = new _manager2.StorageManager; this.defaultStorage = new _manager2.StorageManager; this.defaultStorage.load(); this.util = new _helpers.Utility(this); this.api = new _api.API(this, server, username, pendingChangesServers); this.notifications = new _notifications.Notifications(this); this.rights = {}; this.groups = {}; this.api.account().then(async info => { this.rights = info.rights.reduce((acc, right) => ({ ...acc, [right]: true }), {}); this.groups = info.groups.reduce((acc, group) => ({ ...acc, [group]: true }), {}); { // pending changes const allowed = this.rights.review && this.api.hasPendingChanges; document.querySelector("#queue-tab-pending").classList.toggle("hidden", !allowed); if (!allowed && this.queue.current.type === "pending") this.queue.switch("recent"); } await _assertClassBrand(_WikiShield_brand, this, _import).call(this); this.cleanup(); setInterval(() => this.cleanup(), 10 * 1e3); _assertClassBrand(_WikiShield_brand, this, _emit).call(this, "ready"); }); this.gui = new _gui.GUI(this); this.queue = new _queue.Queue(this); this.audio = new _manager.AudioManager(this); this.time = { load: null, save: null }; } get store() { return this.storage.data; } disable(title, message) { electron.disable(title, message); } on(event, callback, options = {}) { if (_classPrivateFieldGet(_events, this)[event]) _classPrivateFieldGet(_events, this)[event].push({ callback, options }); return this; } async init(override = null) { this.gui.build(); await this.audio.init(); return await _assertClassBrand(_WikiShield_brand, this, _import).call(this, override); } async noinit(override = null) { var _this$AI; const logs = await _assertClassBrand(_WikiShield_brand, this, _import).call(this, override); (_this$AI = this.AI) === null || _this$AI === void 0 || _this$AI.cancel.all(); if (this.store.settings.AI.enabled) switch (this.store.settings.AI.provider) { case "Ollama": { this.AI = new _class.AI.providers.Ollama(this, this.store.settings.AI.Ollama); } break; default: { this.AI = null; } break; } else this.AI = null; { // queue const width = this.store.UI.queue.width; document.body.querySelector("#queue").style.width = width; document.body.querySelector("#right-container").style.width = `calc(100% - ${width})`; } { // details const width = this.store.UI.details.width; document.body.querySelector("#right-details").style.width = width; document.body.querySelector("#right-top").style.width = width; document.body.querySelector("#main-container").style.width = `calc(100% - ${width})`; // document.body.querySelector("#middle-top").style.right = `calc(${width} + 1vmin)`; } this.gui.settings.update(); return logs; } async start() { this.gui.start(); this.update(); this.queue.fetch(); this.started = true; } async update() { const start = performance.now(); const target = 2500; try { await this.api.account().then(info => { this.rights = info.rights.reduce((acc, right) => ({ ...acc, [right]: true }), {}); this.groups = info.groups.reduce((acc, group) => ({ ...acc, [group]: true }), {}); }); await this.api.getGlobalUserInfo(this.api.username).then(info => { var _this$rights; (_this$rights = this.rights).rollback || (_this$rights.rollback = info.rights.includes("rollback")); }); if (!this.rights.rollback && this.api.username !== "LuniZunie") this.disable("Rollback required", "Your account no longer has rollback rights, which are required to use WikiShield."); { // pending changes const allowed = this.rights.review && this.api.hasPendingChanges; document.querySelector("#queue-tab-pending").classList.toggle("hidden", !allowed); if (!allowed && this.queue.current.type === "pending") this.queue.switch("recent"); } { // backup this.backup(); } } catch (error) { console.error("Update error:", error); } setTimeout(() => this.update(), Math.max(0, target - (performance.now() - start))); // Aim for 1 second intervals, but don't pile up calls } cleanup() { const now = Date.now(); let changed = false; for (const [, value] of Object.entries(this.store.highlight)) for (const [name, time] of value.entries()) if (now >= time[1]) { value.delete(name); changed = true; } for (const [, value] of Object.entries(this.store.whitelist)) for (const [name, time] of value.entries()) if (now >= time[1]) { value.delete(name); changed = true; } if (changed) if (this.queue.current.item && this.gui) this.gui.renderQueue(this.queue.current.queue, this.queue.current.item); } controller(event) { var _event$target, _event$target2, _event$target3; if (!this.started) return; if (this.gui.dialog.dialogs.active) return this.gui.dialog.controller(event); else if (this.gui.settings.active) return this.gui.settings.controller(event); if (((_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.tagName) === "INPUT" || ((_event$target2 = event.target) === null || _event$target2 === void 0 ? void 0 : _event$target2.tagName) === "TEXTAREA" || (_event$target3 = event.target) !== null && _event$target3 !== void 0 && _event$target3.isContentEditable) return; // keydown bc we want speedy response if (event.type === "keydown") { if (event.repeat && !this.store.settings.repeat_control_scripts) return; const shortcut = (0, _controlKeys.buildShortcut)(event); for (const script of this.store.control_scripts) if (script.keys.every(key => key === shortcut)) { event.preventDefault(); this.execute(script); } } } async execute(script, continuity = true, updateProgress = null, item = null) { const base = updateProgress === null; const checker = (action, item) => { if (!action.name) return true; else if (action.name === "if") return this.gui.events.conditions[action.condition.name].check(this, item, action.condition.params); else if (action.name === "if not") return !this.gui.events.conditions[action.condition.name].check(this, item, action.condition.params); return false; }; if (base) { item !== null && item !== void 0 ? item : item = this.queue.current.item || 1; const allScripts = [ script ]; let totalActions = 0; while (allScripts.length > 0) { const current = allScripts[0]; if (checker(current, item)) { if (!current.actions) { allScripts.splice(0, 1); continue; } allScripts.push(...current.actions); } if (current.name && !(current.name === "if" || current.name === "if not") && this.gui.events.events[current.name].progress) totalActions++; allScripts.splice(0, 1); } if (totalActions > 0) { let actionsCompleted = 0; const progressBar = new _progressBar.ProgressBar; updateProgress = (text, error) => { const portion = text === "Done" ? 1 : actionsCompleted / totalActions; progressBar.set(text, portion, error); actionsCompleted++; }; } else updateProgress = _ => {}; } if (checker(script, item)) { for (const action of script.actions) { if (!("name" in action)) continue; // Create a copy of params to avoid mutating the original action object const params = { ...action.params }; for (const param of ((_this$gui$events$even = this.gui.events.events[action.name]) === null || _this$gui$events$even === void 0 || (_this$gui$events$even2 = _this$gui$events$even.parameters) === null || _this$gui$events$even2 === void 0 ? void 0 : _this$gui$events$even2.call(_this$gui$events$even, this, item)) || []) { var _this$gui$events$even, _this$gui$events$even2; if (param.id && !(param.id in params) && "default" in param) params[param.id] = param.default; } if (action.name === "if" || action.name === "if not") continuity = await this.execute(action, continuity, updateProgress, item); else { const event = this.gui.events.events[action.name]; const fail = () => { continuity = false; this.audio.playSound([ "action", "failed" ]); if (event.progress) updateProgress(event.progress, true); }; try { if (continuity || !event.continuity) { var _event$valid, _event$valid2; const validity = (_event$valid = (_event$valid2 = event.valid) === null || _event$valid2 === void 0 ? void 0 : _event$valid2.call(event, this, item, params)) !== null && _event$valid !== void 0 ? _event$valid : { valid: true }; if (validity.valid) { if (event.progress) { updateProgress(event.progress, false); this.audio.playSound([ "action", "default" ]); } this.store.statistics.actions_executed.total++; const result = await event.script(this, item, params); if (result.valid === false) { fail(); if ("reason" in result) this.gui.dialog.toast("Action failed", result.reason, "error"); } else { var _event$successful; this.store.statistics.actions_executed.successful++; (_event$successful = event.successful) === null || _event$successful === void 0 || _event$successful.call(event, this, item, params); } } else { fail(); if ("reason" in validity) this.gui.dialog.toast("Action skipped", validity.reason, "error"); } } } catch (error) { fail(); this.gui.dialog.toast("Please report to developer", `An error occurred while executing action "${action.name}". Check the console for details.`, "error"); console.error(`Error executing action "${action.name}":`, error.message || String(error)); } } } } if (!script.name) updateProgress("Done", !continuity); return continuity; } async getDEFCON() { const page = "User:EnterpriseyBot/defcon"; const content = (await this.api.getPagesContent([ page ]))[page]; const level = content.match(/level\s*=\s*(\d+)/); const info = content.match(/info\s*=\s*([\d.]+)/); return { level: level ? Number(level[1]).toLocaleString() : null, info: info ? Number(info[1]).toLocaleString() : null }; } export() { this.time.save = performance.now(); this.store.statistics.session_time += this.time.save - this.time.load; const {string, logs} = this.storage.encode(); _manager2.StorageManager.output(logs); return string; } backup() { this.time.save = performance.now(); this.store.statistics.session_time += this.time.save - this.time.load; this.time.load = this.time.save; const {string} = this.storage.encode(); electron.localStorage.set(`WikiShield:BackupStorage-${this.api.username}`, `${Date.now()};${string}`); return true; } async save() { this.backup(); const data = `${Date.now()};${this.export()}`, username = this.api.username; if (window.isFinite) electron.saveAccount(username, data); else { try { const result = await this.api.postWithToken({ action: "options", optionname: "userjs-wikishield-storage", optionvalue: data }); if ((result === null || result === void 0 ? void 0 : result.options) === "success") console.debug(`[WikiShield] Successfully saved account data for ${username}.`); else console.error(`[WikiShield] Failed to save account data for ${username}:`, result); } catch (err) { console.error(`[WikiShield] Failed to save account data for ${username}:`, err); } } } async load() { try { var _reduce$data, _reduce; const save = (_reduce$data = (_reduce = [ electron.localStorage.get(`WikiShield:BackupStorage-${this.api.username}`), (await this.api.post({ action: "query", meta: "userinfo", uiprop: "options", format: "json" })).query.userinfo.options[`userjs-wikishield-storage`] ].reduce((latest, current) => { var _latest$timestamp; current !== null && current !== void 0 ? current : current = "0;e30="; let timestamp = 0, data = current; if (current.includes(";")) { [timestamp, data] = current.split(";", 2); timestamp = parseInt(timestamp, 10); } if (timestamp > 0 && timestamp > ((_latest$timestamp = latest === null || latest === void 0 ? void 0 : latest.timestamp) !== null && _latest$timestamp !== void 0 ? _latest$timestamp : 0)) return { timestamp, data }; return latest; }, null)) === null || _reduce === void 0 ? void 0 : _reduce.data) !== null && _reduce$data !== void 0 ? _reduce$data : "e30="; return save; } catch (err) { var _console$error; return (_console$error = void console.error("Failed to load storage from wiki:", err)) !== null && _console$error !== void 0 ? _console$error : "e30="; } } page(title, php, encode = true) { return `https://${this.server}/${php ? `w/index.php${title}` : `wiki/${encode ? encodeURIComponent(title) : title}`}`; } open(href, external) { if (external === "force") external = false; else external || (external = !this.store.settings.wikipedia_popups.enabled); if (external) electron.openExternal(href); else { electron.openInBrowser(href).then(popupId => { if (popupId) requestAnimationFrame(() => { this.gui.dialog.popups.push(popupId); if (!document.getElementById("popup-blocker")) { const $popupBlock = document.createElement("div"); $popupBlock.id = "popup-blocker"; $popupBlock.innerText = "Please close the popup or click anywhere on this page to continue using WikiShield."; document.body.appendChild($popupBlock); this.gui.dialog.check(); } }); }); } } } exports.WikiShield = WikiShield; function _emit(event) { if (_classPrivateFieldGet(_events, this)[event]) for (const listener of _classPrivateFieldGet(_events, this)[event]) try { listener.callback(); } catch (_unused) {} finally { var _listener$options; if (((_listener$options = listener.options) === null || _listener$options === void 0 ? void 0 : _listener$options.once) === true) { _classPrivateFieldGet(_events, this)[event] = _classPrivateFieldGet(_events, this)[event].filter(l => l !== listener); } } return this; } async function _import(override = null) { const logs = this.storage.decode(override !== null && override !== void 0 ? override : await this.load()).logs; this.time.load = performance.now(); if (this.store.settings.AI.enabled) { switch (this.store.settings.AI.provider) { case "Ollama": { var _AI$providers; if (typeof ((_AI$providers = _class.AI.providers) === null || _AI$providers === void 0 ? void 0 : _AI$providers.Ollama) === "function") this.AI = new _class.AI.providers.Ollama(this, this.store.settings.AI.Ollama); else { console.error("AI.providers.Ollama is not available. Falling back to null."); this.AI = null; } } break; default: { var _this$AI2; (_this$AI2 = this.AI) === null || _this$AI2 === void 0 || _this$AI2.cancel.all(); this.AI = null; } break; } } else { var _this$AI3; (_this$AI3 = this.AI) === null || _this$AI3 === void 0 || _this$AI3.cancel.all(); this.AI = null; } return logs; } _defineProperty(WikiShield, "config", { version: "2.0.0", changelog: { version: "6", HTML: fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/CHANGELOG.html").then(res => res.text()).catch(() => "<em>Could not fetch changelog.</em>") }, pages: { AIV: "Wikipedia:Administrator intervention against vandalism", UAA: "Wikipedia:Usernames for administrator attention", RFPP: "Wikipedia:Requests for page protection/Increase", SRG: "Steward requests/Global" }, config: { refresh: { recent: 2e3, pending: 2e3, watchlist: 2e3, users: 2e3 }, historyCount: 10 } }); /***/ }, /***/ 4018(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.namespaces = void 0; const namespaces = exports.namespaces = [ { name: "Main", id: 0, analysis_description: { edit: "", username: "" } }, { name: "Talk", id: 1, analysis_description: { edit: "", username: "" } }, { name: "User", id: 2, analysis_description: { edit: "Flag content unrelated to Wikipedia, such as self-promotion. If the page looks like a Wikipedia article, check that it isn't an obvious hoax, and that it is a subpage. Do not follow strict standards for these pages.", username: "Check whether the username matches the base page title. Most often, a user page should only be edited by that user. Consider alternative accounts, like User:Example creating User:Example (alt)." } }, { name: "User talk", id: 3, analysis_description: { edit: "", username: "" } }, { name: "Project", id: 4, analysis_description: { edit: "", username: "" } }, { name: "Project talk", id: 5, analysis_description: { edit: "", username: "" } }, { name: "File", id: 6, analysis_description: { edit: "", username: "" } }, { name: "File talk", id: 7, analysis_description: { edit: "", username: "" } }, { name: "MediaWiki", id: 8, analysis_description: { edit: "", username: "" } }, { name: "MediaWiki talk", id: 9, analysis_description: { edit: "", username: "" } }, { name: "Template", id: 10, analysis_description: { edit: "", username: "" } }, { name: "Template talk", id: 11, analysis_description: { edit: "", username: "" } }, { name: "Help", id: 12, analysis_description: { edit: "", username: "" } }, { name: "Help talk", id: 13, analysis_description: { edit: "", username: "" } }, { name: "Category", id: 14, analysis_description: { edit: "", username: "" } }, { name: "Category talk", id: 15, analysis_description: { edit: "", username: "" } }, { name: "Portal", id: 100, analysis_description: { edit: "", username: "" } }, { name: "Portal talk", id: 101, analysis_description: { edit: "", username: "" } }, { name: "Draft", id: 118, analysis_description: { edit: "", username: "" } }, { name: "Draft talk", id: 119, analysis_description: { edit: "", username: "" } }, { name: "MOS", id: 126, analysis_description: { edit: "", username: "" } }, { name: "MOS talk", id: 127, analysis_description: { edit: "", username: "" } }, { name: "TimedText", id: 710, analysis_description: { edit: "", username: "" } }, { name: "TimedText talk", id: 711, analysis_description: { edit: "", username: "" } }, { name: "Module", id: 828, analysis_description: { edit: "Check whether the edit is meaningful Lua code. In this namespace, anything that isn't written in Lua can be safely assumed to be vandalism. Be careful about multi-line strings, as they might contain non-Lua code: check the context of the edit to make sure. Additionally, check if the edit introduces any obvious Lua syntax errors.", username: "" } }, { name: "Module talk", id: 829, analysis_description: { edit: "", username: "" } }, { name: "Event", id: 1728, analysis_description: { edit: "", username: "" } }, { name: "Event talk", id: 1729, analysis_description: { edit: "", username: "" } } ]; /***/ }, /***/ 6400(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.profanity = void 0; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } const any = "\\*#\\-"; const a = `[${any}a4]`; const b = `[${any}b6]`; const c = `[${any}ck]`; const d = `[${any}d6]`; const e = `[${any}e3]`; const f = `[${any}f]`; const g = `[${any}g9]`; const h = `[${any}h]`; const i = `[${any}i1y]`; const j = `[${any}j]`; const k = `[${any}k]`; const l = `[${any}l1]`; const m = `[${any}m]`; const n = `[${any}n]`; const o = `[${any}o0]`; const p = `[${any}p9]`; const q = `[${any}q9]`; const r = `[${any}r]`; const s = `[${any}sz526]`; const t = `[${any}t7]`; const u = `[${any}uv]`; const v = `[${any}vu]`; const w = `[${any}w]`; const x = `[${any}x]`; const y = `[${any}y]`; const z = `[${any}zs25]`; const zero = `[${any}0]`; const one = `[${any}1]`; const two = `[${any}2]`; const three = `[${any}3]`; const four = `[${any}4]`; const five = `[${any}5]`; const six = `[${any}6]`; const seven = `[${any}7]`; const eight = `[${any}8]`; const nine = `[${any}9]`; const _ = { a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0: zero, 1: one, 2: two, 3: three, 4: four, 5: five, 6: six, 7: seven, 8: eight, 9: nine }; const or = (...patterns) => new RegExp(patterns.map(p => p.source).join("|")); class Profanity { constructor(lookalikes = {}) { this.conversion = {}; for (const [key, variants] of Object.entries(lookalikes)) for (const variant of variants) { if (this.conversion[variant]) console.warn(`Profanity lookalike collision: ${variant} is already mapped to ${this.conversion[variant]}, remapping to ${key}`); this.conversion[variant] = key; } } removeAccents(str) { return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); } obscureReplacements(str) { return str.replace(/(\/[|\\]\/|\\[|\\]\\)/g, "n").replace(/&/g, "and").replace(/zero/g, "0").replace(/one/g, "1").replace(/two/g, "2").replace(/three/g, "3").replace(/four/g, "4").replace(/five/g, "5").replace(/six/g, "6").replace(/seven/g, "7").replace(/eight/g, "8").replace(/nine/g, "9"); // nine => 9 } parseString(str, preserveSpaces = false) { if (preserveSpaces) str = str.replace(/[._,;:|]/g, " ").replace(/\s+/g, " ").toLowerCase(); else str = str.replace(/[\s._,;:|]/g, "").toLowerCase(); str = this.removeAccents(str); let result = ""; for (const char of str) if (this.conversion[char]) result += this.conversion[char]; else result += char; str = this.obscureReplacements(result); return str; } analyzeObfuscation(originalText, matchStart, matchEnd, matchedWord, isMultiWord = false) { const segment = originalText.substring(matchStart, matchEnd); let obfuscation = 0, indicators = 0; const hasInternalSpaces = /\s/.test(segment); if (hasInternalSpaces && !isMultiWord) return -.95; const caseChanges = this.countCaseChanges(segment); if (caseChanges > 0) { const irregularCaseRatio = caseChanges / Math.max(1, segment.length - 1); if (irregularCaseRatio > .3) { obfuscation += .3; indicators++; } } const hasInternalSeparators = /[._,;:|]/.test(segment); if (hasInternalSeparators) { const separatorCount = (segment.match(/[._,;:|]/g) || []).length; const letterCount = (segment.match(/[a-zA-Z0-9]/g) || []).length; if (letterCount > 0) { const separatorRatio = separatorCount / letterCount; if (separatorRatio > .3) { obfuscation += Math.min(.5, separatorRatio * .7); indicators++; } } } const wordBoundaryScore = this.checkWordBoundaries(originalText, matchStart, matchEnd, matchedWord, isMultiWord); obfuscation += wordBoundaryScore; if (wordBoundaryScore !== 0) indicators++; const substitutionScore = this.checkSubstitution(segment, matchedWord); if (substitutionScore > 0) { obfuscation += substitutionScore; indicators++; } if (wordBoundaryScore < 0) { const isStandalone = this.isStandaloneWord(originalText, matchStart, matchEnd); if (!isStandalone) { const isCamelCaseBoundary = this.isCamelCaseBoundary(originalText, matchStart, matchEnd); if (isCamelCaseBoundary) { obfuscation += .2; indicators++; } else { obfuscation -= .2; indicators++; } } } return Math.max(-1, Math.min(1, obfuscation)); } countCaseChanges(str) { let changes = 0; for (let i = 1; i < str.length; i++) { const prev = str[i - 1]; const curr = str[i]; if (/[a-zA-Z]/.test(prev) && /[a-zA-Z]/.test(curr)) { const prevUpper = prev === prev.toUpperCase(); const currUpper = curr === curr.toUpperCase(); if (prevUpper !== currUpper) changes++; } } return changes; } checkWordBoundaries(text, start, end, matchedWord, isMultiWord = false) { const before = start > 0 ? text[start - 1] : ""; const after = end < text.length ? text[end] : ""; const segment = text.substring(Math.max(0, start - 8), Math.min(text.length, end + 8)).toLowerCase(); const legitimatePatterns = [ /WMF/, /pass(word|phrase|port|enger|ion|ive|ed|ing|es|key|code|over|by|able)/i, /class(room|mate|ified|es|ic|y|ification)/i, /grass(land|hopper|y|es)/i, /bass(ist|oon|line|es)/i, /mass(ive|acre|age|es|achusetts)/i, /assign(ment|ed|ing|s|ee|or)/i, /assess(ment|ed|ing|or|s)/i, /assemble|assembly|assertion|asset|assist|assume|assure|associate|association/i, /brass|crass|harass|morass|surpass|trespass|compass|embassy|embarrass/i, /cock(pit|tail|roach|ade|atoo|le|ney)/i, /scunthorpe|penistone|shitterton|lightwater|middlesex|sussex|essex|wessex/i, /dick(ens|inson|son|ey|ie)/i, /analyst|analytics|analyze|canal|banal/i, /therapist|therapeutic|therapy/i, /cumul(ative|us|at)|circum(stance|ference|cise|vent|navigate|scribe)/i, /butter(cup|fly|milk|scotch|fingers|nut)|buttress|button|rebuttal/i, /count(ry|er|ess|down|ing|ed|able|enance|erfeit|erpart)/i, /grape|drape|scrape|landscape|escapade/i, /shell(fish|fire|ter|ed)|eggshell|nutshell|bombshell|seashell/i, /whole(sale|some|hearted)/i, /exchange|exchequer/i, /title|titled|subtitle|entitle/i, /sextant|sextet|bisect|insect|intersect|section|sector/i, /cocktail|peacock|hancock|hitchcock|babcock|woodcock/i, /niger(ia|ian)|montenegro/i, /penisten|penetrat|penal(ty|ize|ise)|penchant|pencil|pendant|penguin|peninsula/i, /manslaughter|slaughterhouse/i, /shitake|shiitake/i, /arsenic|arsenal/i, /cummings|scumble/i, /smother|another|mother(board|land|hood)/i, /wanton|wanting|wanted|warrant/i, /trigger|bigger|digger|jigger|rigger|vigor|figure/i, /ballad|ball(room|park|istic|oon|et|ot|ard|ast)/i, /grape(fruit|vine|shot)/i, /raptor|rapport|rapid|rapier|rapture/i, /killed|killer|skill(ed|ful|s)|killjoy|kiln|kilo(gram|meter|byte|watt)/i, /bomb(ard|astic|shell|er|ing|ay)/i, /hellenic|hello|shell|othello/i, /crack(down|le|ed|ing|erjack)|firecracker/i, /jewel{1,2}/i, /skill/i ]; for (const pattern of legitimatePatterns) if (pattern.test(segment)) return -.8; const beforeIsAlpha = /[a-zA-Z]/.test(before); const afterIsAlpha = /[a-zA-Z]/.test(after); if (beforeIsAlpha && afterIsAlpha) { const beforeText = text.substring(Math.max(0, start - 8), start).toLowerCase(); const afterText = text.substring(end, Math.min(text.length, end + 8)).toLowerCase(); const fullContext = text.substring(Math.max(0, start - 8), Math.min(text.length, end + 8)).toLowerCase(); const paddingScore = this.analyzePaddingLikelihood(beforeText, afterText, matchedWord); if (paddingScore >= .4) return 0; if (fullContext.length > 15 && fullContext === fullContext.toLowerCase() && !/\s/.test(fullContext)) return 0; return -.5; } if (beforeIsAlpha || afterIsAlpha) { const beforeText = text.substring(Math.max(0, start - 8), start).toLowerCase(); const afterText = text.substring(end, Math.min(text.length, end + 8)).toLowerCase(); const paddingScore = this.analyzePaddingLikelihood(beforeText, afterText, matchedWord); if (paddingScore >= .4) return 0; return 0; } const matchSegment = text.substring(start, end); const hasInternalSpaces = /\s/.test(matchSegment); if (hasInternalSpaces && !isMultiWord) return -.9; return 0; } analyzePaddingLikelihood(beforeText, afterText, matchedWord) { let paddingScore = 0; let indicators = 0; const consonantCluster = /[bcdfghjklmnpqrstvwxyz]{3,}/i; if (consonantCluster.test(beforeText) || consonantCluster.test(afterText)) { paddingScore += .4; indicators++; } const suspiciousRepeats = /([a-z])\1{1,}/i; const afterRepeats = afterText.match(suspiciousRepeats); if (afterRepeats && afterRepeats[0].length >= 2) { const repeatPos = afterText.indexOf(afterRepeats[0]); if (repeatPos >= afterText.length - 3) { const commonDoubles = /\b(ll|ss|tt|nn|mm|pp|dd|bb|gg|ff)$/i; if (!commonDoubles.test(afterRepeats[0]) || afterText.length <= 3) { paddingScore += .35; indicators++; } } } if (beforeText.length <= 2 && beforeText.length > 0) { paddingScore += .25; indicators++; } if (afterText.length <= 3 && afterText.length > 0) { const commonSuffixes = /^(er|ed|ing|ion|ly|al|ful|less|ness|ment|s)$/i; if (!commonSuffixes.test(afterText)) { paddingScore += .2; indicators++; } } const uncommonPatterns = /([qx][^u]|[jqxz]{2}|[bcdfghjklmnpqrstvwxz]{4,})/i; if (uncommonPatterns.test(beforeText + afterText)) { paddingScore += .3; indicators++; } const combined = beforeText + afterText; if (combined.length > 0) { const vowels = (combined.match(/[aeiou]/gi) || []).length; const ratio = vowels / combined.length; if (ratio < .2) { paddingScore += .3; indicators++; } } return Math.min(1, paddingScore); } checkSubstitution(segment, matchedWord) { const substitutionChars = /[0-9@$!]/; const hasSubstitution = substitutionChars.test(segment); if (!hasSubstitution) return 0; let subCount = 0; for (const char of segment) if (substitutionChars.test(char)) subCount++; const subRatio = subCount / segment.length; return Math.min(.3, subRatio * .6); } isStandaloneWord(text, start, end) { const before = start > 0 ? text[start - 1] : " "; const after = end < text.length ? text[end] : " "; const wordBoundary = /[\s.,;:!?()[\]{}"'`~\-_]/; return wordBoundary.test(before) && wordBoundary.test(after); } isCamelCaseBoundary(text, start, end) { if (start === 0 || end === text.length) return false; const before = text[start - 1]; const firstChar = text[start]; const lastChar = text[end - 1]; const after = text[end]; const startsWithCapital = /[A-Z]/.test(firstChar); const beforeIsLower = /[a-z]/.test(before); const afterIsLower = /[a-z]/.test(after); const endsWithLower = /[a-z]/.test(lastChar); if (beforeIsLower && startsWithCapital || endsWithLower && /[A-Z]/.test(after)) return true; return false; } findMatchPosition(originalText, matchedText, parsedOriginal, parsedMatch) { const lowerOriginal = originalText.toLowerCase(); let bestStart = -1; let bestEnd = -1; let bestScore = -1; for (let i = 0; i <= lowerOriginal.length - matchedText.length; i++) { const candidate = this.parseString(originalText.substring(i, i + matchedText.length + 10)); if (candidate.includes(parsedMatch)) { const score = this.calculateSimilarity(parsedMatch, candidate.substring(0, parsedMatch.length)); if (score > bestScore) { bestScore = score; bestStart = i; bestEnd = i + matchedText.length; } } } return { start: bestStart, end: bestEnd }; } calculateSimilarity(str1, str2) { const len = Math.min(str1.length, str2.length); let matches = 0; for (let i = 0; i < len; i++) if (str1[i] === str2[i]) matches++; return matches / Math.max(str1.length, str2.length); } match(raw) { const str = this.parseString(raw); const found = []; for (const hit of Profanity.hits) { if (hit.term) { const term = hit.term; const severity = hit.severity || .5; const note = hit.note || null; const isMultiWord = hit.multiWord || false; if (term.length === 1 && /[^\x00-\x7F]/.test(term)) continue; const searchString = isMultiWord ? this.parseString(raw, true) : str; const pattern = term.split("").reduce((acc, char) => { var _$char; if (isMultiWord && char === " ") return acc + " *"; const charPattern = (_$char = _[char]) !== null && _$char !== void 0 ? _$char : char; return acc + charPattern; }, ""); const regex = new RegExp(pattern, "gi"); let match; const positionMap = this.buildPositionMap(raw, isMultiWord); while ((match = regex.exec(searchString)) !== null) { const matchedText = match[0]; const parsedStart = match.index; const parsedEnd = parsedStart + matchedText.length; const originalStart = positionMap[parsedStart] || parsedStart; const originalEnd = positionMap[parsedEnd - 1] !== undefined ? positionMap[parsedEnd - 1] + 1 : parsedEnd; const obfuscation = this.analyzeObfuscation(raw, originalStart, originalEnd, term, isMultiWord); let matchConfidence = this.calculateMatchConfidence(matchedText, term); if (obfuscation < -.5) matchConfidence *= Math.max(.01, 1 + obfuscation * 4); else if (obfuscation < -.2) matchConfidence *= Math.max(.05, 1 + obfuscation * 2.5); else if (obfuscation > .5) matchConfidence = Math.min(1, matchConfidence + obfuscation * .08); const threshold = Math.max(.05, .2 - term.length * .015); if (matchConfidence >= threshold) { const originalSegment = raw.substring(originalStart, originalEnd); if (hit.ignore && Array.isArray(hit.ignore)) if (hit.ignore.includes(originalSegment)) continue; found.push({ name: term, match: matchedText, confidence: matchConfidence, obfuscation, severity, note, originalSegment }); } } } else if (hit.regex) { const matches = raw.match(new RegExp(hit.regex.source, "g")); if (matches) for (const match of matches) found.push({ name: hit.name, match, confidence: 1, obfuscation: .5, severity: hit.severity || .5, note: hit.note || "Pattern-based detection with high confidence. Obfuscation is moderate for formatted data.", originalSegment: match }); } else if (hit.test) { if (hit.test(raw)) found.push({ name: hit.name, match: raw, confidence: 1, obfuscation: .5, severity: hit.severity || .5, note: hit.note || "Test-based detection with high confidence.", originalSegment: raw }); } } return found; } buildPositionMap(original, preserveSpaces = false) { const map = {}; let parsedIndex = 0; for (let i = 0; i < original.length; i++) { const char = original[i]; if (preserveSpaces) { if (/[\s._,;:|]/.test(char)) { if (i === 0 || !/[\s._,;:|]/.test(original[i - 1])) { map[parsedIndex] = i; parsedIndex++; } } else { map[parsedIndex] = i; parsedIndex++; } } else { if (!/[\s._,;:|]/.test(char)) { map[parsedIndex] = i; parsedIndex++; } } } return map; } findOriginalPosition(original, normalizedIndex) { let count = 0; for (let i = 0; i < original.length; i++) { const char = original[i]; if (!/\s/.test(char)) { if (count === normalizedIndex) { return i; } count++; } } return normalizedIndex; } calculateMatchConfidence(matchedString, originalWord) { const fillerPattern = /[\*#_\-]/; let genuineChars = 0; let fillerChars = 0; let consecutiveFillers = 0; let maxConsecutiveFillers = 0; for (const char of matchedString) { if (fillerPattern.test(char)) { fillerChars++; consecutiveFillers++; maxConsecutiveFillers = Math.max(maxConsecutiveFillers, consecutiveFillers); } else { genuineChars++; consecutiveFillers = 0; } } const totalChars = genuineChars + fillerChars; if (totalChars === 0) return 0; const genuineRatio = genuineChars / totalChars; // Hard cutoffs: matches dominated by wildcard/filler chars are noise if (genuineRatio < .3) return 0; if (genuineRatio < .5) return genuineRatio * .1; // Consecutive filler clusters — runs of wildcards indicate noise const clusterPenalty = maxConsecutiveFillers > 1 ? Math.max(.2, 1 - maxConsecutiveFillers * .2) : 1; // Character repetition in genuine chars const charCounts = {}; for (const char of matchedString) if (!fillerPattern.test(char)) charCounts[char] = (charCounts[char] || 0) + 1; let repetitionPenalty = 1; for (const count of Object.values(charCounts)) if (count > 2) repetitionPenalty *= Math.max(.4, 1 - (count - 2) * .15); // Length inflation — match significantly longer than the term is suspicious const lengthRatio = totalChars / originalWord.length; const lengthPenalty = lengthRatio > 1.5 ? Math.max(.2, 1 - (lengthRatio - 1) * .4) : 1; // Genuine ratio is the dominant confidence signal return Math.max(0, Math.min(1, genuineRatio * clusterPenalty * repetitionPenalty * lengthPenalty)); } score(raw) { const matches = this.match(raw); let totalScore = 0; for (const match of matches) totalScore += match.confidence; return totalScore; } evaluate(raw) { const matches = this.match(raw); const str = this.parseString(raw); if (matches.length === 0) return { finalScore: 0, risk: "No", matches: [], details: { baseScore: 0, weightedScore: 0, severityScore: 0, matchCount: 0, averageConfidence: 0, averageObfuscation: 0, averageSeverity: 0, textLength: raw.length, densityPenalty: 0, repetitionPenalty: 0, diversityBonus: 0, lengthModifier: 1, highConfidenceMatches: 0, mediumConfidenceMatches: 0, lowConfidenceMatches: 0 } }; let highConfidenceMatches = 0; let mediumConfidenceMatches = 0; let lowConfidenceMatches = 0; let totalConfidence = 0; let totalObfuscation = 0; let weightedSeverity = 0; const uniqueMatches = new Set; for (const match of matches) { const severity = match.severity || .5; const conf = match.confidence; // Use confidence^1.5 so low-confidence matches contribute very little const effectiveConf = Math.pow(conf, 1.5); totalConfidence += conf; weightedSeverity += effectiveConf * severity; totalObfuscation += match.obfuscation || 0; uniqueMatches.add(match.name); if (conf >= .7) highConfidenceMatches++; else if (conf >= .4) mediumConfidenceMatches++; else lowConfidenceMatches++; } const averageConfidence = totalConfidence / matches.length; const averageObfuscation = totalObfuscation / matches.length; const averageSeverity = totalConfidence > 0 ? weightedSeverity / totalConfidence : 0; // Base score: tier weights emphasize high-confidence matches const baseScore = highConfidenceMatches * 1 + mediumConfidenceMatches * .35 + lowConfidenceMatches * .08; // Text density penalty const textLength = str.length; const matchDensity = matches.length / Math.max(textLength / 5, 1); const densityPenalty = Math.tanh(matchDensity * .3) * .6; // Character repetition penalty const charFrequency = {}; for (const char of str) if (/[a-z0-9]/.test(char)) charFrequency[char] = (charFrequency[char] || 0) + 1; let repetitionScore = 0; const totalChars = Object.values(charFrequency).reduce((a, b) => a + b, 0); for (const count of Object.values(charFrequency)) if (count > 3) repetitionScore += Math.pow((count - 3) / totalChars, 1.5); const repetitionPenalty = Math.min(.8, repetitionScore * 2); // Diversity bonus — more unique terms is more concerning const uniqueMatchRatio = uniqueMatches.size / matches.length; const diversityBonus = uniqueMatchRatio > .6 ? (uniqueMatchRatio - .6) * 1 : 0; // Length modifier const lengthModifier = Math.max(.5, Math.min(1.5, 1 + Math.log10(Math.max(10, textLength)) / 10)); // Obfuscation penalty — high obfuscation means less certainty, not more const obfuscationPenalty = averageObfuscation > .4 ? (averageObfuscation - .4) * .5 : averageObfuscation < -.2 ? Math.abs(averageObfuscation) * .4 : 0; // Critical patterns only count if backed by decent confidence const criticalPatterns = matches.filter(m => m.severity >= 1 && m.confidence >= .5 || m.confidence >= .9).length; const criticalBonus = criticalPatterns * .8; // Compose final score const weightedBase = baseScore * averageSeverity * lengthModifier; const penalties = densityPenalty + repetitionPenalty + obfuscationPenalty; let finalScore = weightedBase + weightedSeverity * .5 + diversityBonus + criticalBonus - penalties; // Confidence gate: if average confidence is low, scale everything down if (averageConfidence < .5) finalScore *= Math.max(.1, averageConfidence * 1.5); // Soft cap if (finalScore > 3) finalScore = 3 + Math.log10(finalScore - 2) * 1.5; else if (finalScore > 1.5) finalScore = 1.5 + Math.sqrt(finalScore - 1.5) * .8; finalScore = Math.max(0, finalScore); let risk = "No"; if (finalScore >= 4 || criticalPatterns >= 2) risk = "Critical"; else if (finalScore >= 2.5) risk = "High"; else if (finalScore >= 1.5) risk = "Medium"; else if (finalScore >= .5) risk = "Low"; return { clamped: Math.max(0, Math.min(1, finalScore / 5)), finalScore: Math.round(finalScore * 100) / 100, risk, matches, details: { baseScore: Math.round(baseScore * 100) / 100, weightedScore: Math.round(weightedBase * 100) / 100, severityScore: Math.round(weightedSeverity * 100) / 100, matchCount: matches.length, uniqueMatches: uniqueMatches.size, averageConfidence: Math.round(averageConfidence * 100) / 100, averageObfuscation: Math.round(averageObfuscation * 100) / 100, averageSeverity: Math.round(averageSeverity * 100) / 100, textLength: raw.length, densityPenalty: Math.round(densityPenalty * 100) / 100, repetitionPenalty: Math.round(repetitionPenalty * 100) / 100, diversityBonus: Math.round(diversityBonus * 100) / 100, lengthModifier: Math.round(lengthModifier * 100) / 100, obfuscationPenalty: Math.round(obfuscationPenalty * 100) / 100, criticalPatterns, highConfidenceMatches, mediumConfidenceMatches, lowConfidenceMatches } }; } } _defineProperty(Profanity, "hits", [ { name: "URL", regex: /(?:https?:\/\/(?:www\.)?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*(?:\/[^\s]*)?|(?:www\.)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:\/[^\s]*)?|[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.(?:com|org|net|edu|gov|mil|int|co|io|ai|app|dev|info|biz|name|pro|museum|aero|coop|jobs|mobi|travel|xxx|ac|ad|ae|af|ag|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(?:\/[^\s]*)?)/i, severity: .1, note: "URLs in usernames may indicate spam or advertising." }, { name: "Phone number", regex: /(\+?\d{1,3}[-.\s]?|\(\+?\d{1,3}\)\s?)?(\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\d{4}[-.\s]?\d{3}[-.\s]?\d{3})/, severity: .3, note: "The pattern of numbers in this username resemble a phone number. Usernames containing personal information may be considered disruptive." }, { name: "Email address", regex: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/, severity: .3, note: "Email addresses in usernames can indicate spam or contact sharing." }, { term: "base64", severity: .2, note: "Base64 encoding may be used to obfuscate content to bypass filters." }, { term: "fromhex", severity: .2, note: "Hex encoding may be used to obfuscate content to bypass filters." }, { term: "1488", severity: .5, note: "Well-known Neo-Nazi symbol, however the number itself can appear in innocent contexts." }, { term: "nazi", severity: 1 }, { term: "swastika", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "卍", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "卐", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "࿕", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "࿖", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "࿗", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "࿘", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "aryan", severity: .7, note: "Associated with white supremacist ideology, though it can also be in reference to the self-designation of Indo-Iranian peoples." }, { term: "fascism", severity: .5 }, { term: "fascist", severity: .5 }, { term: "facist", severity: .5 }, { term: "☭", severity: .5, note: "Hammer and sickle symbol, politically charged but context-dependent." }, { term: "✡", severity: .4, note: "Star of David, can be used respectfully or in antisemitic contexts." }, { term: "44", severity: .1, note: "Obfuscated symbol of the Nazi SS division. If appears as 'ᛋᛋ' or similar, indicates intent to reference the SS." }, { term: "imbo wales", severity: .2, multiWord: true, note: "Play on 'Jimbo Wales' name, may indicate mockery or impersonation." }, { term: "sock", severity: .3, note: "May reference sockpuppet accounts but has innocent meanings." }, { term: "puppet", severity: .3, note: "May reference sockpuppet accounts but has innocent meanings." }, { term: "sock puppet", severity: .6, multiWord: true, note: "Often used in usernames by sockpuppeteers." }, { term: "return", severity: .2, note: "Often used in usernames by sockpuppeteers." }, { term: "is back", severity: .6, multiWord: true, note: "Often used in usernames by sockpuppeteers." }, { term: "are back", severity: .6, multiWord: true, note: "Often used in usernames by sockpuppeteers." }, { term: "timelash", severity: 1, note: 'Well-known sockpuppeteer ("Timelash") on Wikipedia.' }, { term: "my little", severity: .8, multiWord: true, note: "If related to 'my little pony', indicates sockpuppeteer." }, { term: "my little pony", severity: 1, multiWord: true, note: "Well-known sockpuppeteer on Wikipedia." }, { term: "friendship is magic", severity: 1, multiWord: true, note: "Well-known sockpuppeteer on Wikipedia." }, { term: "anal", severity: .7 }, { term: "anus", severity: .5 }, { term: "sex", severity: .3 }, { term: "secs", severity: .05, note: "Obfuscated form of 'sex'." }, { term: "seggs", severity: .2, note: "Obfuscated form of 'sex'." }, { term: "willy", severity: .2, note: "Slang for penis." }, { term: "wank", severity: .6, note: "British sexual slang for masturbation." }, { term: "barf", severity: .3 }, { term: "bastard", severity: .5 }, { term: "batty boy", severity: .7, multiWord: true, note: "Homophobic slur in British/Caribbean English." }, { name: "bitch", regex: new RegExp(`${b + i}(${o}|${a})?${t}?${c + h}`), severity: .7 }, { term: "blow job", severity: .8, multiWord: true }, { term: "blowing", severity: .2, note: "Sexual innuendo but common verb." }, { term: "boner", severity: .4 }, { term: "boob", severity: .4 }, { term: "booty", severity: .3 }, { term: "breast", severity: .4, note: "Anatomical term, but can be used inappropriately." }, { term: "butt", severity: .2 }, { term: "bite me", severity: .5, multiWord: true, note: "Often has defiant or provocative connotation." }, { term: "butt plug", severity: .7, multiWord: true }, { term: "bollock", severity: .5, note: "British slang for testicles." }, { term: "bollox", severity: .5, note: "Variant spelling of 'bollocks'." }, { term: "bollix", severity: .5, note: "Variant spelling of 'bollocks'." }, { term: "clit", severity: .7 }, { term: "cock", severity: .7 }, { term: "cum", severity: .7 }, { term: "brain dead", severity: .5, multiWord: true, note: "Derogatory medical reference." }, { term: "bukake", severity: .7 }, { term: "bully", severity: .5, note: "Indicates harassment behavior." }, { term: "bullies", severity: .5, note: "Indicates harassment behavior." }, { term: "bullied", severity: .3, note: "May indicate victimhood or boasting." }, { term: "versus", severity: .4, note: "Combat/conflict framing, but legitimate word." }, { term: "bumming", severity: .5, note: "British slang for anal sex or begging." }, { term: "bunghole", severity: .5 }, { term: "cesspool", severity: .3, note: "Derogatory term for filthy place." }, { term: "cesspit", severity: .3, note: "Variant of cesspool." }, { term: "dick", severity: .7 }, { term: "prick", severity: .7 }, { term: "dildo", severity: .7 }, { term: "censor", severity: .1, note: "May indicate anti-censorship stance." }, { term: "ching", severity: .8, note: "Part of racial slur against Asians." }, { term: "ching chong", severity: .9, multiWord: true, note: "Racist mockery of Asian languages." }, { term: "ching chang", severity: .9, multiWord: true, note: "Racist mockery of Asian languages." }, { term: "wing wong", severity: .9, multiWord: true, note: "Racist mockery of Asian languages." }, { term: "bot", severity: .4, note: "May indicate automated account claim." }, { term: "ox long", severity: .5, multiWord: true, note: "Phonetic sexual innuendo for 'cock's long'." }, { term: "douche", severity: .5 }, { term: "cunt", severity: .7 }, { term: "cuck", severity: .4, note: "Derogatory term from manosphere." }, { term: "curry munch", severity: .9, multiWord: true, note: "Racist slur against South Asians." }, { term: "crime", severity: .3, note: "Negative connotation but legitimate word." }, { term: "pussy", severity: .7 }, { term: "deeznuts", severity: .3, note: "Crude joke phrase." }, { term: "destroy", severity: .3, note: "Aggressive language." }, { term: "destruction", severity: .3, note: "Aggressive language." }, { term: "diaper", severity: .3, note: "Infantilization or fetish reference." }, { term: "diarrhea", severity: .3 }, { term: "throbbing", severity: .5, note: "Sexual innuendo term." }, { term: "dimwit", severity: .3 }, { term: "doo doo", severity: .3, multiWord: true }, { term: "dookie", severity: .3 }, { term: "fart", severity: .3 }, { term: "ejaculat", severity: .7 }, { term: "erect", severity: .5, note: "Sexual context or legitimate word." }, { term: "erotic", severity: .5 }, { term: "fuck", severity: .8 }, { term: "phuck", severity: .8, note: 'Alternative spelling of "fuck" to bypass detection.' }, { term: "orgasm", severity: .7 }, { term: "rape", severity: 1 }, { term: "lawsuit", severity: .3, note: "Legal threat implication." }, { term: "fraud", severity: .5, note: "Accusation of criminal behavior." }, { term: "tard", severity: .5, note: "Ableist slur suffix." }, { term: "terror", severity: .7, note: "Violence/terrorism reference." }, { term: "mike hunt", severity: .5, multiWord: true, note: "Phonetic sexual innuendo for 'my cunt'." }, { term: "mike ox", severity: .5, multiWord: true, note: "Phonetic sexual innuendo for 'my cock's'." }, { term: "masturbat", severity: .7 }, { term: "nutsack", severity: .5 }, { term: "ophile", severity: 1, note: "Suffix for sexual predator terms like pedophile." }, { term: "pedo", severity: .6 }, { term: "peeing", severity: .3 }, { term: "peanus", severity: .5, note: "Intentional misspelling of 'penis'." }, { term: "penis", severity: .5, note: "Anatomical term, inappropriate in usernames." }, { term: "porn", severity: .7 }, { term: "piss", severity: .5 }, { term: "poop", severity: .3 }, { term: "prison", severity: .3, note: "Criminal context, but legitimate word." }, { term: "prostitute", severity: .5, note: "Sexual work reference or insult." }, { term: "queer", severity: .5, note: "Can be slur or reclaimed identity." }, { term: "rectum", severity: .3, note: "Anatomical term." }, { term: "report me", severity: .3, multiWord: true, note: "Defiant/trolling phrase." }, { term: "rimming", severity: .7 }, { term: "scrotum", severity: .5, note: "Anatomical term, inappropriate in usernames." }, { term: "semen", severity: .7 }, { term: "slut", severity: .7 }, { term: "sucks", severity: .3, note: "Mild profanity or legitimate verb." }, { term: "sux", severity: .3, note: "Intentional misspelling of 'sucks'." }, { term: "vagina", severity: .5, note: "Anatomical term, inappropriate in usernames." }, { term: "vadge", severity: .5, note: "Slang for vagina." }, { term: "vomit", severity: .3 }, { term: "vulva", severity: .5, note: "Anatomical term, inappropriate in usernames." }, { term: "whore", severity: .7 }, { term: "chink", severity: 1 }, { term: "jew", severity: .3, note: "Legitimate religious/ethnic term but tracked for antisemitic usage patterns." }, { term: "nigger", severity: 1 }, { term: "nigga", severity: 1 }, { term: "nigguh", severity: 1, note: "Phonetic spelling of racial slur." }, { term: "niglet", severity: 1 }, { term: "pajeet", severity: .7, note: "Derogatory term for South Asians." }, { term: "slave", severity: .6, note: "Dehumanizing term with historical trauma, but legitimate historical uses." }, { term: "master race", severity: 1, multiWord: true, note: "Nazi supremacist ideology phrase." }, { term: "inferior race", severity: 1, multiWord: true }, { term: "superior race", severity: 1, multiWord: true, note: "White supremacist ideology." }, { term: "racist", severity: .8 }, { term: "racism", severity: .7 }, { term: "racial", severity: .3, note: "Neutral term but tracked for context in discriminatory language." }, { term: "bigot", severity: .7 }, { term: "fag", severity: .7 }, { term: "taliban", severity: .7, note: "Terrorist organization reference." }, { term: "antisemit", severity: 1 }, { term: "bleed", severity: .3, note: "Can indicate violence or be medical." }, { term: "bloody", severity: .3, note: "British profanity or literal blood reference." }, { term: "hell", severity: .5, note: "Religious reference used as mild profanity, but legitimate uses." }, { term: "damn", severity: .3 }, { term: "crap", severity: .3 }, { term: "darn", severity: .1, note: "Mild euphemism for 'damn'." }, { term: "shutup", severity: .3, note: "Rude command indicating hostility." }, { term: "spastic", severity: .5, note: "Ableist slur in British English, medical term in US." }, { term: "disabled", severity: .1, note: "Legitimate disability term but tracked for ableist patterns." }, { term: "loser", severity: .3 }, { term: "abuse", severity: .5, note: "Indicates harmful behavior or accusations." }, { term: "spam", severity: .3, note: "Indicates unwanted content or disruption." }, { term: "abusi", severity: .5, note: "Variant of 'abuse/abusive'." }, { term: "hitler", severity: 1 }, { term: "adolf", severity: .4, note: "Common name but often used in Hitler references." }, { term: "gestapo", severity: 1 }, { term: "heil", severity: .8, note: "Nazi salute reference." }, { term: "final solution", severity: 1, multiWord: true, note: "Nazi euphemism for genocide." }, { term: "death camp", severity: 1, multiWord: true }, { term: "concentration camp", severity: 1, multiWord: true, note: "Holocaust reference, legitimate historical use but concerning in usernames." }, { term: "gas chamber", severity: 1, multiWord: true }, { term: "holocaust", severity: .5, note: "Historical tragedy reference, legitimate historical use." }, { term: "zionis", severity: .5, note: "Political term stem, can be antisemitic depending on context." }, { term: "fuhrer", severity: 1 }, { term: "reich", severity: .7, note: "Nazi Germany reference, though legitimate German word." }, { term: "massacre", severity: .7 }, { term: "slaughter", severity: .7 }, { term: "torture", severity: .7 }, { term: "lynch", severity: 1, note: "Racist mob killing reference, though also a surname." }, { term: "killer", severity: .5 }, { term: "mobster", severity: .5, note: "Organized crime reference." }, { term: "gangster", severity: .3, note: "Criminal reference or slang." }, { term: "druglord", severity: .5, note: "Drug trafficking reference." }, { term: "drugs", severity: .3, note: "General term that can be legitimate or problematic." }, { term: "meth", severity: .5, note: "Reference to illegal drug, though also shorthand for 'method'." }, { term: "cocaine", severity: .5 }, { term: "heroin", severity: .5 }, { term: "weed", severity: .3, note: "Marijuana reference with varying legal status, also refers to plants." }, { term: "marijuana", severity: .3, note: "Cannabis reference with complex legal status." }, { term: "crack", severity: .5, note: "Drug reference or legitimate verb." }, { term: "amphetamine", severity: .5 }, { term: "benzo", severity: .3, note: "Drug abbreviation or name prefix." }, { term: "benzodiazepine", severity: .5 }, { term: "opioid", severity: .3, note: "Drug class, medical term." }, { term: "opiate", severity: .3, note: "Drug class, medical term." }, { term: "ketamine", severity: .5, note: "Drug reference or medical use." }, { term: "rohypnol", severity: .7, note: "Date rape drug reference." }, { term: "i like", severity: .2, multiWord: true, note: "Flagged to detect inappropriate statements when combined with other terms." }, { term: "i love", severity: .3, multiWord: true, note: "Flagged to detect inappropriate statements when combined with other terms." }, { term: "i hate", severity: .5, multiWord: true, note: "Flagged to detect inappropriate statements when combined with other terms." }, { term: "young", severity: .2, note: "Age reference with legitimate uses but flagged in combination." }, { term: "underage", severity: .8, note: "Age reference with concerning implications in certain contexts." }, { term: "teen", severity: .3, note: "Age reference, concerning in some contexts." }, { term: "adolescent", severity: .2, note: "Age term, concerning in some contexts." }, { term: "preteen", severity: .4, note: "Age reference with concerning implications in certain contexts." }, { term: "rapist", severity: 1 }, { term: "raping", severity: 1 }, { term: "incest", severity: 1 }, { term: "cult", severity: .3, note: "Religious/social group term with negative connotation." }, { term: "sekt", severity: .3, note: "German for 'sect', cult reference." }, { term: "disembowel", severity: 1 }, { term: "behead", severity: 1 }, { term: "traitor", severity: .5, note: "Accusatory term." }, { term: "genocide", severity: 1 }, { term: "ethnic clean", severity: 1, multiWord: true, note: "Euphemism for genocide." }, { term: "klan", severity: 1 }, { term: "klux", severity: 1 }, { term: "kkk", severity: 1 }, { term: "kill", severity: .5, note: "Violent language, but common word." }, { term: "bomb", severity: .7, note: "Terrorism/violence reference." }, { term: "organi", severity: .1, note: "Word stem for organization." }, { term: "blog", severity: .1, note: "External site reference." }, { term: "group", severity: .1, note: "Organizational term." }, { term: "compan", severity: .1, note: "Company stem, spam indicator." }, { term: "associat", severity: .1, note: "Association stem." }, { term: "industr", severity: .1, note: "Industry stem, spam indicator." }, { term: "corporate", severity: .1, note: "Business term, spam indicator." }, { term: "famil", severity: .1, note: "Family stem, group indicator." }, { term: "task", severity: .1, note: "Organizational term." }, { term: "alliance", severity: .1, note: "Group term." }, { term: "entertain", severity: .1, note: "Entertainment stem, promotional." }, { term: "public", severity: .1, note: "Common term, promotional context." }, { term: "private", severity: .1, note: "Common term, organizational." }, { term: "troll", severity: .3, note: "Disruptive behavior indicator." }, { term: "trolol", severity: .3, note: "Trolling variant/meme." }, { term: "grief", severity: .3, note: "Gaming term for harassment." }, { term: "password", severity: .3, note: "Security term, suspicious in username." }, { term: "admin", severity: .7, note: "Role impersonation." }, { term: "sysop", severity: .4, note: "Wikipedia role impersonation." }, { term: "bureaucrat", severity: .5, note: "Wikipedia role impersonation." }, { term: "moderator", severity: .5, note: "Role impersonation." }, { term: "staff", severity: .5, note: "Role impersonation." }, { term: "developer", severity: .5, note: "Role impersonation." }, { term: "owner", severity: .4, note: "Role impersonation." }, { term: "founder", severity: .3, note: "Role impersonation." }, { term: "wmf", severity: .2, note: "Wikimedia Foundation impersonation." }, { term: "foundation", severity: .3, note: "Organizational impersonation." }, { term: "unblock", severity: .1, note: "Suggests blocked user." }, { term: "4chan", severity: .5, note: "Imageboard site, trolling association." }, { term: "8chan", severity: .3, note: "Controversial imageboard." }, { term: "reddit", severity: .3, note: "External site reference." }, { term: "plague", severity: .3, note: "Disease/attack term." }, { term: "skibidi", severity: .1, note: "Internet meme reference." }, { term: "milf", severity: .5 }, { term: "dilf", severity: .5 }, { term: "sext", severity: .5, note: "Sending sexual messages." }, { term: "thot", severity: .3, note: "Derogatory sexual slang." }, { term: "rizz", severity: .1, note: "Gen Z slang for charisma." }, { term: "gyatt", severity: .1, note: "Sexualized Gen Z slang." }, { term: "noob", severity: .1 }, { term: "lyric", severity: .1, note: "Possible lyrics website spammer." }, { term: "propaganda", severity: .5, note: "Misinformation term." }, { term: "asshole", severity: .7 }, { term: "fucktard", severity: .7 }, { term: "retard", severity: .7 }, { term: "imbecile", severity: .5 }, { term: "moron", severity: .5 }, { term: "chigga", severity: 1 }, { term: "chigger", severity: 1 }, { term: "wigga", severity: 1 }, { term: "wigger", severity: 1 }, { term: "igga", severity: .7, note: "Potential variant of racial slur.", ignore: [ "1994", "ig94" ] }, { term: "igger", severity: .7, note: "Potential variant of racial slur." }, { term: "mother fuck", severity: .7, multiWord: true }, { term: "bull shit", severity: .6, multiWord: true }, { term: "dumb ass", severity: .5, multiWord: true }, { term: "dumb fuck", severity: .7, multiWord: true }, { term: "goon", severity: .2, multiWord: false } ]); const profanity = exports.profanity = new Profanity({ a: [ "ɑ", "𝑎", "𝗮", "𝕒", "𝖆", "𝓪", "𝚊", "𝞪", "А", "а", "𝔞", "𝒂", "𝘢", "𝛼", "𝒶", "𝙖", "𝜶", "𝐚", "𝖺", "🄰", "🅰️", "🅰", "Ⓐ", "ⓐ", "@" ], b: [ "b", "𝑏", "𝗯", "𝕓", "𝖇", "𝓫", "𝚋", "𝞫", "Ь", "в", "𝔟", "𝒃", "𝘣", "𝛃", "𝒷", "𝙗", "𝜷", "𝐛", "𝖻", "🄱", "🅱️", "🅱", "Ⓑ", "ⓑ" ], c: [ "c", "𝑐", "𝗰", "𝕔", "𝖈", "𝓬", "𝚌", "ϲ", "с", "𝔠", "𝒄", "𝘤", "𝒸", "𝙘", "𝐜", "𝖼", "🄲", "Ⓒ", "ⓒ" ], d: [ "d", "𝑑", "𝗱", "𝕕", "𝖉", "𝓭", "𝚍", "𝞭", "ԁ", "ԃ", "𝔡", "𝒅", "𝘥", "𝛿", "𝒹", "𝙙", "𝜹", "𝐝", "𝖽", "𝝏", "🄳", "Ⓓ", "ⓓ" ], e: [ "e", "𝑒", "𝗲", "𝕖", "𝖊", "𝓮", "𝚎", "𝞮", "е", "𝔢", "𝒆", "𝘦", "𝛆", "𝒺", "𝙚", "𝜺", "𝐞", "𝖾", "з", "𝝐", "🄴", "Ⓔ", "ⓔ", "€" ], f: [ "f", "𝑓", "𝗳", "𝕗", "𝖋", "𝓯", "𝚏", "𝞯", "ғ", "ƒ", "𝔣", "𝒇", "𝘧", "𝒻", "𝙛", "𝜻", "𝐟", "𝖿", "🄵", "Ⓕ", "ⓕ" ], g: [ "g", "𝑔", "𝗴", "𝕘", "𝖌", "𝓰", "𝚐", "ɡ", "Ԍ", "ԍ", "𝔤", "𝒈", "𝘨", "𝙜", "𝐠", "𝗀", "🄶", "Ⓖ", "ⓖ" ], h: [ "h", "𝗵", "𝕙", "𝖍", "𝓱", "𝚑", "һ", "н", "𝔥", "𝒉", "𝘩", "ℎ", "𝒽", "𝙝", "𝐡", "𝗁", "🄷", "Ⓗ", "ⓗ" ], i: [ "i", "𝑖", "𝗶", "𝕚", "𝖎", "𝓲", "𝚒", "𝞲", "і", "𝔦", "𝒊", "𝘪", "𝒾", "𝙞", "𝜾", "𝐢", "𝗂", "🄸", "ℹ️", "ℹ", "Ⓘ", "ⓘ", "!" ], j: [ "j", "𝑗", "𝗷", "𝕛", "𝖏", "𝓳", "𝚳", "ј", "𝔧", "𝒋", "𝘫", "𝒿", "𝙟", "𝐣", "𝗃", "🄹", "Ⓙ", "ⓙ" ], k: [ "k", "𝑘", "𝗸", "𝕜", "𝖐", "𝓴", "κ", "к", "𝔨", "𝒌", "𝘬", "𝓀", "𝙠", "𝝀", "𝐤", "𝗄", "𝞳", "𝜿", "қ", "🄺", "Ⓚ", "ⓚ" ], l: [ "l", "𝑙", "𝗹", "𝕝", "𝖑", "𝓵", "ⅼ", "ӏ", "𝔩", "𝒍", "𝘭", "𝓁", "𝙡", "𝐥", "𝗅", "🄻", "Ⓛ", "ⓛ", "|" ], m: [ "m", "𝑚", "𝗺", "𝕞", "𝖒", "𝓶", "𝚖", "м", "𝔪", "𝒎", "𝘮", "𝓂", "𝙢", "𝐦", "𝗆", "🄼", "Ⓜ️", "Ⓜ", "ⓜ" ], n: [ "n", "𝑛", "𝗻", "𝕟", "𝖓", "𝓷", "𝚗", "ո", "п", "𝔫", "𝒏", "𝘯", "𝓃", "𝙣", "𝐧", "𝗇", "𝞰", "𝜼", "🄽", "Ⓝ", "ⓝ" ], o: [ "o", "𝑜", "𝗼", "𝕠", "𝖔", "𝓸", "𝚘", "ο", "о", "𝔬", "𝒐", "𝘰", "𝙤", "𝝈", "𝐨", "𝗈", "𝜽", "𝝄", "𝝓", "𝝑", "𝝋", "🄾", "🅾️", "🅾", "Ⓞ", "ⓞ" ], p: [ "p", "𝑝", "𝗽", "𝕡", "𝖕", "𝓹", "𝚙", "ρ", "р", "𝔭", "𝒑", "𝘱", "𝓅", "𝙥", "𝐩", "𝗉", "𝝆", "🄿", "🅿️", "🅿", "Ⓟ", "ⓟ" ], q: [ "q", "𝑞", "𝗾", "𝕢", "𝖖", "𝓺", "𝚚", "ԛ", "𝔮", "𝒒", "𝘲", "𝓆", "𝙦", "𝐪", "𝗊", "🅀", "Ⓠ", "ⓠ" ], r: [ "r", "𝑟", "𝗿", "𝕣", "𝖗", "𝓻", "𝚛", "г", "𝔯", "𝒓", "𝘳", "𝓇", "𝙧", "𝐫", "𝗋", "𝞽", "🅁", "Ⓡ", "ⓡ" ], s: [ "s", "𝑠", "𝗌", "𝕤", "𝖘", "𝓼", "𝚜", "ѕ", "𝔰", "𝒔", "𝘴", "𝓈", "𝙨", "𝐬", "🅂", "Ⓢ", "ⓢ", "$" ], t: [ "t", "𝑡", "𝗍", "𝕥", "𝖙", "𝓽", "𝚝", "τ", "т", "𝔱", "𝒕", "𝘵", "𝓉", "𝙩", "𝐭", "𝝉", "🅃", "Ⓣ", "ⓣ", "+" ], u: [ "u", "𝑢", "𝗎", "𝕦", "𝖚", "𝓾", "𝚞", "υ", "𝔲", "𝒖", "𝘶", "𝓊", "𝙪", "𝐮", "𝛍", "🅄", "Ⓤ", "ⓤ" ], v: [ "v", "𝑣", "𝗏", "𝕧", "𝖛", "𝓿", "𝚟", "ν", "𝔳", "𝒗", "𝘷", "𝓋", "𝙫", "𝐯", "𝞶", "𝝂", "𝝊", "🅅", "Ⓥ", "ⓥ" ], w: [ "w", "𝑤", "𝗐", "𝕨", "𝖜", "𝔀", "𝚠", "ω", "ш", "𝔴", "𝒘", "𝘸", "𝓌", "𝙬", "𝐰", "𝝎", "𝝍", "🅆", "Ⓦ", "ⓦ" ], x: [ "x", "𝑥", "𝗑", "𝕩", "𝖝", "𝔁", "𝚡", "χ", "х", "𝔵", "𝒙", "𝘹", "𝓍", "𝙭", "𝐱", "𝝒", "𝝌", "🅇", "Ⓧ", "ⓧ" ], y: [ "y", "𝑦", "𝗒", "𝕪", "𝖞", "𝔂", "𝚢", "у", "𝔶", "𝒚", "𝘺", "𝓎", "𝙮", "𝐲", "𝞬", "𝜸", "𝞴", "🅈", "Ⓨ", "ⓨ" ], z: [ "z", "𝑧", "𝗓", "𝕫", "𝖟", "𝔃", "𝚣", "ζ", "𝔷", "𝒛", "𝘻", "𝓏", "𝙯", "𝐳", "🅉", "Ⓩ", "ⓩ" ], 0: [ "0", "𝟎", "𝟬", "𝟢" ], 1: [ "1", "𝟏", "𝟭", "𝟣", "①", "➀", "❶", "➊", "⓵" ], 2: [ "2", "𝟐", "𝟮", "𝟤", "②", "➁", "❷", "➋", "⓶" ], 3: [ "3", "𝟑", "𝟯", "𝟥", "③", "➂", "❸", "➌", "⓷" ], 4: [ "4", "𝟒", "𝟰", "𝟦", "④", "➃", "❹", "➍", "⓸", "ᛋ" ], 5: [ "5", "𝟓", "𝟱", "𝟧", "⑤", "➄", "❺", "➎", "⓹" ], 6: [ "6", "𝟔", "𝟲", "𝟨", "⑥", "➅", "❻", "➏", "⓺" ], 7: [ "7", "𝟕", "𝟳", "𝟩", "⑦", "➆", "❼", "➐", "⓻" ], 8: [ "8", "𝟖", "𝟴", "𝟪", "⑧", "➇", "❽", "➑", "⓼" ], 9: [ "9", "𝟗", "𝟵", "𝟫", "⑨", "➈", "❾", "➒", "⓽" ] }); /***/ }, /***/ 4712(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Logger = void 0; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _Logger_brand = new WeakSet; class Logger { constructor() { _classPrivateMethodInitSpec(this, _Logger_brand); this.logs = []; } getLogs() { return [ ...this.logs ]; } log(message, expected) { _assertClassBrand(_Logger_brand, this, _log).call(this, "log", message, expected); } warn(message, expected) { _assertClassBrand(_Logger_brand, this, _log).call(this, "warn", message, expected); } error(message, expected) { _assertClassBrand(_Logger_brand, this, _log).call(this, "error", message, expected); } dev(message, expected) { _assertClassBrand(_Logger_brand, this, _log).call(this, "dev", message, expected); } } exports.Logger = Logger; function _log(type, message, expected = false) { const timestamp = (new Date).toISOString(); this.logs.push({ type, timestamp, message, expected }); } /***/ }, /***/ 9501(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.StorageManager = void 0; var _logger = __webpack_require__(4712); var _versions = __webpack_require__(4029); __webpack_require__(9458); __webpack_require__(7345); __webpack_require__(7704); __webpack_require__(8415); function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class StorageManager { static get versions() { return new Map([ [ 0, _versions.Version.v0 ], [ 1, _versions.Version.v1 ], [ 2, _versions.Version.v2 ], [ 3, _versions.Version.v3 ] ]); } constructor() { this.reset(new _logger.Logger); } reset(logger) { logger === null || logger === void 0 || logger.log(`Resetting storage to default.`); this.data = StorageManager.version.default; StorageManager.version.init(logger, this.data); StorageManager.version.validate(); StorageManager.version.construct(); return this.data; } load(data = {}) { var _data, _data$version; const logger = new _logger.Logger; let version = (_data$version = (_data = data).version) !== null && _data$version !== void 0 ? _data$version : _data.version = 0; if (StorageManager.versions.has(version)) { const expectedVersion = StorageManager.version.number; while (version !== expectedVersion) { const StorageClass = StorageManager.versions.get(version + 1); if (typeof (StorageClass === null || StorageClass === void 0 ? void 0 : StorageClass.constructor) === "function" && new StorageClass instanceof _versions.Version) { logger.log(`Upgrading storage from version ${version} to ${version + 1}`, true); try { if (!StorageClass.init(logger, data)) { data = this.reset(logger); break; } data = StorageClass.upgrade(); data.version = ++version; // we do this here to avoid infinite loops in case of upgrade failure } catch (err) { logger.error(`Error upgrading storage from version ${version} to ${version + 1}: ${err}`); data = this.reset(logger); break; } } else { logger.dev(`[MISSING_UPGRADE_METHOD] Uh oh! Something has gone wrong; this message should never appear. Please report this to the WikiShield developers.`); data = this.reset(logger); break; } } version = data.version; logger.log(`Initializing storage at version ${version}.`, true); StorageManager.version.init(logger, data); logger.log(`Validating storage at version ${version}.`, true); StorageManager.version.validate(); logger.log(`Constructing storage at version ${version}.`, true); data = StorageManager.version.construct(); logger.log(`Storage loaded successfully at version ${version}.`, true); this.data = data; } else { logger.error(`Storage version ${version} is corrupted or unsupported.`); this.reset(logger); } return { data: this.data, logs: logger.getLogs() }; } save() { const logger = new _logger.Logger; const version = StorageManager.version.number; logger.log(`Initializing storage at version ${version}.`, true); StorageManager.version.init(logger, this.data); logger.log(`Deconstructing storage at version ${version}.`, true); const data = StorageManager.version.deconstruct(); logger.log(`Storage saved successfully at version ${version}.`, true); return { data, logs: logger.getLogs() }; } decode(string) { try { return this.load(JSON.parse(atob(string.trim() || "e30="))); } catch (err) { return this.load({}); } } encode() { const {data, logs} = this.save(); const string = btoa(JSON.stringify(data)); return { string, logs }; } static output(logs, name = "<unknown>", logger = console) { var _logger$log; const allExpected = !logs.some(log => !log.expected); logger === null || logger === void 0 || (_logger$log = logger.log) === null || _logger$log === void 0 || _logger$log.call(logger, `[${allExpected ? " " : "X"}] WikiShield Storage Logs: ${name}`); for (const log of logs) { var _logger$type; let prefix = `[${log.expected ? " " : "X"}][${log.timestamp}][Storage]`; let type = log.type; if (type === "dev") { type = "error"; prefix = `#DEV# ${prefix}`; } logger === null || logger === void 0 || (_logger$type = logger[type]) === null || _logger$type === void 0 || _logger$type.call(logger, `${prefix} ${log.message}`); } } static okay(data, logger = console) { var _data$logs$some, _data$logs, _data$logs$some2, _StorageManager$outpu; data !== null && data !== void 0 ? data : data = (new StorageManager).load(StorageManager.versions.get(0).default); const okay = !((_data$logs$some = (_data$logs = data.logs) === null || _data$logs === void 0 || (_data$logs$some2 = _data$logs.some) === null || _data$logs$some2 === void 0 ? void 0 : _data$logs$some2.call(_data$logs, log => !log.expected)) !== null && _data$logs$some !== void 0 ? _data$logs$some : true); if (okay) return okay; else return (_StorageManager$outpu = void StorageManager.output(data.logs, "Storage Check", logger)) !== null && _StorageManager$outpu !== void 0 ? _StorageManager$outpu : okay; } } exports.StorageManager = StorageManager; _defineProperty(StorageManager, "version", _versions.Version.v3); /***/ }, /***/ 330(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.isURL = exports.isObject = void 0; const isObject = v => v !== null && typeof v === "object" && !Array.isArray(v); exports.isObject = isObject; const isURL = str => { try { new URL(str); return true; } catch (_unused) { return false; } }; exports.isURL = isURL; /***/ }, /***/ 4029(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Version = void 0; var _logger = __webpack_require__(4712); var _utility = __webpack_require__(330); function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class Version { static sanitize(path, fallback, callback = null) { var _this$loadedLogger$wa; const value = path.reduce((scope, key) => (scope === null || scope === void 0 ? void 0 : scope[key]) !== undefined ? scope[key] : undefined, this.loadedData); if (value === undefined) return (_this$loadedLogger$wa = void this.loadedLogger.warn(`Missing expected key path [ ${path.join(" -> ")} ] in stored data, defaulting to fallback value.`)) !== null && _this$loadedLogger$wa !== void 0 ? _this$loadedLogger$wa : fallback; if (typeof callback === "function") { var _this$loadedLogger$wa2; const modValue = callback(value); if (modValue === undefined) return (_this$loadedLogger$wa2 = void this.loadedLogger.warn(`Invalid value at key path [ ${path.join(" -> ")} ] in stored data, defaulting to fallback value.`)) !== null && _this$loadedLogger$wa2 !== void 0 ? _this$loadedLogger$wa2 : fallback; return modValue; } return value; } static exists(...path) { return path.reduce((scope, key) => (scope === null || scope === void 0 ? void 0 : scope[key]) !== undefined ? scope[key] : undefined, this.loadedData) !== undefined; } static deprecated(...path) { var _this$loadedLogger$wa3; if (this.exists(...path)) return (_this$loadedLogger$wa3 = void this.loadedLogger.warn(`Skipped deprecated key path [ ${path.join(" -> ")} ] in stored data.`, true)) !== null && _this$loadedLogger$wa3 !== void 0 ? _this$loadedLogger$wa3 : true; return false; } static reset(...path) { this.loadedLogger.warn(`Resetting key path [ ${path.join(" -> ")} ] in stored data to default value.`); const value = path.reduce((scope, key) => (scope === null || scope === void 0 ? void 0 : scope[key]) !== undefined ? scope[key] : undefined, this.default); if (value === undefined) return void this.loadedLogger.dev(`Could not find default value for key path [ ${path.join(" -> ")} ] in stored data.`); const final = path.pop(); const scope = path.reduce((scope, key) => { if (scope[key] === undefined) scope[key] = {}; return scope[key]; }, this.loadedData); scope[final] = value; } static restrictObject(obj, ...path) { var _this$reset; if (!(0, _utility.isObject)(obj)) return (_this$reset = void this.reset(...path)) !== null && _this$reset !== void 0 ? _this$reset : false; const keys = Object.keys(path.reduce((scope, key) => (scope === null || scope === void 0 ? void 0 : scope[key]) !== undefined ? scope[key] : undefined, this.default)); Object.keys(obj).forEach(key => { if (!keys.includes(key)) { this.loadedLogger.warn(`Removing unexpected key [ ${[ ...path, key ].join(" -> ")} ] from stored data.`); delete obj[key]; // remove unexpected keys } }); return true; } static get default() { return {}; } static init(logger, data) { this.loadedLogger = logger; this.loadedData = data; return true; } static upgrade() { if (this.loadedData.version !== this.number - 1) { this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number - 1}.`); throw new Error("INVALID_UPGRADE_ATTEMPT"); } return {}; } static validate() { var _this$loadedLogger$er; const root = this.loadedData; this.restrictObject(root); if (root.version !== this.number) return (_this$loadedLogger$er = void this.loadedLogger.error(`Stored data version ${root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er !== void 0 ? _this$loadedLogger$er : false; return true; } } exports.Version = Version; _defineProperty(Version, "loadedLogger", new _logger.Logger); _defineProperty(Version, "loadedData", {}); _defineProperty(Version, "number", 0); /***/ }, /***/ 9458(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _versions = __webpack_require__(4029); var _V; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // DO NOT CHANGE THIS FILE _versions.Version.v0 = (_V = class V0 extends _versions.Version { static get default() { return { version: 0, changelog: "0", options: { maxQueueSize: 50, maxEditCount: 50, minimumORESScore: 0, enableSoundAlerts: true, soundAlertORESScore: .95, enableUsernameHighlighting: true, enableWelcomeLatin: false, enableAutoWelcome: false, enableEditAnalysis: false, enableUsernameAnalysis: false, enableAutoReporting: true, selectedAutoReportReasons: { Vandalism: true, "Subtle vandalism": true, "Image vandalism": true, Sandbox: true, Unsourced: true, "Unsourced (BLP)": true, "Unsourced genre": true, POV: false, Commentary: true, "AI-generated": true, "AI-generated (talk)": true, "MOS violation": false, Censoring: false, Disruption: true, Deleting: true, Errors: true, "Editing tests": true, Chatting: false, Jokes: true, Owning: false, Advertising: true, "Spam links": true, "Personal attacks": true, TPO: true, "AfD removal": true }, zen: { enabled: false, sounds: true, watchlist: false, notifications: true, editCount: false, toasts: false }, enableCloudStorage: true, masterVolume: .5, volumes: { click: .5, notification: .5, watchlist: .5, alert: .5, whoosh: .5, warn: .5, rollback: .5, report: .5, thank: .5, protection: .5, block: .5, sparkle: .5, success: .5, error: .5 }, soundMappings: { click: "click", notification: "notify", watchlist: "ping", alert: "alert", whoosh: "whoosh", warn: "warn", rollback: "rollback", report: "report", thank: "thank", protection: "protection", block: "block", sparkle: "sparkle", success: "success", error: "error" }, watchlistExpiry: "1 week", whitelistExpiry: { users: "indefinite", pages: "indefinite", tags: "indefinite" }, highlightedExpiry: { users: "1 week", pages: "1 week", tags: "1 week" }, wiki: "en", namespacesShown: [ 0 ], showTemps: true, showUsers: true, sortQueueItems: true, enableOllamaAI: false, ollamaServerUrl: "http://localhost:11434", ollamaModel: "", controlScripts: [ { keys: [ "arrowright" ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ " " ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ "q" ], actions: [ { name: "nextEdit", params: {} }, { name: "rollback", params: {} }, { name: "warn", params: { warningType: "Vandalism", level: "auto" } }, { name: "if", condition: "atFinalWarning", actions: [ { name: "if", condition: "operatorNonAdmin", actions: [ { name: "reportToAIV", params: { reportMessage: "Vandalism past final warning" } } ] } ] }, { name: "highlightUser", 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: "Mentor" } } ] } ], selectedPalette: 0, theme: "theme-light" }, statistics: { reviewed: 0, reverts: 0, reverts: 0, reports: 0, warnings: 0, welcomes: 0, whitelisted: 0, highlighted: 0, blocks: 0, sessionStart: Date.now() }, whitelist: { users: [], pages: [], tags: [] }, highlighted: { users: [], pages: [], tags: [] }, queueWidth: "15vw", detailsWidth: "15vw" }; } /* You might be wondering, where are the upgrade and validate functions? 1. This is the first version, so there is no previous version to upgrade from. 2. I didn't feel like validating the first version, if you somehow go back in time and mess up your data, that's on you. */ }, _defineProperty(_V, "number", 0), _V); /***/ }, /***/ 7345(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _utility = __webpack_require__(330); var _namespaces = __webpack_require__(4018); var _warnings = __webpack_require__(955); var _events = __webpack_require__(985); var _conditions = __webpack_require__(870); var _controlKeys = __webpack_require__(9808); var _versions = __webpack_require__(4029); var _V; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // DO NOT CHANGE THIS FILE _versions.Version.v1 = (_V = class V1 extends _versions.Version { static get default() { return { version: 1, changelog: "3", settings: { performance: { startup: "adaptive" }, namespaces: [ 0 ], queue: { max_size: 100, max_edits: 50, min_ores: 0, recent: { enabled: true, order: 0 }, flagged: { enabled: true, order: 1 }, users: { enabled: true, order: 2 }, watchlist: { enabled: true, order: 3 } }, cloud_storage: { enabled: true }, username_highlighting: { enabled: true, fuzzy: true }, auto_welcome: { enabled: true }, expiry: { watchlist: "1 week", whitelist: { users: "indefinite", pages: "indefinite", tags: "indefinite" }, highlight: { users: "1 week", pages: "1 week", tags: "1 week" } }, auto_report: { enabled: true, for: [ "Vandalism", "Subtle vandalism", "Image vandalism", "Sandbox", "Unsourced", "Unsourced (BLP)", "Unsourced genre", /* "POV", */ "Commentary", "AI-generated", "AI-generated (talk)", /* "MOS violation", */ "Censoring", /* "Not English" */ , "Disruption", "Deleting", "Errors", "Editing tests", /* "Chatting", */ "Jokes", /* "Owning", */ "Advertising", "Spam links", "Personal attacks", "TPO", "AfD removal" ] }, AI: { enabled: false, provider: "Ollama", edit_analysis: { enabled: true }, username_analysis: { enabled: true }, Ollama: { server: "http://localhost:11434", model: "" } }, audio: { ores_alert: { enabled: true, threshold: .95 }, volume: { master: 1, "master.startup": 1, "master.music": 1, "master.music.zen_mode": 1, "master.ui": 1, "master.ui.click": .05, "master.queue": 1, "master.queue.ores": 1, "master.queue.mention": 1, "master.notification": 1, "master.notification.alert": .7, "master.notification.notice": .5, "master.notification.toast": .5, "master.action": 1, "master.action.default": .6, "master.action.failed": .85, "master.action.report": 1, "master.action.block": 1, "master.action.protect": 1 } }, zen_mode: { enabled: false, sound: { enabled: true }, music: { enabled: true }, alerts: { enabled: true }, notices: { enabled: false }, toasts: { enabled: false }, badges: { enabled: false } } }, UI: { theme: { palette: 0 }, queue: { width: "15vw" }, details: { width: "15vw" } }, control_scripts: [ { keys: [ "arrowright" ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ " " ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ "q" ], actions: [ { name: "nextEdit", params: {} }, { name: "rollback", params: {} }, { name: "warn", params: { warningType: "Vandalism", level: "auto" } }, { name: "if", condition: "atFinalWarning", actions: [ { name: "if", condition: "operatorNonAdmin", actions: [ { name: "reportToAIV", params: { reportMessage: "Vandalism past final warning" } } ] } ] }, { name: "highlightUser", 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: "Auto" } } ] } ], statistics: { edits_reviewed: { total: 0, thanked: 0 }, recent_changes_reviewed: { total: 0 }, pending_changes_reviewed: { total: 0, accepted: 0, rejected: 0 }, watchlist_changes_reviewed: { total: 0 }, users_reviewed: { total: 0 }, reverts_made: { total: 0, good_faith: 0, from_recent_changes: 0, from_pending_changes: 0, from_watchlist: 0, from_loaded_edits: 0 }, users_welcomed: { total: 0 }, warnings_issued: { total: 0, level_1: 0, level_2: 0, level_3: 0, level_4: 0, level_4im: 0 }, reports_filed: { total: 0, AIV: 0, UAA: 0, RFPP: 0 }, watchlist: { watched: 0, unwatched: 0 }, items_whitelisted: { total: 0, users: 0, pages: 0, tags: 0 }, items_highlighted: { total: 0, users: 0, pages: 0, tags: 0 }, blocks_issued: { total: 0 }, pages_protected: { total: 0 }, actions_executed: { total: 0, successful: 0 }, session_time: 0 }, highlight: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, whitelist: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] } }; } static upgrade() { if (this.loadedData.version !== this.number - 1) { this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number - 1}.`); throw new Error("INVALID_UPGRADE_ATTEMPT"); } this.deprecated("options", "enableWelcomeLatin"); this.deprecated("options", "volumes", "whoosh"); this.deprecated("options", "volumes", "warn"); this.deprecated("options", "volumes", "rollback"); this.deprecated("options", "volumes", "thank"); this.deprecated("options", "volumes", "sparkle"); this.deprecated("options", "volumes", "watchlist"); this.deprecated("options", "volumes", "success"); this.deprecated("options", "volumes", "error"); this.deprecated("options", "soundMappings"); this.deprecated("options", "wiki"); this.deprecated("options", "showTemps"); this.deprecated("options", "showUsers"); this.deprecated("options", "sortQueueItems"); this.deprecated("options", "theme"); this.deprecated("options", "zen", "editCount"); this.deprecated("options", "zen", "watchlist"); // properties without sanitization did not exist in the previous version const defaults = this.default; return { changelog: this.sanitize([ "changelog" ], defaults.changelog), settings: { performance: { startup: defaults.settings.performance.startup }, namespaces: this.sanitize([ "options", "namespacesShown" ], defaults.settings.namespaces), queue: { max_size: this.sanitize([ "options", "maxQueueSize" ], defaults.settings.queue.max_size), max_edits: this.sanitize([ "options", "maxEditCount" ], defaults.settings.queue.max_edits), min_ores: this.sanitize([ "options", "minimumORESScore" ], defaults.settings.queue.min_ores), recent: { enabled: defaults.settings.queue.recent.enabled, order: defaults.settings.queue.recent.order }, flagged: { enabled: defaults.settings.queue.flagged.enabled, order: defaults.settings.queue.flagged.order }, users: { enabled: defaults.settings.queue.users.enabled, order: defaults.settings.queue.users.order }, watchlist: { enabled: defaults.settings.queue.watchlist.enabled, order: defaults.settings.queue.watchlist.order } }, cloud_storage: { enabled: this.sanitize([ "options", "enableCloudStorage" ], defaults.settings.cloud_storage.enabled) }, username_highlighting: { enabled: this.sanitize([ "options", "enableUsernameHighlighting" ], defaults.settings.username_highlighting.enabled), fuzzy: defaults.settings.username_highlighting.fuzzy }, auto_welcome: { enabled: this.sanitize([ "options", "enableAutoWelcome" ], defaults.settings.auto_welcome.enabled) }, expiry: { watchlist: this.sanitize([ "options", "watchlistExpiry" ], defaults.settings.expiry.watchlist), whitelist: { users: this.sanitize([ "options", "whitelistExpiry", "users" ], defaults.settings.expiry.whitelist.users), pages: this.sanitize([ "options", "whitelistExpiry", "pages" ], defaults.settings.expiry.whitelist.pages), tags: this.sanitize([ "options", "whitelistExpiry", "tags" ], defaults.settings.expiry.whitelist.tags) }, highlight: { users: this.sanitize([ "options", "highlightedExpiry", "users" ], defaults.settings.expiry.highlight.users), pages: this.sanitize([ "options", "highlightedExpiry", "pages" ], defaults.settings.expiry.highlight.pages), tags: this.sanitize([ "options", "highlightedExpiry", "tags" ], defaults.settings.expiry.highlight.tags) } }, auto_report: { enabled: this.sanitize([ "options", "enableAutoReporting" ], defaults.settings.auto_report.enabled), for: this.sanitize([ "options", "selectedAutoReportReasons" ], defaults.settings.auto_report.for, value => { if ((0, _utility.isObject)(value)) { value["AI-generated"] = value["AI-Generated"]; delete value["AI-Generated"]; value["AI-generated (talk)"] = value["AI-Generated (talk)"]; delete value["AI-Generated (talk)"]; return Object.keys(value).filter(key => (value === null || value === void 0 ? void 0 : value[key]) === true); } return undefined; }) }, AI: { enabled: this.sanitize([ "options", "enableOllamaAI" ], defaults.settings.AI.enabled), provider: defaults.settings.AI.provider, edit_analysis: { enabled: this.sanitize([ "options", "enableEditAnalysis" ], defaults.settings.AI.edit_analysis.enabled) }, username_analysis: { enabled: this.sanitize([ "options", "enableUsernameAnalysis" ], defaults.settings.AI.username_analysis.enabled) }, Ollama: { server: this.sanitize([ "options", "ollamaServerUrl" ], defaults.settings.AI.Ollama.server), model: this.sanitize([ "options", "ollamaModel" ], defaults.settings.AI.Ollama.model) } }, audio: { ores_alert: { enabled: this.sanitize([ "options", "enableSoundAlerts" ], defaults.settings.audio.ores_alert.enabled), threshold: this.sanitize([ "options", "soundAlertORESScore" ], defaults.settings.audio.ores_alert.threshold) }, volume: { master: this.sanitize([ "options", "masterVolume" ], defaults.settings.audio.volume.master), "master.startup": defaults.settings.audio.volume["master.startup"], "master.music": defaults.settings.audio.volume["master.music"], "master.music.zen_mode": defaults.settings.audio.volume["master.music.zen_mode"], "master.ui": defaults.settings.audio.volume["master.ui"], "master.ui.click": this.sanitize([ "options", "volumes", "click" ], defaults.settings.audio.volume["master.ui.click"]), "master.queue": defaults.settings.audio.volume["master.queue"], "master.queue.ores": this.sanitize([ "options", "volumes", "alert" ], defaults.settings.audio.volume["master.queue.ores"]), "master.queue.mention": defaults.settings.audio.volume["master.queue.mention"], "master.notification": defaults.settings.audio.volume["master.notification"], "master.notification.alert": this.sanitize([ "options", "volumes", "notification" ], defaults.settings.audio.volume["master.notification.alert"]), "master.notification.notice": this.sanitize([ "options", "volumes", "notification" ], defaults.settings.audio.volume["master.notification.notice"]), "master.notification.toast": this.sanitize([ "options", "volumes", "notification" ], defaults.settings.audio.volume["master.notification.toast"]), "master.action": defaults.settings.audio.volume["master.action"], "master.action.default": defaults.settings.audio.volume["master.action.default"], "master.action.failed": defaults.settings.audio.volume["master.action.failed"], "master.action.report": this.sanitize([ "options", "volumes", "report" ], defaults.settings.audio.volume["master.action.report"]), "master.action.block": this.sanitize([ "options", "volumes", "block" ], defaults.settings.audio.volume["master.action.block"]), "master.action.protect": this.sanitize([ "options", "volumes", "protection" ], defaults.settings.audio.volume["master.action.protect"]) } }, zen_mode: { enabled: this.sanitize([ "options", "zen", "enabled" ], defaults.settings.zen_mode.enabled), sound: { enabled: this.sanitize([ "options", "zen", "sounds" ], defaults.settings.zen_mode.sound.enabled) }, music: { enabled: defaults.settings.zen_mode.music.enabled }, alerts: { enabled: this.sanitize([ "options", "zen", "notifications" ], defaults.settings.zen_mode.alerts.enabled) }, notices: { enabled: this.sanitize([ "options", "zen", "notifications" ], defaults.settings.zen_mode.notices.enabled) }, toasts: { enabled: this.sanitize([ "options", "zen", "toasts" ], defaults.settings.zen_mode.toasts.enabled) }, badges: { enabled: defaults.settings.zen_mode.badges.enabled } } }, UI: { theme: { palette: this.sanitize([ "options", "selectedPalette" ], defaults.UI.theme.palette) }, queue: { width: this.sanitize([ "queueWidth" ], defaults.UI.queue.width) }, details: { width: this.sanitize([ "detailsWidth" ], defaults.UI.details.width) } }, control_scripts: this.sanitize([ "options", "controlScripts" ], defaults.control_scripts, value => { if (Array.isArray(value)) { function updateActions(actions, ...path) { return actions.filter((action, index) => { index = +index; if (!(0, _utility.isObject)(action)) return true; // malformed but don't care here if (action.name === "if") { if (!(action.condition in _conditions.conditions)) return true; // malformed but don't care here if (!Array.isArray(action.actions)) return true; // malformed but don't care here action.actions = updateActions.call(this, action.actions, ...path, index, "actions"); } else { switch (action.name) { case "welcome": { if (!(0, _utility.isObject)(action.params)) return true; // malformed but don't care here switch (action.params.template) { case "Links": { action.params.template = "Graphical"; } break; case "Latin": { action.params.template = "Non-Latin"; } break; case "Mentor": { // deprecated =( this.loadedLogger.warn(`Skipped deprecated "Mentor" welcome template at key [${[ ...path, index, "params", "template" ].join(" -> ")}].`, true); return false; } // removed by dead control flow } } break; case "warn": { if (!(0, _utility.isObject)(action.params)) return true; // malformed but don't care here switch (action.params.warningType) { case "AI-Generated": { action.params.warningType = "AI-generated"; } break; case "AI-Generated (talk)": { action.params.warningType = "AI-generated (talk)"; } break; } } break; } } return true; }); } value.forEach((scope2, index) => { index = +index; if (!(0, _utility.isObject)(scope2)) return; if (!Array.isArray(scope2.keys)) return; if (!Array.isArray(scope2.actions)) return; scope2.actions = updateActions.call(this, scope2.actions, "control_scripts", index, "actions"); }); return value; } return undefined; }), statistics: { edits_reviewed: { total: defaults.statistics.edits_reviewed.total, thanked: defaults.statistics.edits_reviewed.thanked }, recent_changes_reviewed: { total: defaults.statistics.recent_changes_reviewed.total }, pending_changes_reviewed: { total: defaults.statistics.pending_changes_reviewed.total, accepted: defaults.statistics.pending_changes_reviewed.accepted, rejected: defaults.statistics.pending_changes_reviewed.rejected }, watchlist_changes_reviewed: { total: defaults.statistics.watchlist_changes_reviewed.total }, users_reviewed: { total: defaults.statistics.users_reviewed.total }, reverts_made: { total: defaults.statistics.reverts_made.total, good_faith: defaults.statistics.reverts_made.good_faith, from_recent_changes: defaults.statistics.reverts_made.from_recent_changes, from_pending_changes: defaults.statistics.reverts_made.from_pending_changes, from_watchlist: defaults.statistics.reverts_made.from_watchlist, from_loaded_edits: defaults.statistics.reverts_made.from_loaded_edits }, users_welcomed: { total: defaults.statistics.users_welcomed.total }, warnings_issued: { total: defaults.statistics.warnings_issued.total, level_1: defaults.statistics.warnings_issued.level_1, level_2: defaults.statistics.warnings_issued.level_2, level_3: defaults.statistics.warnings_issued.level_3, level_4: defaults.statistics.warnings_issued.level_4, level_4im: defaults.statistics.warnings_issued.level_4im }, reports_filed: { total: defaults.statistics.reports_filed.total, AIV: defaults.statistics.reports_filed.AIV, UAA: defaults.statistics.reports_filed.UAA, RFPP: defaults.statistics.reports_filed.RFPP }, watchlist: { watched: defaults.statistics.watchlist.watched, unwatched: defaults.statistics.watchlist.unwatched }, items_whitelisted: { total: defaults.statistics.items_whitelisted.total, users: defaults.statistics.items_whitelisted.users, pages: defaults.statistics.items_whitelisted.pages, tags: defaults.statistics.items_whitelisted.tags }, items_highlighted: { total: defaults.statistics.items_highlighted.total, users: defaults.statistics.items_highlighted.users, pages: defaults.statistics.items_highlighted.pages, tags: defaults.statistics.items_highlighted.tags }, blocks_issued: { total: defaults.statistics.blocks_issued.total }, pages_protected: { total: defaults.statistics.pages_protected.total }, actions_executed: { total: defaults.statistics.actions_executed.total, successful: defaults.statistics.actions_executed.successful }, session_time: defaults.statistics.session_time }, highlight: { users: this.sanitize([ "highlighted", "users" ], defaults.highlight.users), pages: this.sanitize([ "highlighted", "pages" ], defaults.highlight.pages), tags: this.sanitize([ "highlighted", "tags" ], defaults.highlight.tags) }, whitelist: { users: this.sanitize([ "whitelist", "users" ], defaults.whitelist.users), pages: this.sanitize([ "whitelist", "pages" ], defaults.whitelist.pages), tags: this.sanitize([ "whitelist", "tags" ], defaults.whitelist.tags) } }; } static validate() { var _this$loadedLogger$er; const root = this.loadedData; this.restrictObject(root); if (root.version !== this.number) return (_this$loadedLogger$er = void this.loadedLogger.error(`Stored data version ${root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er !== void 0 ? _this$loadedLogger$er : false; if (typeof root.changelog !== "string") this.reset("changelog"); { // root.settings const scope = root.settings; this.restrictObject(scope, "settings"); { // root.settings.performance const scope = root.settings.performance; this.restrictObject(scope, "settings", "performance"); { // root.settings.performance.startup const validValues = new Set([ "always_off", "adaptive", "always_on" ]); const value = root.settings.performance.startup; if (!validValues.has(value)) this.reset("settings", "performance", "startup"); } } { // root.settings.namespaces const value = root.settings.namespaces; if (!Array.isArray(value)) this.reset("settings", "namespaces"); root.settings.namespaces = [ ...new Set(root.settings.namespaces) ].filter(v => { const valid = _namespaces.namespaces.some(ns => ns.id === v); if (!valid) this.loadedLogger.warn(`Removing invalid namespace ID [ ${v} ] from stored data.`); return valid; }); } { // root.settings.queue const scope = root.settings.queue; this.restrictObject(scope, "settings", "queue"); { // root.settings.queue.max_size const value = root.settings.queue.max_size; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_size"); } { // root.settings.queue.max_edits const value = root.settings.queue.max_edits; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_edits"); } { // root.settings.queue.min_ores const value = root.settings.queue.min_ores; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "queue", "min_ores"); } [ "recent", "flagged", "users", "watchlist" ].forEach((section, _, queues) => { { // root.settings.queue[section] const scope = root.settings.queue[section]; this.restrictObject(scope, "settings", "queue", section); { // root.settings.queue[section].enabled const value = root.settings.queue[section].enabled; if (typeof value !== "boolean") this.reset("settings", "queue", section, "enabled"); } { // root.settings.queue[section].order const value = root.settings.queue[section].order; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value < queues.length)) this.reset("settings", "queue", section, "order"); } } }); } { // root.settings.cloud_storage const scope = root.settings.cloud_storage; this.restrictObject(scope, "settings", "cloud_storage"); { // root.settings.cloud_storage.enabled const value = root.settings.cloud_storage.enabled; if (typeof value !== "boolean") this.reset("settings", "cloud_storage", "enabled"); } } { // root.settings.username_highlighting const scope = root.settings.username_highlighting; this.restrictObject(scope, "settings", "username_highlighting"); { // root.settings.username_highlighting.enabled const value = root.settings.username_highlighting.enabled; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "enabled"); } { // root.settings.username_highlighting.fuzzy const value = root.settings.username_highlighting.fuzzy; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "fuzzy"); } } { // root.settings.auto_welcome const scope = root.settings.auto_welcome; this.restrictObject(scope, "settings", "auto_welcome"); { // root.settings.auto_welcome.enabled const value = root.settings.auto_welcome.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_welcome", "enabled"); } } { // root.settings.expiry const expiries = new Set([ "none", "1 hour", "1 day", "1 week", "1 month", "3 months", "6 months", "indefinite" ]); const scope = root.settings.expiry; this.restrictObject(scope, "settings", "expiry"); { // root.settings.expiry.watchlist const value = root.settings.expiry.watchlist; if (!expiries.has(value)) this.reset("settings", "expiry", "watchlist"); } { // root.settings.expiry.whitelist const scope = root.settings.expiry.whitelist; this.restrictObject(scope, "settings", "expiry", "whitelist"); { // root.settings.expiry.whitelist.users const value = root.settings.expiry.whitelist.users; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "users"); } { // root.settings.expiry.whitelist.pages const value = root.settings.expiry.whitelist.pages; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "pages"); } { // root.settings.expiry.whitelist.tags const value = root.settings.expiry.whitelist.tags; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "tags"); } } { // root.settings.expiry.highlight const scope = root.settings.expiry.highlight; this.restrictObject(scope, "settings", "expiry", "highlight"); { // root.settings.expiry.highlight.users const value = root.settings.expiry.highlight.users; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "users"); } { // root.settings.expiry.highlight.pages const value = root.settings.expiry.highlight.pages; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "pages"); } { // root.settings.expiry.highlight.tags const value = root.settings.expiry.highlight.tags; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "tags"); } } } { // root.settings.auto_report const scope = root.settings.auto_report; this.restrictObject(scope, "settings", "auto_report"); { // root.settings.auto_report.enabled const value = root.settings.auto_report.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_report", "enabled"); } { // root.settings.auto_report.for const value = root.settings.auto_report.for; if (!Array.isArray(value)) this.reset("settings", "auto_report", "for"); root.settings.auto_report.for = [ ...new Set(root.settings.auto_report.for) ].filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid auto-report reason [ ${v} ] from stored data.`); return valid; }); } } { // root.settings.AI const scope = root.settings.AI; this.restrictObject(scope, "settings", "AI"); { // root.settings.AI.enabled const value = root.settings.AI.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "enabled"); } { // root.settings.AI.provider const value = root.settings.AI.provider; if (value !== "Ollama") this.reset("settings", "AI", "provider"); } { // root.settings.AI.edit_analysis const scope = root.settings.AI.edit_analysis; this.restrictObject(scope, "settings", "AI", "edit_analysis"); { // root.settings.AI.edit_analysis.enabled const value = root.settings.AI.edit_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "edit_analysis", "enabled"); } } { // root.settings.AI.username_analysis const scope = root.settings.AI.username_analysis; this.restrictObject(scope, "settings", "AI", "username_analysis"); { // root.settings.AI.username_analysis.enabled const value = root.settings.AI.username_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "username_analysis", "enabled"); } } { // root.settings.AI.Ollama const scope = root.settings.AI.Ollama; this.restrictObject(scope, "settings", "AI", "Ollama"); { // root.settings.AI.Ollama.server const value = root.settings.AI.Ollama.server; if (!(0, _utility.isURL)(value)) this.reset("settings", "AI", "Ollama", "server"); } { // root.settings.AI.Ollama.model const value = root.settings.AI.Ollama.model; if (typeof value !== "string") this.reset("settings", "AI", "Ollama", "model"); } } } { // root.settings.audio const scope = root.settings.audio; this.restrictObject(scope, "settings", "audio"); { // root.settings.audio.ores_alert const scope = root.settings.audio.ores_alert; this.restrictObject(scope, "settings", "audio", "ores_alert"); { // root.settings.audio.ores_alert.enabled const value = root.settings.audio.ores_alert.enabled; if (typeof value !== "boolean") this.reset("settings", "audio", "ores_alert", "enabled"); } { // root.settings.audio.ores_alert.threshold const value = root.settings.audio.ores_alert.threshold; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "ores_alert", "threshold"); } } { // root.settings.audio.volume const scope = root.settings.audio.volume; this.restrictObject(scope, "settings", "audio", "volume"); const volumeKeys = [ "master", "master.startup", "master.music", "master.music.zen_mode", "master.ui", "master.ui.click", "master.queue", "master.queue.ores", "master.queue.mention", "master.notification", "master.notification.alert", "master.notification.notice", "master.notification.toast", "master.action", "master.action.default", "master.action.failed", "master.action.report", "master.action.block", "master.action.protect" ]; for (const key of volumeKeys) { const value = root.settings.audio.volume[key]; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "volume", key); } } } { // root.settings.zen_mode const scope = root.settings.zen_mode; this.restrictObject(scope, "settings", "zen_mode"); { // root.settings.zen_mode.enabled const value = scope.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "enabled"); } { // root.settings.zen_mode.sound const scope = root.settings.zen_mode.sound; this.restrictObject(scope, "settings", "zen_mode", "sound"); { // root.settings.zen_mode.sound.enabled const value = root.settings.zen_mode.sound.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "sound", "enabled"); } } { // root.settings.zen_mode.music const scope = root.settings.zen_mode.music; this.restrictObject(scope, "settings", "zen_mode", "music"); { // root.settings.zen_mode.music.enabled const value = root.settings.zen_mode.music.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "music", "enabled"); } } { // root.settings.zen_mode.alerts const scope = root.settings.zen_mode.alerts; this.restrictObject(scope, "settings", "zen_mode", "alerts"); { // root.settings.zen_mode.alerts.enabled const value = root.settings.zen_mode.alerts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "alerts", "enabled"); } } { // root.settings.zen_mode.notices const scope = root.settings.zen_mode.notices; this.restrictObject(scope, "settings", "zen_mode", "notices"); { // root.settings.zen_mode.notices.enabled const value = root.settings.zen_mode.notices.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "notices", "enabled"); } } { // root.settings.zen_mode.toasts const scope = root.settings.zen_mode.toasts; this.restrictObject(scope, "settings", "zen_mode", "toasts"); { // root.settings.zen_mode.toasts.enabled const value = root.settings.zen_mode.toasts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "toasts", "enabled"); } } { // root.settings.zen_mode.badges const scope = root.settings.zen_mode.badges; this.restrictObject(scope, "settings", "zen_mode", "badges"); { // root.settings.zen_mode.badges.enabled const value = root.settings.zen_mode.badges.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "badges", "enabled"); } } } } { // root.UI const scope = root.UI; this.restrictObject(scope, "UI"); { // root.UI.theme const scope = root.UI.theme; this.restrictObject(scope, "UI", "theme"); { // root.UI.theme.palette const value = root.UI.theme.palette; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 3)) this.reset("UI", "theme", "palette"); } } { // root.UI.queue const scope = root.UI.queue; this.restrictObject(scope, "UI", "queue"); { // root.UI.queue.width const value = root.UI.queue.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "queue", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "queue", "width"); } } { // root.UI.details const scope = root.UI.details; this.restrictObject(scope, "UI", "details"); { // root.UI.details.width const value = root.UI.details.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "details", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "details", "width"); } } } { // root.control_scripts const scope = root.control_scripts; if (!Array.isArray(scope)) this.reset("control_scripts"); function sanitizeActions(actions, ...path) { return actions.filter((action, index) => { var _this$loadedLogger$wa; index = +index; if (!(0, _utility.isObject)(action)) return (_this$loadedLogger$wa = void this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa !== void 0 ? _this$loadedLogger$wa : false; if (action.name === "if") { var _this$loadedLogger$wa2; if (!(action.condition in _conditions.conditions)) return (_this$loadedLogger$wa2 = void this.loadedLogger.warn(`Removing invalid condition [ ${action.condition} ] at path [ ${[ ...path, index, "condition" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa2 !== void 0 ? _this$loadedLogger$wa2 : false; if (!Array.isArray(action.actions)) { this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[ ...path, index, "actions" ].join(" -> ")} ] in stored data.`); action.actions = []; } action.actions = sanitizeActions.call(this, action.actions, ...path, index, "actions"); } else { var _events$action$name$p; if (!(action.name in _events.events)) { this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index, "name" ].join(" -> ")} ] from stored data.`); return false; } if (!(0, _utility.isObject)(action.params)) { this.loadedLogger.warn(`Resetting invalid params object at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params = {}; } const references = (_events$action$name$p = _events.events[action.name].parameters) !== null && _events$action$name$p !== void 0 ? _events$action$name$p : []; const validIds = new Set; for (const reference of references) { validIds.add(reference.id); if (reference.type === "choice") { if (!(reference.id in action.params)) { this.loadedLogger.warn(`Resetting missing choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = reference.options[0]; } if (!reference.options.includes(action.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = reference.options[0]; } } } for (const paramKey of Object.keys(action.params)) { if (!validIds.has(paramKey)) { this.loadedLogger.warn(`Removing invalid parameter [ ${paramKey} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] from stored data.`); delete action.params[paramKey]; } } } return true; }); } root.control_scripts = root.control_scripts.filter((scope, index) => { var _this$loadedLogger$wa3; index = +index; if (!(0, _utility.isObject)(scope)) return (_this$loadedLogger$wa3 = void this.loadedLogger.warn(`Removing invalid control script at path [ ${[ "control_scripts", index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa3 !== void 0 ? _this$loadedLogger$wa3 : false; if (!Array.isArray(scope.keys)) { this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].keys = []; } if (!Array.isArray(scope.actions)) { this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].actions = []; } root.control_scripts[index].keys = scope.keys.filter(key => _controlKeys.controls.has(key)); root.control_scripts[index].actions = sanitizeActions.call(this, scope.actions, "control_scripts", index, "actions"); return true; }); } { // root.statistics const isValidStatistic = v => typeof v === "number" && Number.isInteger(v) && v >= 0; const scope = root.statistics; this.restrictObject(scope, "statistics"); { // root.statistics.edits_reviewed const scope = root.statistics.edits_reviewed; this.restrictObject(scope, "statistics", "edits_reviewed"); { // root.statistics.edits_reviewed.total const value = root.statistics.edits_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "total"); } { // root.statistics.edits_reviewed.thanked const value = root.statistics.edits_reviewed.thanked; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "thanked"); } } { // root.statistics.recent_changes_reviewed const scope = root.statistics.recent_changes_reviewed; this.restrictObject(scope, "statistics", "recent_changes_reviewed"); { // root.statistics.recent_changes_reviewed.total const value = root.statistics.recent_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "recent_changes_reviewed", "total"); } } { // root.statistics.pending_changes_reviewed const scope = root.statistics.pending_changes_reviewed; this.restrictObject(scope, "statistics", "pending_changes_reviewed"); { // root.statistics.pending_changes_reviewed.total const value = root.statistics.pending_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "total"); } { // root.statistics.pending_changes_reviewed.accepted const value = root.statistics.pending_changes_reviewed.accepted; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "accepted"); } { // root.statistics.pending_changes_reviewed.rejected const value = root.statistics.pending_changes_reviewed.rejected; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "rejected"); } } { // root.statistics.watchlist_changes_reviewed const scope = root.statistics.watchlist_changes_reviewed; this.restrictObject(scope, "statistics", "watchlist_changes_reviewed"); { // root.statistics.watchlist_changes_reviewed.total const value = root.statistics.watchlist_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "watchlist_changes_reviewed", "total"); } } { // root.statistics.users_reviewed const scope = root.statistics.users_reviewed; this.restrictObject(scope, "statistics", "users_reviewed"); { // root.statistics.users_reviewed.total const value = root.statistics.users_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_reviewed", "total"); } } { // root.statistics.reverts_made const scope = root.statistics.reverts_made; this.restrictObject(scope, "statistics", "reverts_made"); { // root.statistics.reverts_made.total const value = root.statistics.reverts_made.total; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "total"); } { // root.statistics.reverts_made.good_faith const value = root.statistics.reverts_made.good_faith; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "good_faith"); } { // root.statistics.reverts_made.from_recent_changes const value = root.statistics.reverts_made.from_recent_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_recent_changes"); } { // root.statistics.reverts_made.from_pending_changes const value = root.statistics.reverts_made.from_pending_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_pending_changes"); } { // root.statistics.reverts_made.from_watchlist const value = root.statistics.reverts_made.from_watchlist; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_watchlist"); } { // root.statistics.reverts_made.from_loaded_edits const value = root.statistics.reverts_made.from_loaded_edits; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_loaded_edits"); } } { // root.statistics.users_welcomed const scope = root.statistics.users_welcomed; this.restrictObject(scope, "statistics", "users_welcomed"); { // root.statistics.users_welcomed.total const value = root.statistics.users_welcomed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_welcomed", "total"); } } { // root.statistics.warnings_issued const scope = root.statistics.warnings_issued; this.restrictObject(scope, "statistics", "warnings_issued"); { // root.statistics.warnings_issued.total const value = root.statistics.warnings_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "total"); } { // root.statistics.warnings_issued.level_1 const value = root.statistics.warnings_issued.level_1; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_1"); } { // root.statistics.warnings_issued.level_2 const value = root.statistics.warnings_issued.level_2; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_2"); } { // root.statistics.warnings_issued.level_3 const value = root.statistics.warnings_issued.level_3; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_3"); } { // root.statistics.warnings_issued.level_4 const value = root.statistics.warnings_issued.level_4; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4"); } { // root.statistics.warnings_issued.level_4im const value = root.statistics.warnings_issued.level_4im; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4im"); } } { // root.statistics.reports_filed const scope = root.statistics.reports_filed; this.restrictObject(scope, "statistics", "reports_filed"); { // root.statistics.reports_filed.total const value = root.statistics.reports_filed.total; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "total"); } { // root.statistics.reports_filed.AIV const value = root.statistics.reports_filed.AIV; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "AIV"); } { // root.statistics.reports_filed.UAA const value = root.statistics.reports_filed.UAA; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "UAA"); } { // root.statistics.reports_filed.RFPP const value = root.statistics.reports_filed.RFPP; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "RFPP"); } } { // root.statistics.watchlist const scope = root.statistics.watchlist; this.restrictObject(scope, "statistics", "watchlist"); { // root.statistics.watchlist.watched const value = root.statistics.watchlist.watched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "watched"); } { // root.statistics.watchlist.unwatched const value = root.statistics.watchlist.unwatched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "unwatched"); } } { // root.statistics.items_whitelisted const scope = root.statistics.items_whitelisted; this.restrictObject(scope, "statistics", "items_whitelisted"); { // root.statistics.items_whitelisted.total const value = root.statistics.items_whitelisted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "total"); } { // root.statistics.items_whitelisted.users const value = root.statistics.items_whitelisted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "users"); } { // root.statistics.items_whitelisted.pages const value = root.statistics.items_whitelisted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "pages"); } { // root.statistics.items_whitelisted.tags const value = root.statistics.items_whitelisted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "tags"); } } { // root.statistics.items_highlighted const scope = root.statistics.items_highlighted; this.restrictObject(scope, "statistics", "items_highlighted"); { // root.statistics.items_highlighted.total const value = root.statistics.items_highlighted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "total"); } { // root.statistics.items_highlighted.users const value = root.statistics.items_highlighted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "users"); } { // root.statistics.items_highlighted.pages const value = root.statistics.items_highlighted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "pages"); } { // root.statistics.items_highlighted.tags const value = root.statistics.items_highlighted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "tags"); } } { // root.statistics.blocks_issued const scope = root.statistics.blocks_issued; this.restrictObject(scope, "statistics", "blocks_issued"); { // root.statistics.blocks_issued.total const value = root.statistics.blocks_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "blocks_issued", "total"); } } { // root.statistics.pages_protected const scope = root.statistics.pages_protected; this.restrictObject(scope, "statistics", "pages_protected"); { // root.statistics.pages_protected.total const value = root.statistics.pages_protected.total; if (!isValidStatistic(value)) this.reset("statistics", "pages_protected", "total"); } } { // root.statistics.actions_executed const scope = root.statistics.actions_executed; this.restrictObject(scope, "statistics", "actions_executed"); { // root.statistics.actions_executed.total const value = root.statistics.actions_executed.total; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "total"); } { // root.statistics.actions_executed.successful const value = root.statistics.actions_executed.successful; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "successful"); } } { // root.statistics.session_time const value = root.statistics.session_time; if (!(typeof value === "number" && value >= 0)) this.reset("statistics", "session_time"); } } const isValidExpiryMap = root => { // [ username, [ timestamp, timestamp ] ] if (!(Array.isArray(root) && root.length === 2)) return false; else if (typeof root[0] !== "string") return false; { const scope = root[1]; if (!(Array.isArray(scope) && scope.length === 2)) return false; const isTimestamp = v => typeof v === "number" && Number.isInteger(v) && v >= 0; if (!(isTimestamp(scope[0]) && isTimestamp(scope[1]))) return false; } return true; }; { // root.highlight const scope = root.highlight; this.restrictObject(scope, "highlight"); { // root.highlight.users const value = root.highlight.users; if (!Array.isArray(value)) this.reset("highlight", "users"); root.highlight.users = root.highlight.users.filter(v => isValidExpiryMap(v)); } { // root.highlight.pages const value = root.highlight.pages; if (!Array.isArray(value)) this.reset("highlight", "pages"); root.highlight.pages = root.highlight.pages.filter(v => isValidExpiryMap(v)); } { // root.highlight.tags const value = root.highlight.tags; if (!Array.isArray(value)) this.reset("highlight", "tags"); root.highlight.tags = root.highlight.tags.filter(v => isValidExpiryMap(v)); } } { // root.whitelist const scope = root.whitelist; this.restrictObject(scope, "whitelist"); { // root.whitelist.users const value = root.whitelist.users; if (!Array.isArray(value)) this.reset("whitelist", "users"); root.whitelist.users = root.whitelist.users.filter(v => isValidExpiryMap(v)); } { // root.whitelist.pages const value = root.whitelist.pages; if (!Array.isArray(value)) this.reset("whitelist", "pages"); root.whitelist.pages = root.whitelist.pages.filter(v => isValidExpiryMap(v)); } { // root.whitelist.tags const value = root.whitelist.tags; if (!Array.isArray(value)) this.reset("whitelist", "tags"); root.whitelist.tags = root.whitelist.tags.filter(v => isValidExpiryMap(v)); } } return true; } static construct() { var _this$loadedLogger$er2; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er2 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er2 !== void 0 ? _this$loadedLogger$er2 : false; root.settings.auto_report.for = new Set(root.settings.auto_report.for); root.highlight.users = new Map(root.highlight.users); root.highlight.pages = new Map(root.highlight.pages); root.highlight.tags = new Map(root.highlight.tags); root.whitelist.users = new Map(root.whitelist.users); root.whitelist.pages = new Map(root.whitelist.pages); root.whitelist.tags = new Map(root.whitelist.tags); return root; } static deconstruct() { var _this$loadedLogger$er3; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er3 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er3 !== void 0 ? _this$loadedLogger$er3 : false; root.settings.auto_report.for = [ ...root.settings.auto_report.for ]; root.highlight.users = [ ...root.highlight.users ]; root.highlight.pages = [ ...root.highlight.pages ]; root.highlight.tags = [ ...root.highlight.tags ]; root.whitelist.users = [ ...root.whitelist.users ]; root.whitelist.pages = [ ...root.whitelist.pages ]; root.whitelist.tags = [ ...root.whitelist.tags ]; const data = structuredClone(root); // stuctureClone is safe since we have to use JSON for storage anyway this.construct(); // reconstruct to restore Maps and Sets return data; } }, _defineProperty(_V, "number", 1), _V); /***/ }, /***/ 7704(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _utility = __webpack_require__(330); var _namespaces = __webpack_require__(4018); var _warnings = __webpack_require__(955); var _events = __webpack_require__(985); var _conditions = __webpack_require__(870); var _controlKeys = __webpack_require__(9808); var _versions = __webpack_require__(4029); var _V; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // DO NOT CHANGE THIS FILE _versions.Version.v2 = (_V = class V2 extends _versions.Version { static get default() { return { version: 2, changelog: "6", settings: { performance: { startup: "adaptive" }, namespaces: [ 0 ], queue: { max_size: 100, max_edits: 50, min_ores: 0, recent: { enabled: true, order: 0 }, flagged: { enabled: true, order: 1 }, users: { enabled: true, order: 2 }, watchlist: { enabled: true, order: 3 } }, cloud_storage: { enabled: true }, username_highlighting: { enabled: true, fuzzy: true }, wikipedia_popups: { enabled: true }, auto_welcome: { enabled: false }, expiry: { watchlist: "1 week", whitelist: { users: "indefinite", pages: "indefinite", tags: "indefinite" }, highlight: { users: "1 week", pages: "1 week", tags: "1 week" } }, auto_report: { enabled: true, for: [ "Vandalism", "Subtle vandalism", "Image vandalism", "Sandbox", "Deliberate errors", "Disruptive editing", "Editing tests", "Commentary", "Inappropriate jokes", "Deleting", "Unsourced", "Unsourced (BLP)", "Unsourced genre", "Original research", /* "POV", */ "Censoring", "AI-generated", "AI-generated (talk)", /* "MOS violation", */ /* "Not English", */ "Personal attacks", "Harassment", "TPO", /* "Chatting" */ /* "Owning", */ , "AfD removal", /* "Gaming the system", */ "Advertising", "Spam links", "Inappropriate edit summary", "Misleading edit summary" ] }, AI: { enabled: false, provider: "Ollama", edit_analysis: { enabled: true }, username_analysis: { enabled: true }, Ollama: { server: "http://localhost:11434", model: "" } }, audio: { ores_alert: { enabled: true, threshold: .95 }, volume: { master: 1, "master.startup": 1, "master.music": 1, "master.music.zen_mode": 1, "master.ui": 1, "master.ui.click": .05, "master.queue": 1, "master.queue.ores": 1, "master.queue.mention": 1, "master.notification": 1, "master.notification.alert": .7, "master.notification.notice": .5, "master.notification.toast": .5, "master.action": 1, "master.action.default": .6, "master.action.failed": .85, "master.action.report": 1, "master.action.block": 1, "master.action.protect": 1 } }, zen_mode: { enabled: false, sound: { enabled: true }, music: { enabled: true }, alerts: { enabled: true }, notices: { enabled: false }, toasts: { enabled: false }, badges: { enabled: false } }, repeat_control_scripts: true }, UI: { theme: { palette: 0 }, queue: { width: "15vw" }, details: { width: "15vw" } }, control_scripts: [ { keys: [ "arrowright" ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ " " ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ "q" ], actions: [ { name: "nextEdit", params: {} }, { name: "rollback", params: {} }, { name: "warn", params: { warning: "Vandalism", level: "auto" } }, { name: "if", condition: "atFinalWarning", actions: [ { name: "reportToAIV", params: { reportMessage: "Vandalism past final warning" } } ] }, { name: "highlightUser", 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: "Auto" } } ] } ], statistics: { edits_reviewed: { total: 0, thanked: 0 }, recent_changes_reviewed: { total: 0 }, pending_changes_reviewed: { total: 0, accepted: 0, rejected: 0 }, watchlist_changes_reviewed: { total: 0 }, users_reviewed: { total: 0 }, reverts_made: { total: 0, good_faith: 0, from_recent_changes: 0, from_pending_changes: 0, from_watchlist: 0, from_loaded_edits: 0 }, users_welcomed: { total: 0 }, warnings_issued: { total: 0, level_1: 0, level_2: 0, level_3: 0, level_4: 0, level_4im: 0 }, reports_filed: { total: 0, AIV: 0, UAA: 0, RFPP: 0 }, watchlist: { watched: 0, unwatched: 0 }, items_whitelisted: { total: 0, users: 0, pages: 0, tags: 0 }, items_highlighted: { total: 0, users: 0, pages: 0, tags: 0 }, blocks_issued: { total: 0 }, pages_protected: { total: 0 }, actions_executed: { total: 0, successful: 0 }, session_time: 0 }, highlight: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, whitelist: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, favorite: { warnings: [], reverts: [] } }; } static upgrade() { if (this.loadedData.version !== this.number - 1) { this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number - 1}.`); throw new Error("INVALID_UPGRADE_ATTEMPT"); } // properties without sanitization did not exist in the previous version const defaults = this.default; return { changelog: this.sanitize([ "changelog" ], defaults.changelog), settings: { performance: { startup: this.sanitize([ "settings", "performance", "startup" ], defaults.settings.performance.startup) }, namespaces: this.sanitize([ "settings", "namespaces" ], defaults.settings.namespaces), queue: { max_size: this.sanitize([ "settings", "queue", "max_size" ], defaults.settings.queue.max_size), max_edits: this.sanitize([ "settings", "queue", "max_edits" ], defaults.settings.queue.max_edits), min_ores: this.sanitize([ "settings", "queue", "min_ores" ], defaults.settings.queue.min_ores), recent: { enabled: this.sanitize([ "settings", "queue", "recent", "enabled" ], defaults.settings.queue.recent.enabled), order: this.sanitize([ "settings", "queue", "recent", "order" ], defaults.settings.queue.recent.order) }, flagged: { enabled: this.sanitize([ "settings", "queue", "flagged", "enabled" ], defaults.settings.queue.flagged.enabled), order: this.sanitize([ "settings", "queue", "flagged", "order" ], defaults.settings.queue.flagged.order) }, users: { enabled: this.sanitize([ "settings", "queue", "users", "enabled" ], defaults.settings.queue.users.enabled), order: this.sanitize([ "settings", "queue", "users", "order" ], defaults.settings.queue.users.order) }, watchlist: { enabled: this.sanitize([ "settings", "queue", "watchlist", "enabled" ], defaults.settings.queue.watchlist.enabled), order: this.sanitize([ "settings", "queue", "watchlist", "order" ], defaults.settings.queue.watchlist.order) } }, cloud_storage: { enabled: this.sanitize([ "settings", "cloud_storage", "enabled" ], defaults.settings.cloud_storage.enabled) }, username_highlighting: { enabled: this.sanitize([ "settings", "username_highlighting", "enabled" ], defaults.settings.username_highlighting.enabled), fuzzy: this.sanitize([ "settings", "username_highlighting", "fuzzy" ], defaults.settings.username_highlighting.fuzzy) }, wikipedia_popups: { enabled: defaults.settings.wikipedia_popups.enabled }, auto_welcome: { enabled: this.sanitize([ "settings", "auto_welcome", "enabled" ], defaults.settings.auto_welcome.enabled) }, expiry: { watchlist: this.sanitize([ "settings", "expiry", "watchlist" ], defaults.settings.expiry.watchlist), whitelist: { users: this.sanitize([ "settings", "expiry", "whitelist", "users" ], defaults.settings.expiry.whitelist.users), pages: this.sanitize([ "settings", "expiry", "whitelist", "pages" ], defaults.settings.expiry.whitelist.pages), tags: this.sanitize([ "settings", "expiry", "whitelist", "tags" ], defaults.settings.expiry.whitelist.tags) }, highlight: { users: this.sanitize([ "settings", "expiry", "highlight", "users" ], defaults.settings.expiry.highlight.users), pages: this.sanitize([ "settings", "expiry", "highlight", "pages" ], defaults.settings.expiry.highlight.pages), tags: this.sanitize([ "settings", "expiry", "highlight", "tags" ], defaults.settings.expiry.highlight.tags) } }, auto_report: { enabled: this.sanitize([ "settings", "auto_report", "enabled" ], defaults.settings.auto_report.enabled), for: this.sanitize([ "settings", "auto_report", "for" ], defaults.settings.auto_report.for, value => { if (!Array.isArray(value)) return undefined; const set = new Set([ "Harassment", "Inappropriate edit summary", "Original research" ]); // add some default reports value.forEach(v => { switch (v) { case "Errors": { set.add("Deliberate errors"); } return; case "Disruption": { set.add("Disruptive editing"); } return; case "Jokes": { set.add("Inappropriate jokes"); } return; } set.add(v); }); return [ ...set ]; }) }, AI: { enabled: this.sanitize([ "settings", "AI", "enabled" ], defaults.settings.AI.enabled), provider: this.sanitize([ "settings", "AI", "provider" ], defaults.settings.AI.provider), edit_analysis: { enabled: this.sanitize([ "settings", "AI", "edit_analysis", "enabled" ], defaults.settings.AI.edit_analysis.enabled) }, username_analysis: { enabled: this.sanitize([ "settings", "AI", "username_analysis", "enabled" ], defaults.settings.AI.username_analysis.enabled) }, Ollama: { server: this.sanitize([ "settings", "AI", "Ollama", "server" ], defaults.settings.AI.Ollama.server), model: this.sanitize([ "settings", "AI", "Ollama", "model" ], defaults.settings.AI.Ollama.model) } }, audio: { ores_alert: { enabled: this.sanitize([ "settings", "audio", "ores_alert", "enabled" ], defaults.settings.audio.ores_alert.enabled), threshold: this.sanitize([ "settings", "audio", "ores_alert", "threshold" ], defaults.settings.audio.ores_alert.threshold) }, volume: { master: this.sanitize([ "settings", "audio", "volume", "master" ], defaults.settings.audio.volume.master), "master.startup": this.sanitize([ "settings", "audio", "volume", "master.startup" ], defaults.settings.audio.volume["master.startup"]), "master.music": this.sanitize([ "settings", "audio", "volume", "master.music" ], defaults.settings.audio.volume["master.music"]), "master.music.zen_mode": this.sanitize([ "settings", "audio", "volume", "master.music.zen_mode" ], defaults.settings.audio.volume["master.music.zen_mode"]), "master.ui": this.sanitize([ "settings", "audio", "volume", "master.ui" ], defaults.settings.audio.volume["master.ui"]), "master.ui.click": this.sanitize([ "settings", "audio", "volume", "master.ui.click" ], defaults.settings.audio.volume["master.ui.click"]), "master.queue": this.sanitize([ "settings", "audio", "volume", "master.queue" ], defaults.settings.audio.volume["master.queue"]), "master.queue.ores": this.sanitize([ "settings", "audio", "volume", "master.queue.ores" ], defaults.settings.audio.volume["master.queue.ores"]), "master.queue.mention": this.sanitize([ "settings", "audio", "volume", "master.queue.mention" ], defaults.settings.audio.volume["master.queue.mention"]), "master.notification": this.sanitize([ "settings", "audio", "volume", "master.notification" ], defaults.settings.audio.volume["master.notification"]), "master.notification.alert": this.sanitize([ "settings", "audio", "volume", "master.notification.alert" ], defaults.settings.audio.volume["master.notification.alert"]), "master.notification.notice": this.sanitize([ "settings", "audio", "volume", "master.notification.notice" ], defaults.settings.audio.volume["master.notification.notice"]), "master.notification.toast": this.sanitize([ "settings", "audio", "volume", "master.notification.toast" ], defaults.settings.audio.volume["master.notification.toast"]), "master.action": this.sanitize([ "settings", "audio", "volume", "master.action" ], defaults.settings.audio.volume["master.action"]), "master.action.default": this.sanitize([ "settings", "audio", "volume", "master.action.default" ], defaults.settings.audio.volume["master.action.default"]), "master.action.failed": this.sanitize([ "settings", "audio", "volume", "master.action.failed" ], defaults.settings.audio.volume["master.action.failed"]), "master.action.report": this.sanitize([ "settings", "audio", "volume", "master.action.report" ], defaults.settings.audio.volume["master.action.report"]), "master.action.block": this.sanitize([ "settings", "audio", "volume", "master.action.block" ], defaults.settings.audio.volume["master.action.block"]), "master.action.protect": this.sanitize([ "settings", "audio", "volume", "master.action.protect" ], defaults.settings.audio.volume["master.action.protect"]) } }, zen_mode: { enabled: this.sanitize([ "settings", "zen_mode", "enabled" ], defaults.settings.zen_mode.enabled), sound: { enabled: this.sanitize([ "settings", "zen_mode", "sound", "enabled" ], defaults.settings.zen_mode.sound.enabled) }, music: { enabled: this.sanitize([ "settings", "zen_mode", "music", "enabled" ], defaults.settings.zen_mode.music.enabled) }, alerts: { enabled: this.sanitize([ "settings", "zen_mode", "alerts", "enabled" ], defaults.settings.zen_mode.alerts.enabled) }, notices: { enabled: this.sanitize([ "settings", "zen_mode", "notices", "enabled" ], defaults.settings.zen_mode.notices.enabled) }, toasts: { enabled: this.sanitize([ "settings", "zen_mode", "toasts", "enabled" ], defaults.settings.zen_mode.toasts.enabled) }, badges: { enabled: this.sanitize([ "settings", "zen_mode", "badges", "enabled" ], defaults.settings.zen_mode.badges.enabled) } }, repeat_control_scripts: defaults.settings.repeat_control_scripts }, UI: { theme: { palette: this.sanitize([ "UI", "theme", "palette" ], defaults.UI.theme.palette) }, queue: { width: this.sanitize([ "UI", "queue", "width" ], defaults.UI.queue.width) }, details: { width: this.sanitize([ "UI", "details", "width" ], defaults.UI.details.width) } }, control_scripts: this.sanitize([ "control_scripts" ], defaults.control_scripts, value => { if (Array.isArray(value)) { function updateActions(actions, ...path) { return actions.filter((action, index) => { index = +index; if (!(0, _utility.isObject)(action)) { return true; // malformed but don't care here } if (action.name === "if") { if (!(action.condition in _conditions.conditions)) { return true; // malformed but don't care here } if (!Array.isArray(action.actions)) { return true; // malformed but don't care here } action.actions = updateActions.call(this, action.actions, ...path, index, "actions"); } else { switch (action.name) { case "warn": { if (!(0, _utility.isObject)(action.params)) { return true; // malformed but don't care here } action.params.warning = action.params.warningType; delete action.params.warningType; } break; } } return true; }); } value.forEach((scope2, index) => { index = +index; if (!(0, _utility.isObject)(scope2)) { return; } if (!Array.isArray(scope2.keys)) { return; } if (!Array.isArray(scope2.actions)) { return; } scope2.actions = updateActions.call(this, scope2.actions, "control_scripts", index, "actions"); }); return value; } return undefined; }), statistics: { edits_reviewed: { total: this.sanitize([ "statistics", "edits_reviewed", "total" ], defaults.statistics.edits_reviewed.total), thanked: this.sanitize([ "statistics", "edits_reviewed", "thanked" ], defaults.statistics.edits_reviewed.thanked) }, recent_changes_reviewed: { total: this.sanitize([ "statistics", "recent_changes_reviewed", "total" ], defaults.statistics.recent_changes_reviewed.total) }, pending_changes_reviewed: { total: this.sanitize([ "statistics", "pending_changes_reviewed", "total" ], defaults.statistics.pending_changes_reviewed.total), accepted: this.sanitize([ "statistics", "pending_changes_reviewed", "accepted" ], defaults.statistics.pending_changes_reviewed.accepted), rejected: this.sanitize([ "statistics", "pending_changes_reviewed", "rejected" ], defaults.statistics.pending_changes_reviewed.rejected) }, watchlist_changes_reviewed: { total: this.sanitize([ "statistics", "watchlist_changes_reviewed", "total" ], defaults.statistics.watchlist_changes_reviewed.total) }, users_reviewed: { total: this.sanitize([ "statistics", "users_reviewed", "total" ], defaults.statistics.users_reviewed.total) }, reverts_made: { total: this.sanitize([ "statistics", "reverts_made", "total" ], defaults.statistics.reverts_made.total), good_faith: this.sanitize([ "statistics", "reverts_made", "good_faith" ], defaults.statistics.reverts_made.good_faith), from_recent_changes: this.sanitize([ "statistics", "reverts_made", "from_recent_changes" ], defaults.statistics.reverts_made.from_recent_changes), from_pending_changes: this.sanitize([ "statistics", "reverts_made", "from_pending_changes" ], defaults.statistics.reverts_made.from_pending_changes), from_watchlist: this.sanitize([ "statistics", "reverts_made", "from_watchlist" ], defaults.statistics.reverts_made.from_watchlist), from_loaded_edits: this.sanitize([ "statistics", "reverts_made", "from_loaded_edits" ], defaults.statistics.reverts_made.from_loaded_edits) }, users_welcomed: { total: this.sanitize([ "statistics", "users_welcomed", "total" ], defaults.statistics.users_welcomed.total) }, warnings_issued: { total: this.sanitize([ "statistics", "warnings_issued", "total" ], defaults.statistics.warnings_issued.total), level_1: this.sanitize([ "statistics", "warnings_issued", "level_1" ], defaults.statistics.warnings_issued.level_1), level_2: this.sanitize([ "statistics", "warnings_issued", "level_2" ], defaults.statistics.warnings_issued.level_2), level_3: this.sanitize([ "statistics", "warnings_issued", "level_3" ], defaults.statistics.warnings_issued.level_3), level_4: this.sanitize([ "statistics", "warnings_issued", "level_4" ], defaults.statistics.warnings_issued.level_4), level_4im: this.sanitize([ "statistics", "warnings_issued", "level_4im" ], defaults.statistics.warnings_issued.level_4im) }, reports_filed: { total: this.sanitize([ "statistics", "reports_filed", "total" ], defaults.statistics.reports_filed.total), AIV: this.sanitize([ "statistics", "reports_filed", "AIV" ], defaults.statistics.reports_filed.AIV), UAA: this.sanitize([ "statistics", "reports_filed", "UAA" ], defaults.statistics.reports_filed.UAA), RFPP: this.sanitize([ "statistics", "reports_filed", "RFPP" ], defaults.statistics.reports_filed.RFPP) }, watchlist: { watched: this.sanitize([ "statistics", "watchlist", "watched" ], defaults.statistics.watchlist.watched), unwatched: this.sanitize([ "statistics", "watchlist", "unwatched" ], defaults.statistics.watchlist.unwatched) }, items_whitelisted: { total: this.sanitize([ "statistics", "items_whitelisted", "total" ], defaults.statistics.items_whitelisted.total), users: this.sanitize([ "statistics", "items_whitelisted", "users" ], defaults.statistics.items_whitelisted.users), pages: this.sanitize([ "statistics", "items_whitelisted", "pages" ], defaults.statistics.items_whitelisted.pages), tags: this.sanitize([ "statistics", "items_whitelisted", "tags" ], defaults.statistics.items_whitelisted.tags) }, items_highlighted: { total: this.sanitize([ "statistics", "items_highlighted", "total" ], defaults.statistics.items_highlighted.total), users: this.sanitize([ "statistics", "items_highlighted", "users" ], defaults.statistics.items_highlighted.users), pages: this.sanitize([ "statistics", "items_highlighted", "pages" ], defaults.statistics.items_highlighted.pages), tags: this.sanitize([ "statistics", "items_highlighted", "tags" ], defaults.statistics.items_highlighted.tags) }, blocks_issued: { total: this.sanitize([ "statistics", "blocks_issued", "total" ], defaults.statistics.blocks_issued.total) }, pages_protected: { total: this.sanitize([ "statistics", "pages_protected", "total" ], defaults.statistics.pages_protected.total) }, actions_executed: { total: this.sanitize([ "statistics", "actions_executed", "total" ], defaults.statistics.actions_executed.total), successful: this.sanitize([ "statistics", "actions_executed", "successful" ], defaults.statistics.actions_executed.successful) }, session_time: this.sanitize([ "statistics", "session_time" ], defaults.statistics.session_time) }, highlight: { users: this.sanitize([ "highlight", "users" ], defaults.highlight.users), pages: this.sanitize([ "highlight", "pages" ], defaults.highlight.pages), tags: this.sanitize([ "highlight", "tags" ], defaults.highlight.tags) }, whitelist: { users: this.sanitize([ "whitelist", "users" ], defaults.whitelist.users), pages: this.sanitize([ "whitelist", "pages" ], defaults.whitelist.pages), tags: this.sanitize([ "whitelist", "tags" ], defaults.whitelist.tags) }, favorite: { warnings: defaults.favorite.warnings, reverts: defaults.favorite.reverts } }; } static validate() { var _this$loadedLogger$er; const root = this.loadedData; this.restrictObject(root); if (root.version !== this.number) return (_this$loadedLogger$er = void this.loadedLogger.error(`Stored data version ${root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er !== void 0 ? _this$loadedLogger$er : false; if (typeof root.changelog !== "string") this.reset("changelog"); { // root.settings const scope = root.settings; this.restrictObject(scope, "settings"); { // root.settings.performance const scope = root.settings.performance; this.restrictObject(scope, "settings", "performance"); { // root.settings.performance.startup const validValues = new Set([ "always_off", "adaptive", "always_on" ]); const value = root.settings.performance.startup; if (!validValues.has(value)) this.reset("settings", "performance", "startup"); } } { // root.settings.namespaces const value = root.settings.namespaces; if (!Array.isArray(value)) this.reset("settings", "namespaces"); root.settings.namespaces = [ ...new Set(root.settings.namespaces) ].filter(v => { const valid = _namespaces.namespaces.some(ns => ns.id === v); if (!valid) this.loadedLogger.warn(`Removing invalid namespace ID [ ${v} ] from stored data.`); return valid; }); } { // root.settings.queue const scope = root.settings.queue; this.restrictObject(scope, "settings", "queue"); { // root.settings.queue.max_size const value = root.settings.queue.max_size; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_size"); } { // root.settings.queue.max_edits const value = root.settings.queue.max_edits; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_edits"); } { // root.settings.queue.min_ores const value = root.settings.queue.min_ores; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "queue", "min_ores"); } [ "recent", "flagged", "users", "watchlist" ].forEach((section, _, queues) => { { // root.settings.queue[section] const scope = root.settings.queue[section]; this.restrictObject(scope, "settings", "queue", section); { // root.settings.queue[section].enabled const value = root.settings.queue[section].enabled; if (typeof value !== "boolean") this.reset("settings", "queue", section, "enabled"); } { // root.settings.queue[section].order const value = root.settings.queue[section].order; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value < queues.length)) this.reset("settings", "queue", section, "order"); } } }); } { // root.settings.cloud_storage const scope = root.settings.cloud_storage; this.restrictObject(scope, "settings", "cloud_storage"); { // root.settings.cloud_storage.enabled const value = root.settings.cloud_storage.enabled; if (typeof value !== "boolean") this.reset("settings", "cloud_storage", "enabled"); } } { // root.settings.username_highlighting const scope = root.settings.username_highlighting; this.restrictObject(scope, "settings", "username_highlighting"); { // root.settings.username_highlighting.enabled const value = root.settings.username_highlighting.enabled; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "enabled"); } { // root.settings.username_highlighting.fuzzy const value = root.settings.username_highlighting.fuzzy; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "fuzzy"); } } { // root.settings.wikipedia_popups const scope = root.settings.wikipedia_popups; this.restrictObject(scope, "settings", "wikipedia_popups"); { // root.settings.wikipedia_popups.enabled const value = root.settings.wikipedia_popups.enabled; if (typeof value !== "boolean") this.reset("settings", "wikipedia_popups", "enabled"); } } { // root.settings.auto_welcome const scope = root.settings.auto_welcome; this.restrictObject(scope, "settings", "auto_welcome"); { // root.settings.auto_welcome.enabled const value = root.settings.auto_welcome.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_welcome", "enabled"); } } { // root.settings.expiry const expiries = new Set([ "none", "1 hour", "1 day", "1 week", "1 month", "3 months", "6 months", "indefinite" ]); const scope = root.settings.expiry; this.restrictObject(scope, "settings", "expiry"); { // root.settings.expiry.watchlist const value = root.settings.expiry.watchlist; if (!expiries.has(value)) this.reset("settings", "expiry", "watchlist"); } { // root.settings.expiry.whitelist const scope = root.settings.expiry.whitelist; this.restrictObject(scope, "settings", "expiry", "whitelist"); { // root.settings.expiry.whitelist.users const value = root.settings.expiry.whitelist.users; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "users"); } { // root.settings.expiry.whitelist.pages const value = root.settings.expiry.whitelist.pages; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "pages"); } { // root.settings.expiry.whitelist.tags const value = root.settings.expiry.whitelist.tags; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "tags"); } } { // root.settings.expiry.highlight const scope = root.settings.expiry.highlight; this.restrictObject(scope, "settings", "expiry", "highlight"); { // root.settings.expiry.highlight.users const value = root.settings.expiry.highlight.users; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "users"); } { // root.settings.expiry.highlight.pages const value = root.settings.expiry.highlight.pages; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "pages"); } { // root.settings.expiry.highlight.tags const value = root.settings.expiry.highlight.tags; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "tags"); } } } { // root.settings.auto_report const scope = root.settings.auto_report; this.restrictObject(scope, "settings", "auto_report"); { // root.settings.auto_report.enabled const value = root.settings.auto_report.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_report", "enabled"); } { // root.settings.auto_report.for const value = root.settings.auto_report.for; if (!Array.isArray(value)) this.reset("settings", "auto_report", "for"); root.settings.auto_report.for = [ ...new Set(root.settings.auto_report.for) ].filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid auto-report reason [ ${v} ] from stored data.`); return valid; }); } } { // root.settings.AI const scope = root.settings.AI; this.restrictObject(scope, "settings", "AI"); { // root.settings.AI.enabled const value = root.settings.AI.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "enabled"); } { // root.settings.AI.provider const value = root.settings.AI.provider; if (value !== "Ollama") this.reset("settings", "AI", "provider"); } { // root.settings.AI.edit_analysis const scope = root.settings.AI.edit_analysis; this.restrictObject(scope, "settings", "AI", "edit_analysis"); { // root.settings.AI.edit_analysis.enabled const value = root.settings.AI.edit_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "edit_analysis", "enabled"); } } { // root.settings.AI.username_analysis const scope = root.settings.AI.username_analysis; this.restrictObject(scope, "settings", "AI", "username_analysis"); { // root.settings.AI.username_analysis.enabled const value = root.settings.AI.username_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "username_analysis", "enabled"); } } { // root.settings.AI.Ollama const scope = root.settings.AI.Ollama; this.restrictObject(scope, "settings", "AI", "Ollama"); { // root.settings.AI.Ollama.server const value = root.settings.AI.Ollama.server; if (!(0, _utility.isURL)(value)) this.reset("settings", "AI", "Ollama", "server"); } { // root.settings.AI.Ollama.model const value = root.settings.AI.Ollama.model; if (typeof value !== "string") this.reset("settings", "AI", "Ollama", "model"); } } } { // root.settings.audio const scope = root.settings.audio; this.restrictObject(scope, "settings", "audio"); { // root.settings.audio.ores_alert const scope = root.settings.audio.ores_alert; this.restrictObject(scope, "settings", "audio", "ores_alert"); { // root.settings.audio.ores_alert.enabled const value = root.settings.audio.ores_alert.enabled; if (typeof value !== "boolean") this.reset("settings", "audio", "ores_alert", "enabled"); } { // root.settings.audio.ores_alert.threshold const value = root.settings.audio.ores_alert.threshold; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "ores_alert", "threshold"); } } { // root.settings.audio.volume const scope = root.settings.audio.volume; this.restrictObject(scope, "settings", "audio", "volume"); const volumeKeys = [ "master", "master.startup", "master.music", "master.music.zen_mode", "master.ui", "master.ui.click", "master.queue", "master.queue.ores", "master.queue.mention", "master.notification", "master.notification.alert", "master.notification.notice", "master.notification.toast", "master.action", "master.action.default", "master.action.failed", "master.action.report", "master.action.block", "master.action.protect" ]; for (const key of volumeKeys) { const value = root.settings.audio.volume[key]; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "volume", key); } } } { // root.settings.zen_mode const scope = root.settings.zen_mode; this.restrictObject(scope, "settings", "zen_mode"); { // root.settings.zen_mode.enabled const value = scope.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "enabled"); } { // root.settings.zen_mode.sound const scope = root.settings.zen_mode.sound; this.restrictObject(scope, "settings", "zen_mode", "sound"); { // root.settings.zen_mode.sound.enabled const value = root.settings.zen_mode.sound.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "sound", "enabled"); } } { // root.settings.zen_mode.music const scope = root.settings.zen_mode.music; this.restrictObject(scope, "settings", "zen_mode", "music"); { // root.settings.zen_mode.music.enabled const value = root.settings.zen_mode.music.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "music", "enabled"); } } { // root.settings.zen_mode.alerts const scope = root.settings.zen_mode.alerts; this.restrictObject(scope, "settings", "zen_mode", "alerts"); { // root.settings.zen_mode.alerts.enabled const value = root.settings.zen_mode.alerts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "alerts", "enabled"); } } { // root.settings.zen_mode.notices const scope = root.settings.zen_mode.notices; this.restrictObject(scope, "settings", "zen_mode", "notices"); { // root.settings.zen_mode.notices.enabled const value = root.settings.zen_mode.notices.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "notices", "enabled"); } } { // root.settings.zen_mode.toasts const scope = root.settings.zen_mode.toasts; this.restrictObject(scope, "settings", "zen_mode", "toasts"); { // root.settings.zen_mode.toasts.enabled const value = root.settings.zen_mode.toasts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "toasts", "enabled"); } } { // root.settings.zen_mode.badges const scope = root.settings.zen_mode.badges; this.restrictObject(scope, "settings", "zen_mode", "badges"); { // root.settings.zen_mode.badges.enabled const value = root.settings.zen_mode.badges.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "badges", "enabled"); } } } { // root.settings.repeat_control_scripts const value = root.settings.repeat_control_scripts; if (typeof value !== "boolean") this.reset("settings", "repeat_control_scripts"); // TODO, deal with in v3, and the other option the open in new tab thing on startup } } { // root.UI const scope = root.UI; this.restrictObject(scope, "UI"); { // root.UI.theme const scope = root.UI.theme; this.restrictObject(scope, "UI", "theme"); { // root.UI.theme.palette const value = root.UI.theme.palette; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 3)) this.reset("UI", "theme", "palette"); } } { // root.UI.queue const scope = root.UI.queue; this.restrictObject(scope, "UI", "queue"); { // root.UI.queue.width const value = root.UI.queue.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "queue", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "queue", "width"); } } { // root.UI.details const scope = root.UI.details; this.restrictObject(scope, "UI", "details"); { // root.UI.details.width const value = root.UI.details.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "details", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "details", "width"); } } } { // root.control_scripts const scope = root.control_scripts; if (!Array.isArray(scope)) this.reset("control_scripts"); function sanitizeActions(actions, ...path) { return actions.filter((action, index) => { var _this$loadedLogger$wa; index = +index; if (!(0, _utility.isObject)(action)) return (_this$loadedLogger$wa = void this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa !== void 0 ? _this$loadedLogger$wa : false; if (action.name === "if") { var _this$loadedLogger$wa2; if (!(action.condition in _conditions.conditions)) return (_this$loadedLogger$wa2 = void this.loadedLogger.warn(`Removing invalid condition [ ${action.condition} ] at path [ ${[ ...path, index, "condition" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa2 !== void 0 ? _this$loadedLogger$wa2 : false; if (!Array.isArray(action.actions)) { this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[ ...path, index, "actions" ].join(" -> ")} ] in stored data.`); action.actions = []; } action.actions = sanitizeActions.call(this, action.actions, ...path, index, "actions"); } else { var _this$loadedLogger$wa3, _events$action$name$p; if (!(action.name in _events.events)) return (_this$loadedLogger$wa3 = void this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index, "name" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa3 !== void 0 ? _this$loadedLogger$wa3 : false; if (!(0, _utility.isObject)(action.params)) { this.loadedLogger.warn(`Resetting invalid params object at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params = {}; } const references = (_events$action$name$p = _events.events[action.name].parameters) !== null && _events$action$name$p !== void 0 ? _events$action$name$p : []; const validIds = new Set; for (const reference of references) { validIds.add(reference.id); if (reference.type === "choice") { if (!(reference.id in action.params)) { this.loadedLogger.warn(`Resetting missing choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = reference.options[0]; } if (!reference.options.includes(action.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = reference.options[0]; } } } for (const paramKey of Object.keys(action.params)) { if (!validIds.has(paramKey)) { this.loadedLogger.warn(`Removing invalid parameter [ ${paramKey} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] from stored data.`); delete action.params[paramKey]; } } } return true; }); } root.control_scripts = root.control_scripts.filter((scope, index) => { var _this$loadedLogger$wa4; index = +index; if (!(0, _utility.isObject)(scope)) return (_this$loadedLogger$wa4 = void this.loadedLogger.warn(`Removing invalid control script at path [ ${[ "control_scripts", index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa4 !== void 0 ? _this$loadedLogger$wa4 : false; if (!Array.isArray(scope.keys)) { this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].keys = []; } if (!Array.isArray(scope.actions)) { this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].actions = []; } root.control_scripts[index].keys = scope.keys.filter(key => _controlKeys.controls.has(key)); root.control_scripts[index].actions = sanitizeActions.call(this, scope.actions, "control_scripts", index, "actions"); return true; }); } { // root.statistics const isValidStatistic = v => typeof v === "number" && Number.isInteger(v) && v >= 0; const scope = root.statistics; this.restrictObject(scope, "statistics"); { // root.statistics.edits_reviewed const scope = root.statistics.edits_reviewed; this.restrictObject(scope, "statistics", "edits_reviewed"); { // root.statistics.edits_reviewed.total const value = root.statistics.edits_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "total"); } { // root.statistics.edits_reviewed.thanked const value = root.statistics.edits_reviewed.thanked; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "thanked"); } } { // root.statistics.recent_changes_reviewed const scope = root.statistics.recent_changes_reviewed; this.restrictObject(scope, "statistics", "recent_changes_reviewed"); { // root.statistics.recent_changes_reviewed.total const value = root.statistics.recent_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "recent_changes_reviewed", "total"); } } { // root.statistics.pending_changes_reviewed const scope = root.statistics.pending_changes_reviewed; this.restrictObject(scope, "statistics", "pending_changes_reviewed"); { // root.statistics.pending_changes_reviewed.total const value = root.statistics.pending_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "total"); } { // root.statistics.pending_changes_reviewed.accepted const value = root.statistics.pending_changes_reviewed.accepted; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "accepted"); } { // root.statistics.pending_changes_reviewed.rejected const value = root.statistics.pending_changes_reviewed.rejected; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "rejected"); } } { // root.statistics.watchlist_changes_reviewed const scope = root.statistics.watchlist_changes_reviewed; this.restrictObject(scope, "statistics", "watchlist_changes_reviewed"); { // root.statistics.watchlist_changes_reviewed.total const value = root.statistics.watchlist_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "watchlist_changes_reviewed", "total"); } } { // root.statistics.users_reviewed const scope = root.statistics.users_reviewed; this.restrictObject(scope, "statistics", "users_reviewed"); { // root.statistics.users_reviewed.total const value = root.statistics.users_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_reviewed", "total"); } } { // root.statistics.reverts_made const scope = root.statistics.reverts_made; this.restrictObject(scope, "statistics", "reverts_made"); { // root.statistics.reverts_made.total const value = root.statistics.reverts_made.total; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "total"); } { // root.statistics.reverts_made.good_faith const value = root.statistics.reverts_made.good_faith; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "good_faith"); } { // root.statistics.reverts_made.from_recent_changes const value = root.statistics.reverts_made.from_recent_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_recent_changes"); } { // root.statistics.reverts_made.from_pending_changes const value = root.statistics.reverts_made.from_pending_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_pending_changes"); } { // root.statistics.reverts_made.from_watchlist const value = root.statistics.reverts_made.from_watchlist; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_watchlist"); } { // root.statistics.reverts_made.from_loaded_edits const value = root.statistics.reverts_made.from_loaded_edits; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_loaded_edits"); } } { // root.statistics.users_welcomed const scope = root.statistics.users_welcomed; this.restrictObject(scope, "statistics", "users_welcomed"); { // root.statistics.users_welcomed.total const value = root.statistics.users_welcomed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_welcomed", "total"); } } { // root.statistics.warnings_issued const scope = root.statistics.warnings_issued; this.restrictObject(scope, "statistics", "warnings_issued"); { // root.statistics.warnings_issued.total const value = root.statistics.warnings_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "total"); } { // root.statistics.warnings_issued.level_1 const value = root.statistics.warnings_issued.level_1; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_1"); } { // root.statistics.warnings_issued.level_2 const value = root.statistics.warnings_issued.level_2; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_2"); } { // root.statistics.warnings_issued.level_3 const value = root.statistics.warnings_issued.level_3; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_3"); } { // root.statistics.warnings_issued.level_4 const value = root.statistics.warnings_issued.level_4; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4"); } { // root.statistics.warnings_issued.level_4im const value = root.statistics.warnings_issued.level_4im; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4im"); } } { // root.statistics.reports_filed const scope = root.statistics.reports_filed; this.restrictObject(scope, "statistics", "reports_filed"); { // root.statistics.reports_filed.total const value = root.statistics.reports_filed.total; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "total"); } { // root.statistics.reports_filed.AIV const value = root.statistics.reports_filed.AIV; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "AIV"); } { // root.statistics.reports_filed.UAA const value = root.statistics.reports_filed.UAA; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "UAA"); } { // root.statistics.reports_filed.RFPP const value = root.statistics.reports_filed.RFPP; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "RFPP"); } } { // root.statistics.watchlist const scope = root.statistics.watchlist; this.restrictObject(scope, "statistics", "watchlist"); { // root.statistics.watchlist.watched const value = root.statistics.watchlist.watched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "watched"); } { // root.statistics.watchlist.unwatched const value = root.statistics.watchlist.unwatched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "unwatched"); } } { // root.statistics.items_whitelisted const scope = root.statistics.items_whitelisted; this.restrictObject(scope, "statistics", "items_whitelisted"); { // root.statistics.items_whitelisted.total const value = root.statistics.items_whitelisted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "total"); } { // root.statistics.items_whitelisted.users const value = root.statistics.items_whitelisted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "users"); } { // root.statistics.items_whitelisted.pages const value = root.statistics.items_whitelisted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "pages"); } { // root.statistics.items_whitelisted.tags const value = root.statistics.items_whitelisted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "tags"); } } { // root.statistics.items_highlighted const scope = root.statistics.items_highlighted; this.restrictObject(scope, "statistics", "items_highlighted"); { // root.statistics.items_highlighted.total const value = root.statistics.items_highlighted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "total"); } { // root.statistics.items_highlighted.users const value = root.statistics.items_highlighted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "users"); } { // root.statistics.items_highlighted.pages const value = root.statistics.items_highlighted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "pages"); } { // root.statistics.items_highlighted.tags const value = root.statistics.items_highlighted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "tags"); } } { // root.statistics.blocks_issued const scope = root.statistics.blocks_issued; this.restrictObject(scope, "statistics", "blocks_issued"); { // root.statistics.blocks_issued.total const value = root.statistics.blocks_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "blocks_issued", "total"); } } { // root.statistics.pages_protected const scope = root.statistics.pages_protected; this.restrictObject(scope, "statistics", "pages_protected"); { // root.statistics.pages_protected.total const value = root.statistics.pages_protected.total; if (!isValidStatistic(value)) this.reset("statistics", "pages_protected", "total"); } } { // root.statistics.actions_executed const scope = root.statistics.actions_executed; this.restrictObject(scope, "statistics", "actions_executed"); { // root.statistics.actions_executed.total const value = root.statistics.actions_executed.total; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "total"); } { // root.statistics.actions_executed.successful const value = root.statistics.actions_executed.successful; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "successful"); } } { // root.statistics.session_time const value = root.statistics.session_time; if (!(typeof value === "number" && value >= 0)) this.reset("statistics", "session_time"); } } const isValidExpiryMap = root => { // [ username, [ timestamp, timestamp ] ] if (!(Array.isArray(root) && root.length === 2)) return false; else if (typeof root[0] !== "string") return false; { const scope = root[1]; if (!(Array.isArray(scope) && scope.length === 2)) return false; const isTimestamp = v => typeof v === "number" && Number.isInteger(v) && v >= 0; if (!(isTimestamp(scope[0]) && isTimestamp(scope[1]))) return false; } return true; }; { // root.highlight const scope = root.highlight; this.restrictObject(scope, "highlight"); { // root.highlight.users const value = root.highlight.users; if (!Array.isArray(value)) this.reset("highlight", "users"); root.highlight.users = root.highlight.users.filter(v => isValidExpiryMap(v)); } { // root.highlight.pages const value = root.highlight.pages; if (!Array.isArray(value)) this.reset("highlight", "pages"); root.highlight.pages = root.highlight.pages.filter(v => isValidExpiryMap(v)); } { // root.highlight.tags const value = root.highlight.tags; if (!Array.isArray(value)) this.reset("highlight", "tags"); root.highlight.tags = root.highlight.tags.filter(v => isValidExpiryMap(v)); } } { // root.whitelist const scope = root.whitelist; this.restrictObject(scope, "whitelist"); { // root.whitelist.users const value = root.whitelist.users; if (!Array.isArray(value)) this.reset("whitelist", "users"); root.whitelist.users = root.whitelist.users.filter(v => isValidExpiryMap(v)); } { // root.whitelist.pages const value = root.whitelist.pages; if (!Array.isArray(value)) this.reset("whitelist", "pages"); root.whitelist.pages = root.whitelist.pages.filter(v => isValidExpiryMap(v)); } { // root.whitelist.tags const value = root.whitelist.tags; if (!Array.isArray(value)) this.reset("whitelist", "tags"); root.whitelist.tags = root.whitelist.tags.filter(v => isValidExpiryMap(v)); } } { // root.favorite const scope = root.favorite; this.restrictObject(scope, "favorite"); { // root.favorite.warnings const value = root.favorite.warnings; if (!Array.isArray(value)) this.reset("favorite", "warnings"); root.favorite.warnings = root.favorite.warnings.filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid favorite warning [ ${v} ] from stored data.`); return valid; }); } { // root.favorite.reverts const value = root.favorite.reverts; if (!Array.isArray(value)) this.reset("favorite", "reverts"); root.favorite.reverts = root.favorite.reverts.filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid favorite revert [ ${v} ] from stored data.`); return valid; }); } } return true; } static construct() { var _this$loadedLogger$er2; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er2 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er2 !== void 0 ? _this$loadedLogger$er2 : false; root.settings.auto_report.for = new Set(root.settings.auto_report.for); root.highlight.users = new Map(root.highlight.users); root.highlight.pages = new Map(root.highlight.pages); root.highlight.tags = new Map(root.highlight.tags); root.whitelist.users = new Map(root.whitelist.users); root.whitelist.pages = new Map(root.whitelist.pages); root.whitelist.tags = new Map(root.whitelist.tags); return root; } static deconstruct() { var _this$loadedLogger$er3; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er3 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er3 !== void 0 ? _this$loadedLogger$er3 : false; root.settings.auto_report.for = [ ...root.settings.auto_report.for ]; root.highlight.users = [ ...root.highlight.users ]; root.highlight.pages = [ ...root.highlight.pages ]; root.highlight.tags = [ ...root.highlight.tags ]; root.whitelist.users = [ ...root.whitelist.users ]; root.whitelist.pages = [ ...root.whitelist.pages ]; root.whitelist.tags = [ ...root.whitelist.tags ]; const data = structuredClone(root); // stuctureClone is safe since we have to use JSON for storage anyway this.construct(); // reconstruct to restore Maps and Sets return data; } }, _defineProperty(_V, "number", 2), _V); /***/ }, /***/ 8415(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _utility = __webpack_require__(330); var _namespaces = __webpack_require__(4018); var _warnings = __webpack_require__(955); var _events = __webpack_require__(985); var _conditions = __webpack_require__(870); var _controlKeys = __webpack_require__(9808); var _helpers = __webpack_require__(3241); var _scripts = __webpack_require__(5564); var _gui = __webpack_require__(8469); var _versions = __webpack_require__(4029); var _V; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // DO NOT CHANGE THIS FILE _versions.Version.v3 = (_V = class V3 extends _versions.Version { static get default() { return { version: 3, changelog: "6", settings: { performance: { startup: "adaptive" }, namespaces: [ 0 ], queue: { max_size: 100, max_edits: 50, min_ores: 0, ores_bias: .5, recent: { enabled: true, order: 0 }, pending: { enabled: true, order: 1 }, users: { enabled: false, order: 2 }, watchlist: { enabled: true, order: 3 }, abuselog: { enabled: true, order: 4 } }, username_highlighting: { enabled: true, fuzzy: false }, wikipedia_popups: { enabled: true }, auto_welcome: { enabled: false }, talk_page_thanks_for_temporary_users: { enabled: true }, expiry: { watchlist: "1W", whitelist: { users: "infinity", pages: "infinity", tags: "infinity" }, highlight: { users: "1W", pages: "1W", tags: "1W" } }, auto_report: { enabled: true, for: [ "Vandalism", "Subtle vandalism", "Image vandalism", "Sandbox", "Deliberate errors", "Disruptive editing", "Editing tests", "Commentary", "Inappropriate jokes", "Deleting", "Unsourced", "Unsourced (BLP)", "Unsourced genre", "Original research", /* "POV", */ "Censoring", "AI-generated", "AI-generated (talk)", /* "MOS violation", */ /* "Not English", */ "Personal attacks", "Harassment", "TPO", /* "Chatting", */ /* "Owning", */ "AfD removal", /* "Gaming the system", */ "Advertising", "Spam links", "Attempt", "Inappropriate edit summary", "Misleading edit summary" ] }, AI: { enabled: false, provider: "Ollama", edit_analysis: { enabled: true }, username_analysis: { enabled: true }, Ollama: { server: "http://localhost:11434", model: "" } }, audio: { ores_alert: { enabled: true, threshold: .95 }, volume: { master: 1, "master.startup": 1, "master.music": 1, "master.music.zen_mode": 1, "master.ui": 1, "master.ui.click": .05, "master.queue": 1, "master.queue.ores": 1, "master.queue.mention": 1, "master.notification": 1, "master.notification.alert": .7, "master.notification.message": .5, "master.notification.toast": .5, "master.action": 1, "master.action.default": .6, "master.action.failed": .85, "master.action.report": 1, "master.action.block": 1, "master.action.protect": 1 } }, zen_mode: { enabled: false, sound: { enabled: true }, music: { enabled: true }, alerts: { enabled: true }, messages: { enabled: false }, toasts: { enabled: false }, badges: { enabled: false } }, accessibility: { colorblind: false, dyslexia: false, high_contrast: false, reduce_motion: false }, repeat_control_scripts: true }, UI: { theme: { app: "auto", palette: "traffic" }, queue: { width: "15vw" }, details: { width: "15vw" } }, control_scripts: [ { keys: [ "arrowright", " " ], actions: [ { name: "next-item", params: {} } ] }, { keys: [ "arrowleft" ], actions: [ { name: "previous-item", params: {} } ] }, { keys: [ "q" ], actions: [ { name: "next-item", params: {} }, { name: "revert", params: { warning: "Vandalism" } }, { name: "highlight-user", params: {} } ] }, { keys: [ "h" ], actions: [ { name: "open-page-history", params: {} } ] }, { keys: [ "c" ], actions: [ { name: "open-user-contributions", params: {} } ] }, { keys: [ "t" ], actions: [ { name: "thank-user", params: {} } ] }, { keys: [ "w" ], actions: [ { name: "welcome-user", params: {} } ] } ], statistics: { edits_reviewed: { total: 0, thanked: 0 }, recent_changes_reviewed: { total: 0 }, pending_changes_reviewed: { total: 0, accepted: 0, rejected: 0 }, watchlist_changes_reviewed: { total: 0 }, users_reviewed: { total: 0 }, abuselogs_reviewed: { total: 0 }, reverts_made: { total: 0, good_faith: 0, from_recent_changes: 0, from_pending_changes: 0, from_watchlist: 0, from_abuselogs: 0, from_loaded_edits: 0 }, users_welcomed: { total: 0 }, warnings_issued: { total: 0, level_1: 0, level_2: 0, level_3: 0, level_4: 0, level_4im: 0 }, reports_filed: { total: 0, AIV: 0, UAA: 0, RFPP: 0, global_blocks: 0, global_locks: 0 }, watchlist: { watched: 0, unwatched: 0 }, items_whitelisted: { total: 0, users: 0, pages: 0, tags: 0 }, items_highlighted: { total: 0, users: 0, pages: 0, tags: 0 }, blocks_issued: { total: 0 }, pages_protected: { total: 0 }, actions_executed: { total: 0, successful: 0 }, session_time: 0 }, highlight: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, whitelist: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, favorite: { warnings: [], reverts: [] } }; } static upgrade() { if (this.loadedData.version !== this.number - 1) { this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number - 1}.`); throw new Error("INVALID_UPGRADE_ATTEMPT"); } this.deprecated("settings", "cloud_storage"); // properties without sanitization did not exist in the previous version const defaults = this.default; return { changelog: this.sanitize([ "changelog" ], defaults.changelog), settings: { performance: { startup: this.sanitize([ "settings", "performance", "startup" ], defaults.settings.performance.startup) }, namespaces: this.sanitize([ "settings", "namespaces" ], defaults.settings.namespaces), queue: { max_size: this.sanitize([ "settings", "queue", "max_size" ], defaults.settings.queue.max_size), max_edits: this.sanitize([ "settings", "queue", "max_edits" ], defaults.settings.queue.max_edits), min_ores: this.sanitize([ "settings", "queue", "min_ores" ], defaults.settings.queue.min_ores), ores_bias: defaults.settings.queue.ores_bias, recent: { enabled: this.sanitize([ "settings", "queue", "recent", "enabled" ], defaults.settings.queue.recent.enabled), order: this.sanitize([ "settings", "queue", "recent", "order" ], defaults.settings.queue.recent.order) }, pending: { enabled: this.sanitize([ "settings", "queue", "flagged", "enabled" ], defaults.settings.queue.pending.enabled), order: this.sanitize([ "settings", "queue", "flagged", "order" ], defaults.settings.queue.pending.order) }, users: { enabled: this.sanitize([ "settings", "queue", "users", "enabled" ], defaults.settings.queue.users.enabled), order: this.sanitize([ "settings", "queue", "users", "order" ], defaults.settings.queue.users.order) }, watchlist: { enabled: this.sanitize([ "settings", "queue", "watchlist", "enabled" ], defaults.settings.queue.watchlist.enabled), order: this.sanitize([ "settings", "queue", "watchlist", "order" ], defaults.settings.queue.watchlist.order) }, abuselog: { enabled: defaults.settings.queue.abuselog.enabled, order: defaults.settings.queue.abuselog.order } }, username_highlighting: { enabled: this.sanitize([ "settings", "username_highlighting", "enabled" ], defaults.settings.username_highlighting.enabled), fuzzy: this.sanitize([ "settings", "username_highlighting", "fuzzy" ], defaults.settings.username_highlighting.fuzzy) }, wikipedia_popups: { enabled: defaults.settings.wikipedia_popups.enabled }, auto_welcome: { enabled: this.sanitize([ "settings", "auto_welcome", "enabled" ], defaults.settings.auto_welcome.enabled) }, talk_page_thanks_for_temporary_users: { enabled: defaults.settings.talk_page_thanks_for_temporary_users.enabled }, expiry: { watchlist: this.sanitize([ "settings", "expiry", "watchlist" ], defaults.settings.expiry.watchlist, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), whitelist: { users: this.sanitize([ "settings", "expiry", "whitelist", "users" ], defaults.settings.expiry.whitelist.users, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), pages: this.sanitize([ "settings", "expiry", "whitelist", "pages" ], defaults.settings.expiry.whitelist.pages, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), tags: this.sanitize([ "settings", "expiry", "whitelist", "tags" ], defaults.settings.expiry.whitelist.tags, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])) }, highlight: { users: this.sanitize([ "settings", "expiry", "highlight", "users" ], defaults.settings.expiry.highlight.users, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), pages: this.sanitize([ "settings", "expiry", "highlight", "pages" ], defaults.settings.expiry.highlight.pages, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), tags: this.sanitize([ "settings", "expiry", "highlight", "tags" ], defaults.settings.expiry.highlight.tags, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])) } }, auto_report: { enabled: this.sanitize([ "settings", "auto_report", "enabled" ], defaults.settings.auto_report.enabled), for: this.sanitize([ "settings", "auto_report", "for" ], defaults.settings.auto_report.for, value => { if (!Array.isArray(value)) return undefined; const set = new Set([ "Attempt" ]); // add some default reports value.forEach(v => set.add(v)); return [ ...set ]; }) }, AI: { enabled: this.sanitize([ "settings", "AI", "enabled" ], defaults.settings.AI.enabled), provider: this.sanitize([ "settings", "AI", "provider" ], defaults.settings.AI.provider), edit_analysis: { enabled: this.sanitize([ "settings", "AI", "edit_analysis", "enabled" ], defaults.settings.AI.edit_analysis.enabled) }, username_analysis: { enabled: this.sanitize([ "settings", "AI", "username_analysis", "enabled" ], defaults.settings.AI.username_analysis.enabled) }, Ollama: { server: this.sanitize([ "settings", "AI", "Ollama", "server" ], defaults.settings.AI.Ollama.server), model: this.sanitize([ "settings", "AI", "Ollama", "model" ], defaults.settings.AI.Ollama.model) } }, audio: { ores_alert: { enabled: this.sanitize([ "settings", "audio", "ores_alert", "enabled" ], defaults.settings.audio.ores_alert.enabled), threshold: this.sanitize([ "settings", "audio", "ores_alert", "threshold" ], defaults.settings.audio.ores_alert.threshold) }, volume: { master: this.sanitize([ "settings", "audio", "volume", "master" ], defaults.settings.audio.volume.master), "master.startup": this.sanitize([ "settings", "audio", "volume", "master.startup" ], defaults.settings.audio.volume["master.startup"]), "master.music": this.sanitize([ "settings", "audio", "volume", "master.music" ], defaults.settings.audio.volume["master.music"]), "master.music.zen_mode": this.sanitize([ "settings", "audio", "volume", "master.music.zen_mode" ], defaults.settings.audio.volume["master.music.zen_mode"]), "master.ui": this.sanitize([ "settings", "audio", "volume", "master.ui" ], defaults.settings.audio.volume["master.ui"]), "master.ui.click": this.sanitize([ "settings", "audio", "volume", "master.ui.click" ], defaults.settings.audio.volume["master.ui.click"]), "master.queue": this.sanitize([ "settings", "audio", "volume", "master.queue" ], defaults.settings.audio.volume["master.queue"]), "master.queue.ores": this.sanitize([ "settings", "audio", "volume", "master.queue.ores" ], defaults.settings.audio.volume["master.queue.ores"]), "master.queue.mention": this.sanitize([ "settings", "audio", "volume", "master.queue.mention" ], defaults.settings.audio.volume["master.queue.mention"]), "master.notification": this.sanitize([ "settings", "audio", "volume", "master.notification" ], defaults.settings.audio.volume["master.notification"]), "master.notification.alert": this.sanitize([ "settings", "audio", "volume", "master.notification.alert" ], defaults.settings.audio.volume["master.notification.alert"]), "master.notification.message": this.sanitize([ "settings", "audio", "volume", "master.notification.notice" ], defaults.settings.audio.volume["master.notification.message"]), "master.notification.toast": this.sanitize([ "settings", "audio", "volume", "master.notification.toast" ], defaults.settings.audio.volume["master.notification.toast"]), "master.action": this.sanitize([ "settings", "audio", "volume", "master.action" ], defaults.settings.audio.volume["master.action"]), "master.action.default": this.sanitize([ "settings", "audio", "volume", "master.action.default" ], defaults.settings.audio.volume["master.action.default"]), "master.action.failed": this.sanitize([ "settings", "audio", "volume", "master.action.failed" ], defaults.settings.audio.volume["master.action.failed"]), "master.action.report": this.sanitize([ "settings", "audio", "volume", "master.action.report" ], defaults.settings.audio.volume["master.action.report"]), "master.action.block": this.sanitize([ "settings", "audio", "volume", "master.action.block" ], defaults.settings.audio.volume["master.action.block"]), "master.action.protect": this.sanitize([ "settings", "audio", "volume", "master.action.protect" ], defaults.settings.audio.volume["master.action.protect"]) } }, zen_mode: { enabled: this.sanitize([ "settings", "zen_mode", "enabled" ], defaults.settings.zen_mode.enabled), sound: { enabled: this.sanitize([ "settings", "zen_mode", "sound", "enabled" ], defaults.settings.zen_mode.sound.enabled) }, music: { enabled: this.sanitize([ "settings", "zen_mode", "music", "enabled" ], defaults.settings.zen_mode.music.enabled) }, alerts: { enabled: this.sanitize([ "settings", "zen_mode", "alerts", "enabled" ], defaults.settings.zen_mode.alerts.enabled) }, messages: { enabled: this.sanitize([ "settings", "zen_mode", "notices", "enabled" ], defaults.settings.zen_mode.messages.enabled) }, toasts: { enabled: this.sanitize([ "settings", "zen_mode", "toasts", "enabled" ], defaults.settings.zen_mode.toasts.enabled) }, badges: { enabled: this.sanitize([ "settings", "zen_mode", "badges", "enabled" ], defaults.settings.zen_mode.badges.enabled) } }, accessibility: { colorblind: defaults.settings.accessibility.colorblind, dyslexia: defaults.settings.accessibility.dyslexia, high_contrast: defaults.settings.accessibility.high_contrast, reduce_motion: defaults.settings.accessibility.reduce_motion }, repeat_control_scripts: this.sanitize([ "settings", "repeat_control_scripts" ], defaults.settings.repeat_control_scripts) }, UI: { theme: { app: defaults.UI.theme.app, palette: this.sanitize([ "UI", "theme", "palette" ], defaults.UI.theme.palette, value => [ "traffic", "heat", "natural", "cool" ][value] || defaults.UI.theme.palette) }, queue: { width: this.sanitize([ "UI", "queue", "width" ], defaults.UI.queue.width) }, details: { width: this.sanitize([ "UI", "details", "width" ], defaults.UI.details.width) } }, control_scripts: this.sanitize([ "control_scripts" ], defaults.control_scripts, value => { if (Array.isArray(value)) { function updateActions(actions, ...path) { return actions.filter((action, index) => { index = +index; if (!(0, _utility.isObject)(action)) return true; // malformed but don't care here if (action.name === "if" || action.name === "if not") { var _action$condition, _action$condition$par; const not = action.name === "if not"; const swap = () => action.name = not ? "if" : "if not"; if (typeof action.condition === "string") action.condition = { name: action.condition, params: {} }; (_action$condition$par = (_action$condition = action.condition).params) !== null && _action$condition$par !== void 0 ? _action$condition$par : _action$condition.params = {}; switch (action.condition.name) { case "operatorNonAdmin": { swap(); } case "operatorAdmin": { action.condition.name = "account-admin"; } break; case "userIsHighlighted": { action.condition.name = "username-highlighted"; } break; case "userIsWhitelisted": { action.condition.name = "username-whitelisted"; } break; case "pageIsWhitelisted": { action.condition.name = "page-whitelisted"; } break; case "userIsAnon": { swap(); } case "userIsRegistered": { action.codition.name = "user-registered"; } break; case "userIsIP": { action.condition.name = "user-ip"; } break; case "userIsTemp": { action.condition.name = "user-temp"; } break; case "userHasEmptyTalkPage": { action.condition.name = "user-empty-talk"; } break; case "editIsMajor": { swap(); } case "editIsMinor": { action.condition.name = "edit-minor"; } break; case "editSizeNegative": { action.condition.name = "edit-size"; action.condition.params = { condition: "<", size: 0 }; } break; case "editSizePositive": { action.condition.name = "edit-size"; action.condition.params = { condition: ">", size: 0 }; } break; case "editSizeLarge": { action.condition.name = "abs-edit-size"; action.condition.params = { condition: "≥", size: 1e3 }; } break; case "userEditCountLow": { action.condition.name = "user-edit-count"; action.condition.params = { condition: "<", count: 10 }; } break; case "userEditCountHigh": { action.condition.name = "user-edit-count"; action.condition.params = { condition: "≥", count: 100 }; } break; case "atFinalWarning": { action.condition.name = "user-final-warning"; } break; case "userNoWarnings": { swap(); } case "userHasWarnings": { action.condition.name = "user-has-warnings"; } break; } if (!(action.condition.name in _conditions.conditions)) return true; // malformed but don't care here if (!Array.isArray(action.actions)) return true; // malformed but don't care here action.actions = updateActions.call(this, action.actions, ...path, index, "actions"); } else { var _action$params; (_action$params = action.params) !== null && _action$params !== void 0 ? _action$params : action.params = {}; switch (action.name) { case "toggleZenMode": { action.name = "toggle-zen-mode"; } break; case "acceptFlaggedEdit": { action.name = "accept-pending-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.summary = action.params.reason; delete action.params.reason; } break; case "rejectFlaggedEdit": { action.name = "reject-pending-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.summary = action.params.reason; delete action.params.reason; } break; case "prevEdit": { action.name = "previous-item"; } break; case "nextEdit": { action.name = "next-item"; } break; case "deleteQueue": { action.name = "clear-queue"; } break; case "openRevertMenu": { action.name = "open-revert-menu"; } break; case "openWarnMenu": { action.name = "open-warn-menu"; } break; case "openUserPage": { action.name = "open-user-page"; } break; case "openUserTalk": { action.name = "open-user-talk"; } break; case "openUserContribs": { action.name = "open-user-contributions"; } break; case "openFilterLog": { action.name = "open-user-filter-log"; } break; case "openPage": { action.name = "open-page"; } break; case "openTalk": { action.name = "open-page-talk"; } break; case "openHistory": { action.name = "open-page-history"; } break; case "openRevision": { action.name = "open-revision"; } break; case "openDiff": { action.name = "open-diff"; } break; case "switchToRecentQueue": { action.name = "switch-to-recent-queue"; } break; case "switchToFlaggedQueue": { action.name = "switch-to-pending-queue"; } break; case "switchToUsersQueue": { action.name = "switch-to-users-queue"; } break; case "switchToWatchlistQueue": { action.name = "switch-to-watchlist-queue"; } break; case "watchPage": { action.name = "watch-page"; } break; case "unwatchPage": { action.name = "unwatch-page"; } break; case "whitelistUser": { action.name = "whitelist-user"; } break; case "whitelistPage": { action.name = "whitelist-page"; } break; case "unwhitelistUser": { action.name = "unwhitelist-user"; } break; case "unwhitelistPage": { action.name = "unwhitelist-page"; } break; case "highlightUser": { action.name = "highlight-user"; } break; case "highlightPage": { action.name = "highlight-page"; } break; case "unwhitelistUser": { action.name = "unhighlight-user"; } break; case "unwhitelistPage": { action.name = "unhighlight-page"; } break; case "thankUser": { action.name = "thank-user"; } break; case "warn": { action.name = "warn-user"; } break; case "rollback": { action.name = "rollback-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.hide_username = "No"; } break; case "rollbackGoodFaith": { action.name = "rollback-goodfaith-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.hide_username = "No"; } break; case "undo": { action.name = "undo-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.hide_username = "No"; } break; case "reportToAIV": { action.name = "report-user-to-aiv"; if (!(0, _utility.isObject)(action.params)) return true; action.params.reason = action.params.reportMessage; delete action.params.reportMessage; action.params.summary = action.params.comment; delete action.params.comment; } break; case "reportToUAA": { action.name = "report-user-to-uaa"; if (!(0, _utility.isObject)(action.params)) return true; action.params.reason = action.params.reportMessage; delete action.params.reportMessage; action.params.summary = action.params.comment; delete action.params.comment; } break; case "requestProtection": { action.name = "request-page-protection"; if (!(0, _utility.isObject)(action.params)) return true; action.params.summary = action.params.comment; delete action.params.comment; } break; case "welcome": { action.name = "welcome-user"; } break; case "toggleConsecutive": { action.name = "toggle-consecutive-edits"; } break; case "block": { this.loadedLogger.warn(`Skipping deprecated action 'block' in control script at ${[ ...path, index ].join(" -> ")}.`); return false; // removed } // removed by dead control flow case "protect": { this.loadedLogger.warn(`Skipping deprecated action 'protect' in control script at ${[ ...path, index ].join(" -> ")}.`); return false; // removed } // removed by dead control flow case "openSettings": { this.loadedLogger.warn(`Skipping deprecated action 'openSettings' in control script at ${[ ...path, index ].join(" -> ")}.`); return false; // removed } } } return true; }); } value.forEach((scope2, index) => { index = +index; if (!(0, _utility.isObject)(scope2)) return; if (!Array.isArray(scope2.keys)) return; if (!Array.isArray(scope2.actions)) return; scope2.actions = updateActions.call(this, scope2.actions, "control_scripts", index, "actions"); }); return value; } return undefined; }), statistics: { edits_reviewed: { total: this.sanitize([ "statistics", "edits_reviewed", "total" ], defaults.statistics.edits_reviewed.total), thanked: this.sanitize([ "statistics", "edits_reviewed", "thanked" ], defaults.statistics.edits_reviewed.thanked) }, recent_changes_reviewed: { total: this.sanitize([ "statistics", "recent_changes_reviewed", "total" ], defaults.statistics.recent_changes_reviewed.total) }, pending_changes_reviewed: { total: this.sanitize([ "statistics", "pending_changes_reviewed", "total" ], defaults.statistics.pending_changes_reviewed.total), accepted: this.sanitize([ "statistics", "pending_changes_reviewed", "accepted" ], defaults.statistics.pending_changes_reviewed.accepted), rejected: this.sanitize([ "statistics", "pending_changes_reviewed", "rejected" ], defaults.statistics.pending_changes_reviewed.rejected) }, watchlist_changes_reviewed: { total: this.sanitize([ "statistics", "watchlist_changes_reviewed", "total" ], defaults.statistics.watchlist_changes_reviewed.total) }, users_reviewed: { total: this.sanitize([ "statistics", "users_reviewed", "total" ], defaults.statistics.users_reviewed.total) }, abuselogs_reviewed: { total: defaults.statistics.abuselogs_reviewed.total }, reverts_made: { total: this.sanitize([ "statistics", "reverts_made", "total" ], defaults.statistics.reverts_made.total), good_faith: this.sanitize([ "statistics", "reverts_made", "good_faith" ], defaults.statistics.reverts_made.good_faith), from_recent_changes: this.sanitize([ "statistics", "reverts_made", "from_recent_changes" ], defaults.statistics.reverts_made.from_recent_changes), from_pending_changes: this.sanitize([ "statistics", "reverts_made", "from_pending_changes" ], defaults.statistics.reverts_made.from_pending_changes), from_watchlist: this.sanitize([ "statistics", "reverts_made", "from_watchlist" ], defaults.statistics.reverts_made.from_watchlist), from_abuselogs: defaults.statistics.reverts_made.from_abuselogs, from_loaded_edits: this.sanitize([ "statistics", "reverts_made", "from_loaded_edits" ], defaults.statistics.reverts_made.from_loaded_edits) }, users_welcomed: { total: this.sanitize([ "statistics", "users_welcomed", "total" ], defaults.statistics.users_welcomed.total) }, warnings_issued: { total: this.sanitize([ "statistics", "warnings_issued", "total" ], defaults.statistics.warnings_issued.total), level_1: this.sanitize([ "statistics", "warnings_issued", "level_1" ], defaults.statistics.warnings_issued.level_1), level_2: this.sanitize([ "statistics", "warnings_issued", "level_2" ], defaults.statistics.warnings_issued.level_2), level_3: this.sanitize([ "statistics", "warnings_issued", "level_3" ], defaults.statistics.warnings_issued.level_3), level_4: this.sanitize([ "statistics", "warnings_issued", "level_4" ], defaults.statistics.warnings_issued.level_4), level_4im: this.sanitize([ "statistics", "warnings_issued", "level_4im" ], defaults.statistics.warnings_issued.level_4im) }, reports_filed: { total: this.sanitize([ "statistics", "reports_filed", "total" ], defaults.statistics.reports_filed.total), AIV: this.sanitize([ "statistics", "reports_filed", "AIV" ], defaults.statistics.reports_filed.AIV), UAA: this.sanitize([ "statistics", "reports_filed", "UAA" ], defaults.statistics.reports_filed.UAA), RFPP: this.sanitize([ "statistics", "reports_filed", "RFPP" ], defaults.statistics.reports_filed.RFPP), global_blocks: defaults.statistics.reports_filed.global_blocks, global_locks: defaults.statistics.reports_filed.global_locks }, watchlist: { watched: this.sanitize([ "statistics", "watchlist", "watched" ], defaults.statistics.watchlist.watched), unwatched: this.sanitize([ "statistics", "watchlist", "unwatched" ], defaults.statistics.watchlist.unwatched) }, items_whitelisted: { total: this.sanitize([ "statistics", "items_whitelisted", "total" ], defaults.statistics.items_whitelisted.total), users: this.sanitize([ "statistics", "items_whitelisted", "users" ], defaults.statistics.items_whitelisted.users), pages: this.sanitize([ "statistics", "items_whitelisted", "pages" ], defaults.statistics.items_whitelisted.pages), tags: this.sanitize([ "statistics", "items_whitelisted", "tags" ], defaults.statistics.items_whitelisted.tags) }, items_highlighted: { total: this.sanitize([ "statistics", "items_highlighted", "total" ], defaults.statistics.items_highlighted.total), users: this.sanitize([ "statistics", "items_highlighted", "users" ], defaults.statistics.items_highlighted.users), pages: this.sanitize([ "statistics", "items_highlighted", "pages" ], defaults.statistics.items_highlighted.pages), tags: this.sanitize([ "statistics", "items_highlighted", "tags" ], defaults.statistics.items_highlighted.tags) }, blocks_issued: { total: this.sanitize([ "statistics", "blocks_issued", "total" ], defaults.statistics.blocks_issued.total) }, pages_protected: { total: this.sanitize([ "statistics", "pages_protected", "total" ], defaults.statistics.pages_protected.total) }, actions_executed: { total: this.sanitize([ "statistics", "actions_executed", "total" ], defaults.statistics.actions_executed.total), successful: this.sanitize([ "statistics", "actions_executed", "successful" ], defaults.statistics.actions_executed.successful) }, session_time: this.sanitize([ "statistics", "session_time" ], defaults.statistics.session_time) }, highlight: { users: this.sanitize([ "highlight", "users" ], defaults.highlight.users), pages: this.sanitize([ "highlight", "pages" ], defaults.highlight.pages), tags: this.sanitize([ "highlight", "tags" ], defaults.highlight.tags) }, whitelist: { users: this.sanitize([ "whitelist", "users" ], defaults.whitelist.users), pages: this.sanitize([ "whitelist", "pages" ], defaults.whitelist.pages), tags: this.sanitize([ "whitelist", "tags" ], defaults.whitelist.tags) }, favorite: { warnings: this.sanitize([ "favorite", "warnings" ], defaults.favorite.warnings), reverts: this.sanitize([ "favorite", "reverts" ], defaults.favorite.reverts) } }; } static validate() { var _this$loadedLogger$er; const root = this.loadedData; this.restrictObject(root); if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er !== void 0 ? _this$loadedLogger$er : false; if (typeof root.changelog !== "string") this.reset("changelog"); { // root.settings const scope = root.settings; this.restrictObject(scope, "settings"); { // root.settings.performance const scope = root.settings.performance; this.restrictObject(scope, "settings", "performance"); { // root.settings.performance.startup const validValues = new Set([ "always_off", "adaptive", "always_on" ]); const value = root.settings.performance.startup; if (!validValues.has(value)) this.reset("settings", "performance", "startup"); } } { // root.settings.namespaces const value = root.settings.namespaces; if (!Array.isArray(value)) this.reset("settings", "namespaces"); root.settings.namespaces = [ ...new Set(root.settings.namespaces) ].filter(v => { const valid = _namespaces.namespaces.some(ns => ns.id === v); if (!valid) this.loadedLogger.warn(`Removing invalid namespace ID [ ${v} ] from stored data.`); return valid; }); } { // root.settings.queue const scope = root.settings.queue; this.restrictObject(scope, "settings", "queue"); { // root.settings.queue.max_size const value = root.settings.queue.max_size; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_size"); } { // root.settings.queue.max_edits const value = root.settings.queue.max_edits; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_edits"); } { // root.settings.queue.min_ores const value = root.settings.queue.min_ores; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "queue", "min_ores"); } { // root.settings.queue.ores_bias const value = root.settings.queue.ores_bias; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "queue", "ores_bias"); } [ "recent", "pending", "users", "watchlist", "abuselog" ].forEach((section, _, queues) => { { // root.settings.queue[section] const scope = root.settings.queue[section]; this.restrictObject(scope, "settings", "queue", section); { // root.settings.queue[section].enabled const value = root.settings.queue[section].enabled; if (typeof value !== "boolean") this.reset("settings", "queue", section, "enabled"); } { // root.settings.queue[section].order const value = root.settings.queue[section].order; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value < queues.length)) this.reset("settings", "queue", section, "order"); } } }); } { // root.settings.username_highlighting const scope = root.settings.username_highlighting; this.restrictObject(scope, "settings", "username_highlighting"); { // root.settings.username_highlighting.enabled const value = root.settings.username_highlighting.enabled; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "enabled"); } { // root.settings.username_highlighting.fuzzy const value = root.settings.username_highlighting.fuzzy; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "fuzzy"); } } { // root.settings.wikipedia_popups const scope = root.settings.wikipedia_popups; this.restrictObject(scope, "settings", "wikipedia_popups"); { // root.settings.wikipedia_popups.enabled const value = root.settings.wikipedia_popups.enabled; if (typeof value !== "boolean") this.reset("settings", "wikipedia_popups", "enabled"); } } { // root.settings.auto_welcome const scope = root.settings.auto_welcome; this.restrictObject(scope, "settings", "auto_welcome"); { // root.settings.auto_welcome.enabled const value = root.settings.auto_welcome.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_welcome", "enabled"); } } { // root.settings.talk_page_thanks_for_temporary_users const scope = root.settings.talk_page_thanks_for_temporary_users; this.restrictObject(scope, "settings", "talk_page_thanks_for_temporary_users"); { // root.settings.talk_page_thanks_for_temporary_users.enabled const value = root.settings.talk_page_thanks_for_temporary_users.enabled; if (typeof value !== "boolean") this.reset("settings", "talk_page_thanks_for_temporary_users", "enabled"); } } { // root.settings.expiry const scope = root.settings.expiry; this.restrictObject(scope, "settings", "expiry"); { // root.settings.expiry.watchlist const value = root.settings.expiry.watchlist; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "watchlist"); } { // root.settings.expiry.whitelist const scope = root.settings.expiry.whitelist; this.restrictObject(scope, "settings", "expiry", "whitelist"); { // root.settings.expiry.whitelist.users const value = root.settings.expiry.whitelist.users; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "whitelist", "users"); } { // root.settings.expiry.whitelist.pages const value = root.settings.expiry.whitelist.pages; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "whitelist", "pages"); } { // root.settings.expiry.whitelist.tags const value = root.settings.expiry.whitelist.tags; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "whitelist", "tags"); } } { // root.settings.expiry.highlight const scope = root.settings.expiry.highlight; this.restrictObject(scope, "settings", "expiry", "highlight"); { // root.settings.expiry.highlight.users const value = root.settings.expiry.highlight.users; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "highlight", "users"); } { // root.settings.expiry.highlight.pages const value = root.settings.expiry.highlight.pages; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "highlight", "pages"); } { // root.settings.expiry.highlight.tags const value = root.settings.expiry.highlight.tags; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "highlight", "tags"); } } } { // root.settings.auto_report const scope = root.settings.auto_report; this.restrictObject(scope, "settings", "auto_report"); { // root.settings.auto_report.enabled const value = root.settings.auto_report.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_report", "enabled"); } { // root.settings.auto_report.for const value = root.settings.auto_report.for; if (!Array.isArray(value)) this.reset("settings", "auto_report", "for"); root.settings.auto_report.for = [ ...new Set(root.settings.auto_report.for) ].filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid auto-report reason [ ${v} ] from stored data.`); return valid; }); } } { // root.settings.AI const scope = root.settings.AI; this.restrictObject(scope, "settings", "AI"); { // root.settings.AI.enabled const value = root.settings.AI.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "enabled"); } { // root.settings.AI.provider const value = root.settings.AI.provider; if (value !== "Ollama") this.reset("settings", "AI", "provider"); } { // root.settings.AI.edit_analysis const scope = root.settings.AI.edit_analysis; this.restrictObject(scope, "settings", "AI", "edit_analysis"); { // root.settings.AI.edit_analysis.enabled const value = root.settings.AI.edit_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "edit_analysis", "enabled"); } } { // root.settings.AI.username_analysis const scope = root.settings.AI.username_analysis; this.restrictObject(scope, "settings", "AI", "username_analysis"); { // root.settings.AI.username_analysis.enabled const value = root.settings.AI.username_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "username_analysis", "enabled"); } } { // root.settings.AI.Ollama const scope = root.settings.AI.Ollama; this.restrictObject(scope, "settings", "AI", "Ollama"); { // root.settings.AI.Ollama.server const value = root.settings.AI.Ollama.server; if (!(0, _utility.isURL)(value)) this.reset("settings", "AI", "Ollama", "server"); } { // root.settings.AI.Ollama.model const value = root.settings.AI.Ollama.model; if (typeof value !== "string") this.reset("settings", "AI", "Ollama", "model"); } } } { // root.settings.audio const scope = root.settings.audio; this.restrictObject(scope, "settings", "audio"); { // root.settings.audio.ores_alert const scope = root.settings.audio.ores_alert; this.restrictObject(scope, "settings", "audio", "ores_alert"); { // root.settings.audio.ores_alert.enabled const value = root.settings.audio.ores_alert.enabled; if (typeof value !== "boolean") this.reset("settings", "audio", "ores_alert", "enabled"); } { // root.settings.audio.ores_alert.threshold const value = root.settings.audio.ores_alert.threshold; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "ores_alert", "threshold"); } } { // root.settings.audio.volume const scope = root.settings.audio.volume; this.restrictObject(scope, "settings", "audio", "volume"); const volumeKeys = [ "master", "master.startup", "master.music", "master.music.zen_mode", "master.ui", "master.ui.click", "master.queue", "master.queue.ores", "master.queue.mention", "master.notification", "master.notification.alert", "master.notification.message", "master.notification.toast", "master.action", "master.action.default", "master.action.failed", "master.action.report", "master.action.block", "master.action.protect" ]; for (const key of volumeKeys) { const value = root.settings.audio.volume[key]; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "volume", key); } } } { // root.settings.zen_mode const scope = root.settings.zen_mode; this.restrictObject(scope, "settings", "zen_mode"); { // root.settings.zen_mode.enabled const value = scope.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "enabled"); } { // root.settings.zen_mode.sound const scope = root.settings.zen_mode.sound; this.restrictObject(scope, "settings", "zen_mode", "sound"); { // root.settings.zen_mode.sound.enabled const value = root.settings.zen_mode.sound.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "sound", "enabled"); } } { // root.settings.zen_mode.music const scope = root.settings.zen_mode.music; this.restrictObject(scope, "settings", "zen_mode", "music"); { // root.settings.zen_mode.music.enabled const value = root.settings.zen_mode.music.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "music", "enabled"); } } { // root.settings.zen_mode.alerts const scope = root.settings.zen_mode.alerts; this.restrictObject(scope, "settings", "zen_mode", "alerts"); { // root.settings.zen_mode.alerts.enabled const value = root.settings.zen_mode.alerts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "alerts", "enabled"); } } { // root.settings.zen_mode.messages const scope = root.settings.zen_mode.messages; this.restrictObject(scope, "settings", "zen_mode", "messages"); { // root.settings.zen_mode.messages.enabled const value = root.settings.zen_mode.messages.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "messages", "enabled"); } } { // root.settings.zen_mode.toasts const scope = root.settings.zen_mode.toasts; this.restrictObject(scope, "settings", "zen_mode", "toasts"); { // root.settings.zen_mode.toasts.enabled const value = root.settings.zen_mode.toasts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "toasts", "enabled"); } } { // root.settings.zen_mode.badges const scope = root.settings.zen_mode.badges; this.restrictObject(scope, "settings", "zen_mode", "badges"); { // root.settings.zen_mode.badges.enabled const value = root.settings.zen_mode.badges.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "badges", "enabled"); } } } { // root.settings.accessibility const scope = root.settings.accessibility; this.restrictObject(scope, "settings", "accessibility"); { // root.settings.accessibility.colorblind const value = root.settings.accessibility.colorblind; if (typeof value !== "boolean") this.reset("settings", "accessibility", "colorblind"); } { // root.settings.accessibility.dyslexia const value = root.settings.accessibility.dyslexia; if (typeof value !== "boolean") this.reset("settings", "accessibility", "dyslexia"); } { // root.settings.accessibility.high_contrast const value = root.settings.accessibility.high_contrast; if (typeof value !== "boolean") this.reset("settings", "accessibility", "high_contrast"); } { // root.settings.accessibility.reduce_motion const value = root.settings.accessibility.reduce_motion; if (typeof value !== "boolean") this.reset("settings", "accessibility", "reduce_motion"); } } { // root.settings.repeat_control_scripts const value = root.settings.repeat_control_scripts; if (typeof value !== "boolean") this.reset("settings", "repeat_control_scripts"); } } { // root.UI const scope = root.UI; this.restrictObject(scope, "UI"); { // root.UI.theme const scope = root.UI.theme; this.restrictObject(scope, "UI", "theme"); { // root.UI.theme.app const value = root.UI.theme.app; if (![ "light", "dark", "auto" ].includes(value)) this.reset("UI", "theme", "app"); } { // root.UI.theme.palette const value = root.UI.theme.palette; if (!(value in _gui.GUI.palettes)) this.reset("UI", "theme", "palette"); } } { // root.UI.queue const scope = root.UI.queue; this.restrictObject(scope, "UI", "queue"); { // root.UI.queue.width const value = root.UI.queue.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "queue", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "queue", "width"); } } { // root.UI.details const scope = root.UI.details; this.restrictObject(scope, "UI", "details"); { // root.UI.details.width const value = root.UI.details.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "details", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "details", "width"); } } } { // root.control_scripts const scope = root.control_scripts; if (!Array.isArray(scope)) this.reset("control_scripts"); function sanitizeActions(actions, ...path) { return actions.filter((action, index) => { var _this$loadedLogger$wa; index = +index; if (!(0, _utility.isObject)(action)) return (_this$loadedLogger$wa = void this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa !== void 0 ? _this$loadedLogger$wa : false; if (action.name === "if" || action.name === "if not") { var _this$loadedLogger$wa2, _conditions$condition, _conditions$condition2, _conditions$condition3; const condition = action.condition; if (!(condition.name in _conditions.conditions)) return (_this$loadedLogger$wa2 = void this.loadedLogger.warn(`Removing invalid condition [ ${condition.name} ] at path [ ${[ ...path, index, "condition" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa2 !== void 0 ? _this$loadedLogger$wa2 : false; if (!Array.isArray(action.actions)) { this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[ ...path, index, "actions" ].join(" -> ")} ] in stored data.`); action.actions = []; } const references = (0, _scripts.sortDependencies)((_conditions$condition = (_conditions$condition2 = (_conditions$condition3 = _conditions.conditions[condition.name]).parameters) === null || _conditions$condition2 === void 0 ? void 0 : _conditions$condition2.call(_conditions$condition3)) !== null && _conditions$condition !== void 0 ? _conditions$condition : []); const validIds = new Set; for (const reference of references) { const dependencies = {}; for (const dependent of (_reference$dependenci = reference.dependencies) !== null && _reference$dependenci !== void 0 ? _reference$dependenci : []) { var _reference$dependenci; dependencies[dependent] = condition.params[dependent]; } const _default = typeof reference.default === "function" ? reference.default(dependencies) : reference.default; if (!(reference.id in condition.params)) if ("default" in reference) { this.loadedLogger.warn(`Resetting missing parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } validIds.add(reference.id); if (!("default" in reference)) continue; // optional if no default value switch (reference.type) { case "choice": { const options = typeof reference.options === "function" ? reference.options(dependencies) : reference.options; if (!options.includes(condition.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } } break; case "text": { if (typeof condition.params[reference.id] !== "string") { this.loadedLogger.warn(`Resetting invalid text parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } } break; case "boolean": { if (typeof condition.params[reference.id] !== "boolean") { this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } } break; case "number": { if (!(typeof condition.params[reference.id] === "number")) { this.loadedLogger.warn(`Resetting invalid number parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } } } } for (const paramKey of Object.keys(condition.params)) if (!validIds.has(paramKey)) { this.loadedLogger.warn(`Removing invalid parameter [ ${paramKey} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] from stored data.`); delete condition.params[paramKey]; } action.actions = sanitizeActions.call(this, action.actions, ...path, index, "actions"); } else { var _this$loadedLogger$wa3, _events$action$name$p, _events$action$name$p2, _events$action$name; if (!(action.name in _events.events)) return (_this$loadedLogger$wa3 = void this.loadedLogger.warn(`Removing invalid action [ ${action.name} ] at path [ ${[ ...path, index, "name" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa3 !== void 0 ? _this$loadedLogger$wa3 : false; if (!(0, _utility.isObject)(action.params)) { this.loadedLogger.warn(`Resetting invalid params object at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params = {}; } const references = (0, _scripts.sortDependencies)((_events$action$name$p = (_events$action$name$p2 = (_events$action$name = _events.events[action.name]).parameters) === null || _events$action$name$p2 === void 0 ? void 0 : _events$action$name$p2.call(_events$action$name)) !== null && _events$action$name$p !== void 0 ? _events$action$name$p : []); const validIds = new Set; for (const reference of references) { const dependencies = {}; for (const dependent of (_reference$dependenci2 = reference.dependencies) !== null && _reference$dependenci2 !== void 0 ? _reference$dependenci2 : []) { var _reference$dependenci2; dependencies[dependent] = action.params[dependent]; } const _default = typeof reference.default === "function" ? reference.default(dependencies) : reference.default; if (!(reference.id in action.params)) if ("default" in reference) { this.loadedLogger.warn(`Resetting missing parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } validIds.add(reference.id); if (!("default" in reference)) continue; // optional if no default value switch (reference.type) { case "choice": { const options = typeof reference.options === "function" ? reference.options(dependencies) : reference.options; if (!options.includes(action.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } } break; case "text": { if (typeof action.params[reference.id] !== "string") { this.loadedLogger.warn(`Resetting invalid text parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } } break; case "boolean": { if (typeof action.params[reference.id] !== "boolean") { this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } } break; case "duration": { if (typeof action.params[reference.id] !== "string" || !_helpers.expiryRegex.test(action.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid duration parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } } break; } } for (const paramKey of Object.keys(action.params)) if (!validIds.has(paramKey)) { this.loadedLogger.warn(`Removing invalid parameter [ ${paramKey} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] from stored data.`); delete action.params[paramKey]; } } return true; }); } root.control_scripts = root.control_scripts.filter((scope, index) => { var _this$loadedLogger$wa4; index = +index; if (!(0, _utility.isObject)(scope)) return (_this$loadedLogger$wa4 = void this.loadedLogger.warn(`Removing invalid control script at path [ ${[ "control_scripts", index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa4 !== void 0 ? _this$loadedLogger$wa4 : false; if (!Array.isArray(scope.keys)) { this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].keys = []; } if (!Array.isArray(scope.actions)) { this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].actions = []; } root.control_scripts[index].keys = scope.keys.filter(key => (0, _controlKeys.validateShortcut)(key)); root.control_scripts[index].actions = sanitizeActions.call(this, scope.actions, "control_scripts", index, "actions"); return true; }); } { // root.statistics const isValidStatistic = v => typeof v === "number" && Number.isInteger(v) && v >= 0; const scope = root.statistics; this.restrictObject(scope, "statistics"); { // root.statistics.edits_reviewed const scope = root.statistics.edits_reviewed; this.restrictObject(scope, "statistics", "edits_reviewed"); { // root.statistics.edits_reviewed.total const value = root.statistics.edits_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "total"); } { // root.statistics.edits_reviewed.thanked const value = root.statistics.edits_reviewed.thanked; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "thanked"); } } { // root.statistics.recent_changes_reviewed const scope = root.statistics.recent_changes_reviewed; this.restrictObject(scope, "statistics", "recent_changes_reviewed"); { // root.statistics.recent_changes_reviewed.total const value = root.statistics.recent_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "recent_changes_reviewed", "total"); } } { // root.statistics.pending_changes_reviewed const scope = root.statistics.pending_changes_reviewed; this.restrictObject(scope, "statistics", "pending_changes_reviewed"); { // root.statistics.pending_changes_reviewed.total const value = root.statistics.pending_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "total"); } { // root.statistics.pending_changes_reviewed.accepted const value = root.statistics.pending_changes_reviewed.accepted; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "accepted"); } { // root.statistics.pending_changes_reviewed.rejected const value = root.statistics.pending_changes_reviewed.rejected; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "rejected"); } } { // root.statistics.watchlist_changes_reviewed const scope = root.statistics.watchlist_changes_reviewed; this.restrictObject(scope, "statistics", "watchlist_changes_reviewed"); { // root.statistics.watchlist_changes_reviewed.total const value = root.statistics.watchlist_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "watchlist_changes_reviewed", "total"); } } { // root.statistics.users_reviewed const scope = root.statistics.users_reviewed; this.restrictObject(scope, "statistics", "users_reviewed"); { // root.statistics.users_reviewed.total const value = root.statistics.users_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_reviewed", "total"); } } { // root.statistics.abuselogs_reviewed const scope = root.statistics.abuselogs_reviewed; this.restrictObject(scope, "statistics", "abuselogs_reviewed"); { // root.statistics.abuselogs_reviewed.total const value = root.statistics.abuselogs_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "abuselogs_reviewed", "total"); } } { // root.statistics.reverts_made const scope = root.statistics.reverts_made; this.restrictObject(scope, "statistics", "reverts_made"); { // root.statistics.reverts_made.total const value = root.statistics.reverts_made.total; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "total"); } { // root.statistics.reverts_made.good_faith const value = root.statistics.reverts_made.good_faith; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "good_faith"); } { // root.statistics.reverts_made.from_recent_changes const value = root.statistics.reverts_made.from_recent_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_recent_changes"); } { // root.statistics.reverts_made.from_pending_changes const value = root.statistics.reverts_made.from_pending_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_pending_changes"); } { // root.statistics.reverts_made.from_watchlist const value = root.statistics.reverts_made.from_watchlist; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_watchlist"); } { // root.statistics.reverts_made.from_abuselogs const value = root.statistics.reverts_made.from_abuselogs; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_abuselogs"); } { // root.statistics.reverts_made.from_loaded_edits const value = root.statistics.reverts_made.from_loaded_edits; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_loaded_edits"); } } { // root.statistics.users_welcomed const scope = root.statistics.users_welcomed; this.restrictObject(scope, "statistics", "users_welcomed"); { // root.statistics.users_welcomed.total const value = root.statistics.users_welcomed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_welcomed", "total"); } } { // root.statistics.warnings_issued const scope = root.statistics.warnings_issued; this.restrictObject(scope, "statistics", "warnings_issued"); { // root.statistics.warnings_issued.total const value = root.statistics.warnings_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "total"); } { // root.statistics.warnings_issued.level_1 const value = root.statistics.warnings_issued.level_1; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_1"); } { // root.statistics.warnings_issued.level_2 const value = root.statistics.warnings_issued.level_2; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_2"); } { // root.statistics.warnings_issued.level_3 const value = root.statistics.warnings_issued.level_3; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_3"); } { // root.statistics.warnings_issued.level_4 const value = root.statistics.warnings_issued.level_4; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4"); } { // root.statistics.warnings_issued.level_4im const value = root.statistics.warnings_issued.level_4im; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4im"); } } { // root.statistics.reports_filed const scope = root.statistics.reports_filed; this.restrictObject(scope, "statistics", "reports_filed"); { // root.statistics.reports_filed.total const value = root.statistics.reports_filed.total; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "total"); } { // root.statistics.reports_filed.AIV const value = root.statistics.reports_filed.AIV; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "AIV"); } { // root.statistics.reports_filed.UAA const value = root.statistics.reports_filed.UAA; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "UAA"); } { // root.statistics.reports_filed.RFPP const value = root.statistics.reports_filed.RFPP; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "RFPP"); } { // root.statistics.reports_filed.global_blocks const value = root.statistics.reports_filed.global_blocks; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "global_blocks"); } { // root.statistics.reports_filed.global_locks const value = root.statistics.reports_filed.global_locks; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "global_locks"); } } { // root.statistics.watchlist const scope = root.statistics.watchlist; this.restrictObject(scope, "statistics", "watchlist"); { // root.statistics.watchlist.watched const value = root.statistics.watchlist.watched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "watched"); } { // root.statistics.watchlist.unwatched const value = root.statistics.watchlist.unwatched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "unwatched"); } } { // root.statistics.items_whitelisted const scope = root.statistics.items_whitelisted; this.restrictObject(scope, "statistics", "items_whitelisted"); { // root.statistics.items_whitelisted.total const value = root.statistics.items_whitelisted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "total"); } { // root.statistics.items_whitelisted.users const value = root.statistics.items_whitelisted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "users"); } { // root.statistics.items_whitelisted.pages const value = root.statistics.items_whitelisted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "pages"); } { // root.statistics.items_whitelisted.tags const value = root.statistics.items_whitelisted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "tags"); } } { // root.statistics.items_highlighted const scope = root.statistics.items_highlighted; this.restrictObject(scope, "statistics", "items_highlighted"); { // root.statistics.items_highlighted.total const value = root.statistics.items_highlighted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "total"); } { // root.statistics.items_highlighted.users const value = root.statistics.items_highlighted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "users"); } { // root.statistics.items_highlighted.pages const value = root.statistics.items_highlighted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "pages"); } { // root.statistics.items_highlighted.tags const value = root.statistics.items_highlighted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "tags"); } } { // root.statistics.actions_executed const scope = root.statistics.actions_executed; this.restrictObject(scope, "statistics", "actions_executed"); { // root.statistics.actions_executed.total const value = root.statistics.actions_executed.total; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "total"); } { // root.statistics.actions_executed.successful const value = root.statistics.actions_executed.successful; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "successful"); } } { // root.statistics.session_time const value = root.statistics.session_time; if (!(typeof value === "number" && value >= 0)) this.reset("statistics", "session_time"); } } const isValidExpiryMap = root => { // [ username, [ timestamp, timestamp ] ] if (!(Array.isArray(root) && root.length === 2)) return false; else if (typeof root[0] !== "string") return false; { const scope = root[1]; if (!(Array.isArray(scope) && scope.length === 2)) return false; const isTimestamp = v => typeof v === "number" && Number.isInteger(v) && v >= 0; if (!(isTimestamp(scope[0]) && isTimestamp(scope[1]))) return false; } return true; }; { // root.highlight const scope = root.highlight; this.restrictObject(scope, "highlight"); { // root.highlight.users const value = root.highlight.users; if (!Array.isArray(value)) this.reset("highlight", "users"); root.highlight.users = root.highlight.users.filter(v => isValidExpiryMap(v)); } { // root.highlight.pages const value = root.highlight.pages; if (!Array.isArray(value)) this.reset("highlight", "pages"); root.highlight.pages = root.highlight.pages.filter(v => isValidExpiryMap(v)); } { // root.highlight.tags const value = root.highlight.tags; if (!Array.isArray(value)) this.reset("highlight", "tags"); root.highlight.tags = root.highlight.tags.filter(v => isValidExpiryMap(v)); } } { // root.whitelist const scope = root.whitelist; this.restrictObject(scope, "whitelist"); { // root.whitelist.users const value = root.whitelist.users; if (!Array.isArray(value)) this.reset("whitelist", "users"); root.whitelist.users = root.whitelist.users.filter(v => isValidExpiryMap(v)); } { // root.whitelist.pages const value = root.whitelist.pages; if (!Array.isArray(value)) this.reset("whitelist", "pages"); root.whitelist.pages = root.whitelist.pages.filter(v => isValidExpiryMap(v)); } { // root.whitelist.tags const value = root.whitelist.tags; if (!Array.isArray(value)) this.reset("whitelist", "tags"); root.whitelist.tags = root.whitelist.tags.filter(v => isValidExpiryMap(v)); } } { // root.favorite const scope = root.favorite; this.restrictObject(scope, "favorite"); { // root.favorite.warnings const value = root.favorite.warnings; if (!Array.isArray(value)) this.reset("favorite", "warnings"); root.favorite.warnings = root.favorite.warnings.filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid favorite warning [ ${v} ] from stored data.`); return valid; }); } { // root.favorite.reverts const value = root.favorite.reverts; if (!Array.isArray(value)) { this.reset("favorite", "reverts"); } root.favorite.reverts = root.favorite.reverts.filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid favorite revert [ ${v} ] from stored data.`); return valid; }); } } return true; } static construct() { var _this$loadedLogger$er2; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er2 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er2 !== void 0 ? _this$loadedLogger$er2 : false; root.settings.auto_report.for = new Set(root.settings.auto_report.for); root.highlight.users = new Map(root.highlight.users); root.highlight.pages = new Map(root.highlight.pages); root.highlight.tags = new Map(root.highlight.tags); root.whitelist.users = new Map(root.whitelist.users); root.whitelist.pages = new Map(root.whitelist.pages); root.whitelist.tags = new Map(root.whitelist.tags); return root; } static deconstruct() { var _this$loadedLogger$er3; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er3 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er3 !== void 0 ? _this$loadedLogger$er3 : false; root.settings.auto_report.for = [ ...root.settings.auto_report.for ]; root.highlight.users = [ ...root.highlight.users ]; root.highlight.pages = [ ...root.highlight.pages ]; root.highlight.tags = [ ...root.highlight.tags ]; root.whitelist.users = [ ...root.whitelist.users ]; root.whitelist.pages = [ ...root.whitelist.pages ]; root.whitelist.tags = [ ...root.whitelist.tags ]; const data = structuredClone(root); // stuctureClone is safe since we have to use JSON for storage anyway this.construct(); // reconstruct to restore Maps and Sets return data; } }, _defineProperty(_V, "number", 3), _V); /***/ }, /***/ 955(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.getWarningFromLookup = getWarningFromLookup; exports.warningsLookup = exports.warnings = exports.warningTemplateColors = void 0; // Warning templates and colors const warningTemplateColors = exports.warningTemplateColors = { 0: "grey", 1: "#4169e1", 2: "#ff8c00", 3: "#ff4500", 4: "#b22222", "4im": "#000000" }; const defaultAuto = { 0: "1", 1: "2", 2: "3", 3: "4", 4: "report", "4im": "report" }; const warnings = exports.warnings = { Vandalism: { title: "Vandalism", icon: "fas fa-skull-crossbones", description: "Warnings for different types of vandalism.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Vandalism", name: "vandalism", icon: "fas fa-skull-crossbones", description: "Warning for general vandalism.", summary: "vandalism", auto: defaultAuto, templates: [ { name: "1", template: "uw-vandalism1" }, { name: "2", template: "uw-vandalism2" }, { name: "3", template: "uw-vandalism3" }, { name: "4", template: "uw-vandalism4" }, { name: "4im", template: "uw-vandalism4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Subtle vandalism", name: "subtle vandalism", icon: "fas fa-user-secret", description: "Warning for subtle vandalism.", summary: "subtle vandalism", auto: defaultAuto, templates: [ { name: "1", template: "uw-subtle1" }, { name: "2", template: "uw-subtle2" }, { name: "3", template: "uw-subtle3" }, { name: "4", template: "uw-subtle4" } ] }, { reportable: true, queueType: [ "edit" ], title: "Image vandalism", name: "image vandalism", icon: "fas fa-image", description: "Warning for image vandalism.", summary: "image vandalism", auto: defaultAuto, templates: [ { name: "1", template: "uw-image1" }, { name: "2", template: "uw-image2" }, { name: "3", template: "uw-image3" }, { name: "4", template: "uw-image4" }, { name: "4im", template: "uw-image4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Sandbox", name: "[[WP:BADSAND|inappropriate]] sandbox use", icon: "fas fa-vial", description: "Warning for vandalism, libelous, or defamatory content added to sandbox", summary: "[[WP:BADSAND|inappropriate]] sandbox use", auto: defaultAuto, templates: [ { name: "1", template: "uw-sandbox1" }, { name: "2", template: "uw-sandbox2" }, { name: "3", template: "uw-sandbox3" }, { name: "4", template: "uw-sandbox4" }, { name: "4im", template: "uw-sandbox4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Deliberate errors", name: "deliberate errors", icon: "fas fa-bug", description: "Adding deliberate errors to articles.", summary: "deliberate errors", auto: defaultAuto, templates: [ { name: "1", template: "uw-error1" }, { name: "2", template: "uw-error2" }, { name: "3", template: "uw-error3" }, { name: "4", template: "uw-error4" } ] } ] }, Disruption: { title: "Disruption", icon: "fas fa-exclamation", description: "Warnings for different types of disruptive behavior.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Disruptive editing", name: "[[WP:DE|disruptive editing]]", icon: "fas fa-exclamation", description: "Default warning for making disruptive edits but may be good faith.", summary: "[[WP:DE|disruptive editing]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-disruptive1" }, { name: "2", template: "uw-disruptive2" }, { name: "3", template: "uw-disruptive3" }, { name: "4", template: "uw-generic4", generic: "''Disruptive editing. ([[WP:WikiShield|WS]])''" } ] }, { reportable: true, queueType: [ "edit" ], title: "Editing tests", name: "editing tests", icon: "fas fa-flask", description: "Making test edits on live articles.", summary: "test edits", auto: defaultAuto, templates: [ { name: "1", template: "uw-test1" }, { name: "2", template: "uw-test2" }, { name: "3", template: "uw-test3" }, { name: "4", template: "uw-generic4", generic: "''Test edits. ([[WP:WikiShield|WS]])''" } ] }, { reportable: true, queueType: [ "edit" ], title: "Commentary", name: "commentary", icon: "fas fa-comment-alt", description: "Adding opinion or commentary to articles.", summary: "commentary / talking in article", auto: defaultAuto, templates: [ { name: "1", template: "uw-talkinarticle1" }, { name: "2", template: "uw-talkinarticle2" }, { name: "3", template: "uw-talkinarticle3" }, { name: "4", template: "uw-generic4", generic: "''Adding commentary to articles. ([[WP:WikiShield|WS]])''" } ] }, { reportable: true, queueType: [ "edit" ], title: "Inappropriate jokes", name: "inappropriate humor", icon: "fas fa-grin-squint", description: "Adding inappropriate humor to an article.", summary: "inappropriate humor", auto: defaultAuto, templates: [ { name: "1", template: "uw-joke1" }, { name: "2", template: "uw-joke2" }, { name: "3", template: "uw-joke3" }, { name: "4", template: "uw-joke4" }, { name: "4im", template: "uw-joke4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Deleting", name: "unexplained deletion", icon: "fas fa-trash", description: "Used when a user does not explain deletion of part of an article.", summary: "unexplained deletion", auto: defaultAuto, templates: [ { name: "1", template: "uw-delete1" }, { name: "2", template: "uw-delete2" }, { name: "3", template: "uw-delete3" }, { name: "4", template: "uw-delete4" }, { name: "4im", template: "uw-delete4im" } ] } ] }, "Content Issues": { title: "Content Issues", icon: "fas fa-file-alt", description: "Warnings for different types of content issues.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Unsourced", name: "unsourced changes", icon: "fas fa-question", description: "Warning for unsourced content.", summary: "unsourced changes", auto: defaultAuto, templates: [ { name: "1", template: "uw-unsourced1" }, { name: "2", template: "uw-unsourced2" }, { name: "3", template: "uw-unsourced3" }, { name: "4", template: "uw-unsourced4" } ] }, { reportable: true, queueType: [ "edit" ], title: "Unsourced (BLP)", name: "unsourced [[WP:BLP|biographies of living persons']] changes", icon: "fas fa-person-circle-question", description: "Warning for unsourced BLP content.", summary: "unsourced [[WP:BLP|biographies of living persons']] changes", auto: defaultAuto, templates: [ { name: "1", template: "uw-biog1" }, { name: "2", template: "uw-biog2" }, { name: "3", template: "uw-biog3" }, { name: "4", template: "uw-biog4" }, { name: "4im", template: "uw-biog4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Unsourced genre", name: "unsourced genre changes", icon: "fas fa-music", description: "Warning for unsourced genre changes.", summary: "unsourced genre changes", auto: defaultAuto, templates: [ { name: "1", template: "uw-genre1" }, { name: "2", template: "uw-genre2" }, { name: "3", template: "uw-genre3" }, { name: "4", template: "uw-genre4" } ] }, { reportable: true, queueType: [ "edit" ], title: "Original research", name: "[[WP:OR|original research]]", icon: "fas fa-lightbulb", description: "Adding original research or synthesis.", summary: "[[WP:OR|original research]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-nor1" }, { name: "2", template: "uw-nor2" }, { name: "3", template: "uw-nor3" }, { name: "4", template: "uw-nor4" } ] }, { reportable: true, queueType: [ "edit" ], title: "POV", name: "[[WP:NPOV|non-neutral changes]]", icon: "fas fa-balance-scale-left", description: "Adding content which violates the neutral point of view policy.", summary: "[[WP:NPOV|non-neutral changes]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-npov1" }, { name: "2", template: "uw-npov2" }, { name: "3", template: "uw-npov3" }, { name: "4", template: "uw-npov4" } ] }, { reportable: true, queueType: [ "edit" ], title: "Censoring", name: "[[WP:NOTCENSORED|censoring content]]", icon: "fas fa-ban", description: "Censoring topically-relevant content.", summary: "[[WP:NOTCENSORED|censoring content]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-notcensored1" }, { name: "2", template: "uw-notcensored2" }, { name: "3", template: "uw-notcensored3" }, { name: "4", template: "uw-notcensored4" } ] }, { reportable: true, queueType: [ "edit" ], title: "AI-generated", name: "[[WP:LLM|AI-generated content]]", icon: "fas fa-robot", description: "Adding AI-generated content.", summary: "[[WP:LLM|AI-generated content]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-ai1" }, { name: "2", template: "uw-ai2" }, { name: "3", template: "uw-ai3" }, { name: "4", template: "uw-ai4" } ], show(edit) { var _edit$page; return (edit === null || edit === void 0 || (_edit$page = edit.page) === null || _edit$page === void 0 ? void 0 : _edit$page.namespace) % 2 === 0; } }, { reportable: true, queueType: [ "edit" ], title: "AI-generated (talk)", name: "[[WP:LLM|AI-generated content]] in a discussion", icon: "fas fa-robot", description: "Writing an AI-generated comment.", summary: "[[WP:LLM|AI-generated content]] in a discussion", auto: defaultAuto, templates: [ { name: "1", template: "uw-aitalk1" }, { name: "2", template: "uw-aitalk2" }, { name: "3", template: "uw-aitalk3" }, { name: "4", template: "uw-aitalk4" } ], show(edit) { var _edit$page2; return (edit === null || edit === void 0 || (_edit$page2 = edit.page) === null || _edit$page2 === void 0 ? void 0 : _edit$page2.namespace) % 2 === 1; } }, { reportable: true, queueType: [ "edit" ], title: "MOS violation", name: "[[WP:MOS|manual of style]] violation", icon: "fas fa-spell-check", description: "Not following the Manual of Style.", summary: "[[WP:MOS|manual of style]] violation", auto: defaultAuto, templates: [ { name: "1", template: "uw-mos1" }, { name: "2", template: "uw-mos2" }, { name: "3", template: "uw-mos3" }, { name: "4", template: "uw-mos4" } ] }, { reportable: false, queueType: [ "edit" ], title: "English variant", name: "[[WP:ENGVAR|different English variant]]", icon: "fas fa-globe", description: "Content added in a different English variant than the rest of the article.", summary: "[[WP:ENGVAR|different English variant]]", auto: "notice", templates: [ { name: "notice", template: "uw-engvar" } ] }, { reportable: false, queueType: [ "edit" ], title: "Not English", name: "non-English content", icon: "fas fa-language", description: "Content added in a language other than English.", summary: "non-English content", auto: "notice", templates: [ { name: "notice", template: "uw-lang-noteng" } ] } ] }, Conduct: { title: "Conduct", icon: "fas fa-user-shield", description: "Warnings for different types of conduct issues.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Personal attacks", name: "[[WP:NPA|personal attacks]]", icon: "fas fa-bomb", description: "Personal attacks towards another user.", summary: "[[WP:NPA|personal attacks]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-npa1" }, { name: "2", template: "uw-npa2" }, { name: "3", template: "uw-npa3" }, { name: "4", template: "uw-npa4" }, { name: "4im", template: "uw-npa4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Harassment", name: "[[WP:HARASS|harassment]]", icon: "fas fa-shield-alt", description: "Harassment of another user.", summary: "[[WP:HARASS|harassment]] of another user", auto: defaultAuto, templates: [ { name: "1", template: "uw-harass1" }, { name: "2", template: "uw-harass2" }, { name: "3", template: "uw-harass3" }, { name: "4", template: "uw-harass4" }, { name: "4im", template: "uw-harass4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "TPO", name: "[[WP:TPO|removing or editing]] others' posts", icon: "fas fa-hand-paper", description: "Removing or editing others' posts.", summary: "[[WP:TPO|removing or editing]] others' posts", auto: defaultAuto, templates: [ { name: "1", template: "uw-tpo1" }, { name: "2", template: "uw-tpo2" }, { name: "3", template: "uw-tpo3" }, { name: "4", template: "uw-tpo4" }, { name: "4im", template: "uw-tpo4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Chatting", name: "inappropriate use of article talk pages", icon: "fas fa-comments", description: "Using article talk pages for inappropriate discussion.", summary: "inappropriate use of article talk pages", auto: defaultAuto, templates: [ { name: "1", template: "uw-chat1" }, { name: "2", template: "uw-chat2" }, { name: "3", template: "uw-chat3" }, { name: "4", template: "uw-chat4" } ], show(edit) { var _edit$page3; return (edit === null || edit === void 0 || (_edit$page3 = edit.page) === null || _edit$page3 === void 0 ? void 0 : _edit$page3.namespace) % 2 === 1; } }, { reportable: true, queueType: [ "edit" ], title: "Owning", name: "assuming [[WP:OWN|ownership of articles]]", icon: "fas fa-user-shield", description: "Assuming ownership of articles.", summary: "assuming [[WP:OWN|ownership of articles]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-own1" }, { name: "2", template: "uw-own2" }, { name: "3", template: "uw-own3" }, { name: "4", template: "uw-own4" } ] }, { reportable: true, queueType: [ "edit" ], title: "AfD removal", name: "removing AfD templates or comments", icon: "fas fa-gavel", description: "Removing AfD templates or other users' comments from AfD discussions.", summary: "removing AfD templates or comments", auto: defaultAuto, templates: [ { name: "1", template: "uw-afd1" }, { name: "2", template: "uw-afd2" }, { name: "3", template: "uw-afd3" }, { name: "4", template: "uw-afd4" } ] }, { reportable: false, queueType: [ "edit" ], title: "Edit warring", name: "[[WP:EW|edit warring]]", icon: "fas fa-jet-fighter", description: "Engaging in edit warring.", summary: "[[WP:EW|edit warring]]", auto(edit) { var _edit$user; return +(edit === null || edit === void 0 || (_edit$user = edit.user) === null || _edit$user === void 0 ? void 0 : _edit$user.edits) < 500 ? "notice" : "warning"; }, templates: [ { name: "notice", template: "uw-ew-soft", color: "grey" }, { name: "warning", template: "uw-ew", color: "#ff4500" } ] }, { reportable: true, queueType: [ "edit" ], title: "Gaming the system", name: "[[WP:GAME|gaming the system]]", icon: "fas fa-chess-knight", description: "Attempting to game Wikipedia's policies or guidelines.", summary: "[[WP:GAME|gaming the system]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-gaming1" }, { name: "2", template: "uw-gaming2" }, { name: "3", template: "uw-gaming3" }, { name: "4", template: "uw-gaming4" }, { name: "4im", template: "uw-gaming4im" } ] } ] }, Promotional: { title: "Promotional", icon: "fas fa-bullhorn", description: "Warnings for promotional content.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Advertising", name: "[[WP:PROMO|advertising or promotion]]", icon: "fas fa-ad", description: "Adding advertising or promotional content.", summary: "[[WP:PROMO|advertising or promotion]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-advert1" }, { name: "2", template: "uw-advert2" }, { name: "3", template: "uw-advert3" }, { name: "4", template: "uw-advert4" }, { name: "4im", template: "uw-advert4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Spam links", name: "adding [[WP:ELNO|inappropriate links]]", icon: "fas fa-link", description: "Adding spam or promotional links.", summary: "adding [[WP:ELNO|inappropriate links]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-spam1" }, { name: "2", template: "uw-spam2" }, { name: "3", template: "uw-spam3" }, { name: "4", template: "uw-spam4" }, { name: "4im", template: "uw-spam4im" } ] }, { reportable: false, queueType: [ "edit" ], title: "COI Edit", name: "editing with a [[WP:COI|conflict of interest]]", icon: "fas fa-user-tie", description: "Editing with a conflict of interest.", summary: "editing with a [[WP:COI|conflict of interest]]", auto: "notice", templates: [ { name: "notice", template: "uw-coi" }, { name: "warning", template: "uw-coi-warn" }, { name: "username", template: "uw-coi-username" } ] }, { reportable: false, queueType: [ "logevent" ], title: "COI Log", name: "apparent [[WP:COI|conflict of interest]]", icon: "fas fa-user-tie", description: "Apparent conflict of interest.", summary: "apparent [[WP:COI|conflict of interest]]", auto: "username", templates: [ { name: "username", template: "uw-coi-username" } ] } ] }, "Abuse Log": { title: "Abuse Log", icon: "fas fa-shield-virus", description: "Warnings for triggering edit filters.", warnings: [ { reportable: true, queueType: [ "abuselog" ], title: "Attempt", name: "triggering an edit filter", icon: "fas fa-vial", description: "Triggering an edit filter.", auto: defaultAuto, templates: [ { name: "1", template: "uw-attempt1" }, { name: "2", template: "uw-attempt2" }, { name: "3", template: "uw-attempt3" }, { name: "4", template: "uw-attempt4" }, { name: "4im", template: "uw-attempt4im" } ], show(edit) { return !Boolean(edit === null || edit === void 0 ? void 0 : edit.revid); } } ] }, "Edit Summary": { title: "Edit Summary", icon: "fas fa-pen-alt", description: "Warnings for inappropriate edit summaries.", warnings: [ { reportable: false, queueType: [ "edit" ], title: "No edit summary", name: "no [[WP:ES|edit summary]] provided", icon: "fas fa-pen-nib", description: "Making an edit without providing an edit summary.", summary: "no [[WP:ES|edit summary]] provided", auto(edit) { var _edit$user2; return +(edit === null || edit === void 0 || (_edit$user2 = edit.user) === null || _edit$user2 === void 0 ? void 0 : _edit$user2.edits) < 500 ? "newcomer" : "experienced"; }, templates: [ { name: "notice", template: "uw-es" }, { name: "experienced", template: "uw-es2" } ] }, { reportable: true, queueType: [ "edit", "logevent", "abuselog" ], title: "Inappropriate edit summary", name: "inappropriate [[WP:ES|edit summary]]", icon: "fas fa-pen-alt", description: "Using an inappropriate edit summary.", summary: "inappropriate [[WP:ES|edit summary]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-bes1" }, { name: "2", template: "uw-bes2" }, { name: "3", template: "uw-bes3" }, { name: "4", template: "uw-bes4" }, { name: "4im", template: "uw-bes4im" } ] }, { reportable: true, queueType: [ "edit", "logevent", "abuselog" ], title: "Misleading edit summary", name: "misleading [[WP:ES|edit summary]]", icon: "fas fa-mask", description: "Using a misleading edit summary.", summary: "misleading [[WP:ES|edit summary]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-mislead1" }, { name: "2", template: "uw-mislead2" }, { name: "3", template: "uw-mislead3" }, { name: "4", template: "uw-generic4", generic: "''Misleading edit summary. ([[WP:WikiShield|WS]])''" } ] }, { reportable: false, queueType: [ "edit", "abuselog" ], title: "Minor edit abuse", name: "improper use of [[WP:ME|minor edit]] checkbox", icon: "fas fa-minus", description: "Non-minor edit marked as minor", summary: "improper use of [[WP:ME|minor edit]] checkbox", auto: "notice", templates: [ { name: "notice", template: "uw-minor" } ] } ] } }; const lookup = {}; for (const [type, category] of Object.entries(warnings)) { const len = category.warnings.length; for (let i = 0; i < len; i++) { const warning = category.warnings[i]; lookup[warning.title] = warning; } } const warningsLookup = exports.warningsLookup = lookup; function getWarningFromLookup(title) { return warningsLookup[title]; } /***/ }, /***/ 863(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.welcomes = void 0; const welcomes = exports.welcomes = { Auto: { title: "Auto", template: user => {} }, Default: { title: "Default", template: "Welcome", sign: true }, Basic: { title: "Basic", template: "W-basic", sign: false }, "Non-Latin": { title: "Non-Latin", template: "Welcome-non-latin", sign: true }, "Vandalism fighter": { title: "Vandalism fighter", template: "Welcome-vandalism fighter", sign: false }, Personal: { title: "Personal", template: "Welcome-personal", sign: true }, Cookie: { title: "Cookie", template: "Welcome cookie", sign: true }, Kitten: { title: "Kitten", template: "Welcome kitten", sign: false }, Graphical: { title: "Graphical", template: "W-graphical", sign: false }, Screen: { title: "Screen", template: "W-screen", sign: false }, Autobiography: { title: "Autobiography", template: "Welcome-auto", sign: true }, COI: { title: "COI", template: "Welcome-COI", sign: true } }; welcomes["Auto"].template = user => { if (!welcomes["Non-Latin"].hide && /[^\u0000-\u007F]/.test(user.name)) { return "Non-Latin"; } return "Default"; }; /***/ }, /***/ 4153(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _api = __webpack_require__(8878); if (window.electron === undefined) { window.isElectron = false; window.electron = { mwapiLoader: async () => { window.dispatchEvent(new CustomEvent("mwapi-loaded", { detail: { server: window.location.host, username: mw.user.getName(), pendingChangesServers: _api.MediaWikiAPI.pendingChangesServer, dev: false } })); }, mwapiLoaded: callback => window.addEventListener("mwapi-loaded", event => { const {server, username, pendingChangesServers, dev} = event.detail; callback(server, username, pendingChangesServers, dev); }), mwapi: () => Promise.reject(new Error("Not running in Electron environment")), menuEnabler: () => {}, setBadgeCount: () => {}, sendNotification: () => Promise.reject(new Error("Not running in Electron environment")), localStorage: { get: key => localStorage.getItem(key), set: (key, value) => localStorage.setItem(key, value), delete: key => localStorage.removeItem(key) }, copyToClipboard: async text => { if (navigator.clipboard && navigator.clipboard.writeText) await navigator.clipboard.writeText(text); else { const $textarea = document.createElement("textarea"); $textarea.value = text; document.body.appendChild($textarea); $textarea.select(); document.execCommand("copy"); document.body.removeChild($textarea); } return; }, log: message => console.debug(message), info: message => console.info(message), warn: message => console.warn(message), error: message => console.error(message), errorbox: (message, detail) => alert(`${message}\n\n${detail}`), closePopup: popup => popup.close(), openExternal: url => window.open(url, "_blank"), openInBrowser: async url => { const w = window.screen.availWidth * .8, h = window.screen.availHeight * .8; const x = window.screenX + (window.outerWidth - w) / 2, y = window.screenY + (window.outerHeight - h) / 2; const popup = window.open(url, "myPopup", `width=${w},height=${h},left=${x},top=${y},resizable=false,scrollbars=true,menubar=false,toolbar=false,location=false,status=false`); popup.focus(); popup.addEventListener("beforeunload", () => { if (popup.closed) window.dispatchEvent(new CustomEvent("popup-closed", { detail: popup })); }); return popup; }, onPopupClosed: callback => window.addEventListener("popup-closed", event => callback(event.detail)), onBeforeunload: () => {}, unloaded: () => {}, saveAccount: () => {}, disable: (title, message) => { alert(`${title}\n\n${message}`); location.reload(); } }; } else window.isElectron = true; document.querySelectorAll("[data-electron]").forEach($el => { if ($el.dataset.electron === "false" && window.isElectron) $el.remove(); else if ($el.dataset.electron === "true" && !window.isElectron) $el.remove(); }); /***/ }, /***/ 7411() { function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class DraggableOrderList extends HTMLElement { constructor() { super(); _defineProperty(this, "handleDragStart", (index, e) => { this.draggedIndex = index; this.placeholderIndex = index; e.dataTransfer.effectAllowed = "move"; e.dataTransfer.setData("text/plain", index); // Add a slight delay to allow the drag image to be captured requestAnimationFrame(() => { this.updateDragState(); }); }); _defineProperty(this, "handleDragOver", (index, e) => { e.preventDefault(); if (this.draggedIndex === null || index === this.placeholderIndex) return; // Reorder items in real-time const newItems = [ ...this.items ]; const draggedItem = newItems[this.draggedIndex]; // Remove from old position newItems.splice(this.draggedIndex, 1); // Insert at new position newItems.splice(index, 0, draggedItem); this.items = newItems; this.draggedIndex = index; this.placeholderIndex = index; this.render(); }); _defineProperty(this, "handleDragEnd", () => { // Notify parent of the final order this.dispatchEvent(new CustomEvent("reorder", { detail: { keys: this.items.map(item => item.key) }, bubbles: true })); this.draggedIndex = null; this.placeholderIndex = null; this.updateDragState(); }); this.items = []; this.draggedIndex = null; this.placeholderIndex = null; this.itemWrappers = []; } connectedCallback() { this.className = "draggable-order-list"; this.syncItemsFromChildren(); } syncItemsFromChildren() { const children = Array.from(this.children); this.items = children.map((child, i) => ({ child, key: child.dataset.key || child.getAttribute("key") || i })); this.render(); } addItem(element, key) { this.items.push({ child: element, key: key || this.items.length }); this.render(); } clearItems() { this.items = []; this.render(); } updateDragState() { const isDragging = this.draggedIndex !== null; this.classList.toggle("is-dragging", isDragging); this.itemWrappers.forEach((wrapper, index) => { wrapper.classList.toggle("dragging", this.draggedIndex === index); }); } render() { this.innerHTML = ""; this.itemWrappers = []; this.items.forEach((item, index) => { const wrapper = document.createElement("div"); wrapper.className = "draggable-order-item-wrapper"; wrapper.draggable = true; wrapper.dataset.key = item.key; wrapper.addEventListener("dragstart", e => this.handleDragStart(index, e)); wrapper.addEventListener("dragover", e => this.handleDragOver(index, e)); wrapper.addEventListener("dragend", this.handleDragEnd); wrapper.appendChild(item.child.cloneNode ? item.child.cloneNode(true) : item.child); this.appendChild(wrapper); this.itemWrappers.push(wrapper); }); this.updateDragState(); } } class DraggableOrderItem extends HTMLElement { static get observedAttributes() { return [ "name", "enabled" ]; } constructor() { super(); _defineProperty(this, "handleToggle", e => { e.stopPropagation(); this._enabled = !this._enabled; this.updateEnabledState(); this.dispatchEvent(new CustomEvent("toggle", { detail: { enabled: this._enabled }, bubbles: true })); }); this._name = ""; this._enabled = true; } connectedCallback() { this.render(); } attributeChangedCallback(name, oldValue, newValue) { if (oldValue === newValue) return; switch (name) { case "name": this._name = newValue || ""; if (this.nameSpan) { this.nameSpan.textContent = this._name; } break; case "enabled": this._enabled = newValue !== "false" && newValue !== "0"; this.updateEnabledState(); break; } } get name() { return this._name; } set name(val) { this.setAttribute("name", val); } get enabled() { return this._enabled; } set enabled(val) { this.setAttribute("enabled", val); } updateEnabledState() { this.classList.toggle("disabled", !this._enabled); if (this.toggle) { this.toggle.title = this._enabled ? "Click to disable" : "Click to enable"; } } render() { this.className = "draggable-order-item"; this.innerHTML = ""; this.nameSpan = document.createElement("span"); this.nameSpan.className = "draggable-order-item-name"; this.nameSpan.textContent = this._name; this.toggle = document.createElement("div"); this.toggle.className = "draggable-order-item-toggle"; this.toggle.addEventListener("click", this.handleToggle); this.appendChild(this.nameSpan); this.appendChild(this.toggle); this.updateEnabledState(); } } customElements.define("draggable-order-list", DraggableOrderList); customElements.define("draggable-order-item", DraggableOrderItem); /***/ }, /***/ 7732(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _helpers = __webpack_require__(3241); class DurationInput extends HTMLElement { constructor() { super(); this.duration = { years: 0, months: 0, weeks: 0, days: 0, hours: 0, minutes: 0, seconds: 0 }; this.isInfinite = false; } connectedCallback() { this.render(); this.attachEventListeners(); } render() { const units = [ { key: "years", label: "Years" }, { key: "months", label: "Months" }, { key: "weeks", label: "Weeks" }, { key: "days", label: "Days" }, { key: "hours", label: "Hours" }, { key: "minutes", label: "Minutes" }, { key: "seconds", label: "Seconds" } ]; this.innerHTML = `\n <label class="infinity-label">\n <span>Infinite Duration</span>\n </label>\n <div class="duration-inputs">\n ${units.map(unit => `\n <label>\n <span>${unit.label}</span>\n <input\n type="number"\n min="0"\n data-unit="${unit.key}"\n value="0"\n step="1"\n placeholder="0"\n />\n </label>\n `).join("")}\n </div>\n `; } attachEventListeners() { const $infinity = this.querySelector(".infinity-label"); // Toggle infinite duration $infinity.addEventListener("click", () => { this.isInfinite = !this.isInfinite; $infinity.classList.toggle("selected", this.isInfinite); this.dispatchChangeEvent(); }); // Handle duration input changes this.querySelectorAll('input[type="number"]').forEach(input => { input.addEventListener("input", event => { const unit = event.target.dataset.unit; this.duration[unit] = parseInt(event.target.value, 10) || 0; this.dispatchChangeEvent(); }); }); } dispatchChangeEvent() { this.dispatchEvent(new CustomEvent("change", { detail: this.getDurationString(), bubbles: true })); } get value() { return this.getDurationString(); } getDurationString() { if (this.isInfinite) { return "infinite"; } let durationStr = ""; const unitMap = { years: "Y", months: "M", weeks: "W", days: "D", hours: "H", minutes: "M", seconds: "S" }; for (const [unit, value] of Object.entries(this.duration)) { if (value > 0) { durationStr += `${value}${unitMap[unit]}`; } } return durationStr || "0S"; } set value(durationStr) { // Handle infinite duration if (durationStr === "infinite" || durationStr === "infinity" || durationStr === "∞") { this.isInfinite = true; const $infinity = this.querySelector(".infinity-label"); if ($infinity) { $infinity.classList.add("selected"); } return; } // Reset infinite state this.isInfinite = false; const $infinity = this.querySelector(".infinity-label"); if ($infinity) { $infinity.classList.remove("selected"); } // Parse duration string const match = _helpers.expiryRegex.exec(durationStr); if (match) { for (const unit of Object.keys(this.duration)) { const value = match.groups[unit]; this.duration[unit] = value ? parseInt(value, 10) : 0; const input = this.querySelector(`input[data-unit="${unit}"]`); if (input) { input.value = this.duration[unit]; } } } } } customElements.define("duration-input", DurationInput); /***/ }, /***/ 1914(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { __webpack_require__(7732); __webpack_require__(2784); __webpack_require__(5155); __webpack_require__(7411); __webpack_require__(1731); /***/ }, /***/ 5155(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.NumericInput = void 0; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class NumericInput extends HTMLElement { static get observedAttributes() { return [ "value", "min", "max", "step" ]; } constructor() { super(); _defineProperty(this, "handleMinus", () => { const currentValue = Number(this.inputValue); const newValue = Math.round(Math.max(currentValue - this.step, this.min) * 100) / 100; this.updateValue(newValue); }); _defineProperty(this, "handlePlus", () => { const currentValue = Number(this.inputValue); const newValue = Math.round(Math.min(currentValue + this.step, this.max) * 100) / 100; this.updateValue(newValue); }); _defineProperty(this, "handleInputChange", () => { const inputVal = this.input.value; if (isNaN(Number(inputVal))) { this.input.value = this.inputValue; return; } let newValue = Math.round(Math.min(Math.max(Number(inputVal), this.min), this.max) * 100) / 100; newValue = this.step >= 1 ? Math.round(newValue) : newValue; this.updateValue(newValue); }); _defineProperty(this, "handleKeyUp", e => { if (e.key.toLowerCase() === "enter") { this.handleInputChange(); e.target.blur(); } }); _defineProperty(this, "handleInput", e => { this.inputValue = e.target.value; }); this.inputValue = 0; this._min = -Infinity; this._max = Infinity; this._step = 1; } connectedCallback() { this.render(); this.setupEventListeners(); } attributeChangedCallback(name, oldValue, newValue) { if (oldValue === newValue) return; switch (name) { case "value": this.inputValue = Number(newValue) || 0; if (this.input) { this.input.value = this.inputValue; } break; case "min": this._min = Number(newValue !== null && newValue !== void 0 ? newValue : -Infinity); break; case "max": this._max = Number(newValue !== null && newValue !== void 0 ? newValue : Infinity); break; case "step": this._step = Number(newValue !== null && newValue !== void 0 ? newValue : 1); break; } } get value() { return this.inputValue; } set value(val) { this.setAttribute("value", val); } get min() { return this._min; } get max() { return this._max; } get step() { return this._step; } updateValue(newValue) { this.inputValue = newValue; this.input.value = newValue; this.dispatchEvent(new CustomEvent("change", { detail: { value: newValue }, bubbles: true })); } setupEventListeners() { this.minusBtn.addEventListener("click", this.handleMinus); this.plusBtn.addEventListener("click", this.handlePlus); this.input.addEventListener("input", this.handleInput); this.input.addEventListener("blur", this.handleInputChange); this.input.addEventListener("keyup", this.handleKeyUp); this.input.addEventListener("wheel", e => { e.preventDefault(); if (e.deltaY < 0) this.handlePlus(); else if (e.deltaY > 0) this.handleMinus(); }); } render() { this.className = "numeric-input-container"; this.minusBtn = document.createElement("span"); this.minusBtn.className = "fa fa-minus numeric-input-button"; this.input = document.createElement("input"); this.input.type = "text"; this.input.className = "numeric-input"; this.input.value = this.inputValue; this.input.autocomplete = "off"; this.plusBtn = document.createElement("span"); this.plusBtn.className = "fa fa-plus numeric-input-button"; this.appendChild(this.minusBtn); this.appendChild(this.input); this.appendChild(this.plusBtn); } } exports.NumericInput = NumericInput; customElements.define("numeric-input", NumericInput); /***/ }, /***/ 2784() { function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class ToggleInput extends HTMLElement { static get observedAttributes() { return [ "value", "checked" ]; } constructor() { super(); _defineProperty(this, "handleClick", () => { this._value = !this._value; this.updateState(); this.dispatchEvent(new CustomEvent("change", { detail: { value: this._value, checked: this._value }, bubbles: true })); }); this._value = false; } connectedCallback() { this.render(); this.updateState(); } attributeChangedCallback(name, oldValue, newValue) { if (oldValue === newValue) return; if (name === "value" || name === "checked") { this._value = newValue === "true" || newValue === "1" || newValue === ""; this.updateState(); } } get value() { return this._value; } set value(val) { this._value = !!val; this.setAttribute("value", this._value); this.updateState(); } get checked() { return this._value; } set checked(val) { this.value = val; } updateState() { this.classList.toggle("active", this._value); } render() { this.classList.add("settings-toggle"); this.innerHTML = ""; const toggleSwitch = document.createElement("div"); toggleSwitch.className = "toggle-switch"; const toggleSlider = document.createElement("div"); toggleSlider.className = "toggle-slider"; toggleSwitch.appendChild(toggleSlider); this.appendChild(toggleSwitch); this.addEventListener("click", this.handleClick); } } customElements.define("toggle-input", ToggleInput); /***/ }, /***/ 1731() { function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class VolumeControl extends HTMLElement { static get observedAttributes() { return [ "title", "description", "value" ]; } constructor() { super(); _defineProperty(this, "handleVolumeChange", e => { const newValue = Math.max(0, Math.min(1, parseFloat(e.target.value))); this._value = newValue; this.slider.value = newValue; this.input.value = newValue.toFixed(2); this.dispatchEvent(new CustomEvent("change", { detail: { value: newValue }, bubbles: true })); }); this._title = ""; this._description = ""; this._value = .5; this._sound = ""; this._preview = null; } connectedCallback() { this.render(); } attributeChangedCallback(name, oldValue, newValue) { if (oldValue === newValue) return; switch (name) { case "title": this._title = newValue || ""; if (this.titleEl) this.titleEl.textContent = this._title; break; case "description": this._description = newValue || ""; if (this.descEl) this.descEl.textContent = this._description; break; case "value": this._value = Math.max(0, Math.min(1, parseFloat(newValue))); if (this.slider) this.slider.value = this._value; if (this.input) this.input.value = this._value.toFixed(2); break; } } get title() { return this._title; } set title(val) { this.setAttribute("title", val); } get value() { return this._value; } set value(val) { this.setAttribute("value", val); } setPreview(audio, path) { this._preview = { audio, path }; this.render(); } render() { this.className = "volume-control"; this.innerHTML = ""; // Header const header = document.createElement("div"); header.className = "volume-control-header"; const info = document.createElement("div"); info.className = "volume-control-info"; this.titleEl = document.createElement("div"); this.titleEl.className = "volume-control-title"; this.titleEl.textContent = this._title; this.descEl = document.createElement("div"); this.descEl.className = "volume-control-desc"; this.descEl.textContent = this._description; info.appendChild(this.titleEl); info.appendChild(this.descEl); header.appendChild(info); if (this._preview) { const $preview = document.createElement("button"); $preview.className = "volume-control-preview"; $preview.title = "Preview sound"; $preview.addEventListener("click", () => { if ($preview.classList.contains("playing")) return; $preview.classList.add("playing"); const $icon = $preview.querySelector("i"); if ($icon) $icon.className = "fa fa-stop"; const controller = new AbortController; $preview.onclick = () => controller.abort(); this._preview.audio.stopPreviews(); this._preview.audio.playSound(this._preview.path, controller.signal, true).finally(() => { $preview.onclick = null; $preview.classList.remove("playing"); if ($icon) $icon.className = "fa fa-play"; }); }); const playIcon = document.createElement("i"); playIcon.className = "fa fa-play"; $preview.appendChild(playIcon); header.appendChild($preview); } this.appendChild(header); const sliderContainer = document.createElement("div"); sliderContainer.className = "volume-control-slider-container"; this.slider = document.createElement("input"); this.slider.type = "range"; this.slider.className = "volume-control-slider"; this.slider.min = "0"; this.slider.max = "1"; this.slider.step = "0.01"; this.slider.value = this._value; this.slider.autocomplete = "off"; this.slider.addEventListener("input", this.handleVolumeChange); sliderContainer.appendChild(this.slider); this.input = document.createElement("input"); this.input.type = "number"; this.input.className = "volume-control-input"; this.input.min = "0"; this.input.max = "1"; this.input.step = "0.01"; this.input.value = this._value.toFixed(2); this.input.autocomplete = "off"; this.input.addEventListener("input", this.handleVolumeChange); sliderContainer.appendChild(this.input); this.appendChild(sliderContainer); } } customElements.define("volume-control", VolumeControl); /***/ }, /***/ 8816(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.run = run; __webpack_require__(4153); __webpack_require__(1914); var _wikishield = __webpack_require__(7054); var _manager2 = __webpack_require__(9501); var _killswitch = __webpack_require__(691); function run() { addEventListener("wheel", event => { if (event.target.closest(".no-scroll")) return; if (event.target.tagName === "INPUT" && event.target.type === "number") { event.stopPropagation(); event.target.value = Number(event.target.value) + (event.deltaY < 0 ? 1 : -1); event.target.dispatchEvent(new Event("input")); } }, { passive: true }); electron.menuEnabler(); electron.mwapiLoaded(async (server, username, pendingChangesServers, dev) => { if (_manager2.StorageManager.okay(null, electron)) { var _await$fetch$then$the; document.querySelector("#rollback-needed .request-link").href = (_await$fetch$then$the = await fetch("https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q7765871&props=sitelinks/urls&format=json&origin=*").then(res => res.json()).then(data => { var _Object$values$find; return ((_Object$values$find = Object.values(data.entities.Q7765871.sitelinks).find(sitelink => sitelink.url.startsWith(`https://${server}/wiki/`))) === null || _Object$values$find === void 0 ? void 0 : _Object$values$find.url) || null; }).catch(() => null)) !== null && _await$fetch$then$the !== void 0 ? _await$fetch$then$the : "https://www.wikidata.org/wiki/Q7765871"; const ws = new _wikishield.WikiShield(server, username, pendingChangesServers, dev); electron.onOpenBrowser(() => ws.open(null, false)); electron.onOpenUrl(url => ws.open(url, false)); electron.onOpenNotification(link => { const url = new URL(link); if (url.searchParams.has("markasread")) { const n = ws.notifications.find(null, +url.searchParams.get("markasread")); if (n) ws.notifications.read(n.type, n.notification); } ws.open(link); }); electron.menuEnabler({ browser: true }); ws.on("ready", () => { electron.onBeforeunload(async () => { await ws.save(); electron.unloaded(); }); window.addEventListener("beforeunload", async () => await ws.save()); // TODO make this more robust const killswitch = new _killswitch.Killswitch(ws); killswitch.on("kill", () => { alert("WikiShield has been temporarily disabled. Please contact the development team for more information."); window.close(); }); killswitch.on("force-update", () => { alert("The current version of WikiShield is no longer supported. Please update to the latest version to continue using WikiShield."); window.close(); }); killswitch.on("update", () => { electron.sendNotification({ title: "WikiShield Update", body: "A new version of WikiShield is available. Please update to the latest version for the best experience." }, ""); }); killswitch.on("unsafe", () => { alert("Could not verify the integrity of WikiShield. Make sure you are connected to the internet. If the problem persists, please contact the development team."); window.close(); }); killswitch.on("okay", async () => { addEventListener("keydown", event => ws.controller(event)); addEventListener("keyup", event => ws.controller(event)); await ws.init(); }, { once: true }); killswitch.check().then(() => killswitch.monitor(10 * 1e3)); }, { once: true }); } else { alert("An error has occurred with the WikiShield storage system that could lead to data loss. For that reason, WikiShield has been automatically disabled. Please report this immediately to the development team."); window.close(); } }); electron.mwapiLoader().catch(err => { alert(`An error occurred while loading the WikiShield API:\n\n${err.stack || err}`); window.close(); }); } if (window.isElectron) run(); /***/ }, /***/ 317(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.AutoScroll = AutoScroll; const TPS = 60, SPT = 1 / TPS; // Ticks per second, seconds per tick async function SmoothScroll($el, delta, time, callback = () => true) { if (delta === 0) return Promise.resolve([ 0, 0 ]); const start = $el.scrollLeft, end = start + delta; const deadline = performance.now() + time; let resolve; const promise = new Promise(res => resolve = res); const scroll = () => { const now = performance.now(); const pos = start + Math.min(1, (now - (deadline - time)) / time) * delta; if (now >= deadline) { $el.scrollLeft = end; resolve([ 0, 0 ]); } else if (!callback($el, pos)) resolve([ delta - pos + start, Math.max(0, deadline - now) ]); else { $el.scrollLeft = pos; requestAnimationFrame(scroll); } }; requestAnimationFrame(scroll); return promise; } function AutoScroll() { document.querySelectorAll(".auto-scroll").forEach($auto => { if (!$auto.dataset.autoScrollInitialized) { $auto.parentElement.addEventListener("wheel", event => { $auto.dataset.autoScrollFreeze = 750; $auto.dataset.autoScrollLastTime = performance.now(); let offset = parseFloat($auto.dataset.autoScrollOffset) || 0; const x = Math.abs(event.deltaX), y = Math.abs(event.deltaY), z = Math.abs(event.deltaZ), delta = x + y + z; if (delta === 0) return; let direction; switch (Math.max(x, y, z)) { case x: direction = Math.sign(event.deltaX); break; case y: direction = Math.sign(event.deltaY); break; case z: direction = Math.sign(event.deltaZ); break; } offset += direction * delta; $auto.dataset.autoScrollOffset = offset; }, { passive: true }); $auto.dataset.autoScrollInitialized = true; } let offset = parseFloat($auto.dataset.autoScrollOffset) || 0; if ("autoScrollFreeze" in $auto.dataset) { const start = parseFloat($auto.dataset.autoScrollLastTime) || performance.now(), end = performance.now(); offset += end - start; $auto.dataset.autoScrollOffset = offset; $auto.dataset.autoScrollLastTime = end; const freeze = parseFloat($auto.dataset.autoScrollFreeze); if (freeze > 0) $auto.dataset.autoScrollFreeze = freeze - end + start; else { delete $auto.dataset.autoScrollFreeze; delete $auto.dataset.autoScrollLastTime; } } const speed = parseFloat($auto.dataset.autoScrollSpeed) || 1; let carry = parseFloat($auto.dataset.autoScrollCarry) || 0; carry += speed; const delta = Math.floor(carry); $auto.dataset.autoScrollCarry = (carry - delta).toString(); let scrolls = $auto.querySelectorAll(":scope > .auto-scroll-item").length; if (scrolls === 0) { const content = $auto.innerHTML; $auto.innerHTML = ""; const $scroll = document.createElement("span"); $scroll.className = "auto-scroll-item"; $scroll.innerHTML = content; $auto.appendChild($scroll); scrolls = 1; } const $scroll = $auto.querySelector(":scope > .auto-scroll-item"); const cs = getComputedStyle($scroll); const textWidth = $scroll.clientWidth + (parseFloat(cs.marginLeft) || 0) + (parseFloat(cs.marginRight) || 0); const containerWidth = $auto.clientWidth; if (textWidth < containerWidth) return void $auto.querySelectorAll(":scope > .auto-scroll-item:not(:first-child)").forEach($el => $el.remove()); const min = Math.ceil(containerWidth / textWidth) + 1; const n = min - scrolls; if (n > 0) for (let i = 0; i < n; i++) { const $clone = $scroll.cloneNode(true); const $parent = $scroll.parentNode; $parent.insertBefore($clone, $scroll.nextSibling); } else if (n < 0) { const $extra = $auto.querySelectorAll(":scope > .auto-scroll-item"); for (let i = 0; i < -n; i++) { var _$extra$i; (_$extra$i = $extra[i]) === null || _$extra$i === void 0 || _$extra$i.remove(); } } const pos = (performance.now() - offset) / 1e3 * TPS * speed % textWidth; $auto.scrollLeft = pos; const scroll = ($el, delta, time) => { SmoothScroll($el, delta, time, ($el, pos) => { var _$el$scrollLeft; const len = textWidth; if (pos >= len) return (_$el$scrollLeft = void ($el.scrollLeft = pos % len)) !== null && _$el$scrollLeft !== void 0 ? _$el$scrollLeft : false; return true; }).then(([rDelta, rTime]) => { if (rDelta > 0) scroll($el, rDelta, rTime); }); }; if (speed > 0) scroll($auto, delta, SPT * 1e3); }); } /***/ }, /***/ 4784(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Dialog = void 0; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _Dialog_brand = new WeakSet; class Dialog { constructor(ws) { _classPrivateMethodInitSpec(this, _Dialog_brand); this.ws = ws; this.dialogs = { processing: false, active: null, queue: [] }; this.popups = []; addEventListener("focus", () => { if (this.popups.length > 0) { this.popups.forEach(popupId => electron.closePopup(popupId)); this.popups = []; requestAnimationFrame(() => { var _document$querySelect; if (this.popups.length === 0) (_document$querySelect = document.querySelector("#popup-blocker")) === null || _document$querySelect === void 0 || _document$querySelect.remove(); }); } }); electron.onPopupClosed(popupId => { const index = this.popups.indexOf(popupId); if (index !== -1) this.popups.splice(index, 1); if (this.popups.length === 0) requestAnimationFrame(() => { var _document$querySelect2; if (this.popups.length === 0) (_document$querySelect2 = document.querySelector("#popup-blocker")) === null || _document$querySelect2 === void 0 || _document$querySelect2.remove(); }); }); } controller(event) {} check() { if (this.popups.length === 0) return requestAnimationFrame(() => { var _document$querySelect3; if (this.popups.length === 0) (_document$querySelect3 = document.querySelector("#popup-blocker")) === null || _document$querySelect3 === void 0 || _document$querySelect3.remove(); }); requestAnimationFrame(() => this.check()); } toast(title, message, type = "default", duration = 5e3) { const zen = this.ws.store.settings.zen_mode; if (zen.enabled && !zen.toasts.enabled) return false; const $toast = document.createElement("div"); $toast.classList.add("toast-alert", type); const $icon = document.createElement("div"); $icon.classList.add("toast-icon"); $toast.appendChild($icon); const $i = document.createElement("i"); $i.classList.add("fa"); $icon.appendChild($i); switch (type) { case "success": { $i.classList.add("fa-check"); } break; case "warning": { $i.classList.add("fa-exclamation-triangle"); } break; case "error": { $i.classList.add("fa-xmark"); } break; default: { $i.classList.add("fa-info-circle"); } break; } const $content = document.createElement("div"); $content.classList.add("toast-content"); $toast.appendChild($content); const $title = document.createElement("div"); $title.classList.add("toast-title"); $title.textContent = title; $content.appendChild($title); const $message = document.createElement("div"); $message.classList.add("toast-message"); $message.textContent = message; $content.appendChild($message); const $close = document.createElement("div"); $close.classList.add("toast-close"); $close.addEventListener("click", () => { _assertClassBrand(_Dialog_brand, this, _hideToast).call(this, $toast); }); $toast.appendChild($close); const $closeIcon = document.createElement("i"); $closeIcon.classList.add("fa", "fa-xmark"); $close.appendChild($closeIcon); document.body.querySelector("#app").appendChild($toast); setTimeout(() => { this.ws.audio.playSound([ "notification", "toast" ]); $toast.classList.add("show"); }, 10); if (duration > 0) setTimeout(() => _assertClassBrand(_Dialog_brand, this, _hideToast).call(this, $toast), duration); return true; } input(title, message, placeholder = "", defaultValue = "", child = false) { return _assertClassBrand(_Dialog_brand, this, _enqueue).call(this, () => _assertClassBrand(_Dialog_brand, this, _input).call(this, title, message, placeholder, defaultValue), child); } UAA(username, child = false) { return _assertClassBrand(_Dialog_brand, this, _enqueue).call(this, () => _assertClassBrand(_Dialog_brand, this, _UAA).call(this, username), child); } confirm(title, message, username = null, hideUAA = false, child = false) { return _assertClassBrand(_Dialog_brand, this, _enqueue).call(this, () => _assertClassBrand(_Dialog_brand, this, _confirm).call(this, title, message, username, hideUAA), child); } show(title, message) { return _assertClassBrand(_Dialog_brand, this, _enqueue).call(this, () => _assertClassBrand(_Dialog_brand, this, _show).call(this, title, message)); } } exports.Dialog = Dialog; function _hideToast($toast) { if (!($toast !== null && $toast !== void 0 && $toast.parentElement)) return; $toast.classList.add("hidden"); setTimeout(() => { if ($toast.parentElement) $toast.remove(); }, 300); } async function _process() { if (this.dialogs.processing || this.dialogs.queue.length === 0) return; this.dialogs.processing = true; const {fn, resolve, reject} = this.dialogs.queue.shift(); try { this.dialogs.active = true; const result = await fn(); this.dialogs.active = null; resolve(result); } catch (e) { this.dialogs.active = null; reject(e); } finally { this.dialogs.processing = false; requestAnimationFrame(() => _assertClassBrand(_Dialog_brand, this, _process).call(this)); } } function _enqueue(fn, child = false) { return new Promise((resolve, reject) => { if (child && this.dialogs.active) return void fn().then(resolve).catch(reject); this.dialogs.queue.push({ fn, child, resolve, reject }); _assertClassBrand(_Dialog_brand, this, _process).call(this); }); } function _input(title, message, placeholder = "", defaultValue = "") { return new Promise(resolve => { const $overlay = document.createElement("div"); $overlay.classList.add("confirmation-modal-overlay"); document.body.querySelector("#app").appendChild($overlay); const $modal = document.createElement("div"); $modal.classList.add("confirmation-modal"); $overlay.appendChild($modal); const $header = document.createElement("div"); $header.classList.add("confirmation-modal-header"); $modal.appendChild($header); const $title = document.createElement("div"); $title.classList.add("confirmation-modal-title"); $title.textContent = title; $header.appendChild($title); const $body = document.createElement("div"); $body.classList.add("confirmation-modal-body"); $body.innerHTML = message; $modal.appendChild($body); const $input = document.createElement("input"); $input.type = "text"; $input.classList.add("confirmation-modal-input"); $input.placeholder = placeholder; $input.value = defaultValue; $body.appendChild($input); $input.focus(); $input.select(); const $footer = document.createElement("div"); $footer.classList.add("confirmation-modal-footer"); $modal.appendChild($footer); const $cancel = document.createElement("button"); $cancel.classList.add("confirmation-modal-button", "confirmation-modal-button-cancel"); $cancel.style.setProperty("--background", "211, 51, 51"); $cancel.textContent = "Cancel"; $footer.appendChild($cancel); const $submit = document.createElement("button"); $submit.classList.add("confirmation-modal-button", "confirmation-modal-button-submit"); $submit.style.setProperty("--background", "51, 153, 211"); $submit.textContent = "Submit"; $footer.appendChild($submit); const closeModal = result => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $modal.classList.add("closing"); setTimeout(() => { $overlay.remove(); resolve(result); }, 200); }; const keyHandler = event => { if (event.key === "Enter") { event.preventDefault(); event.stopPropagation(); closeModal($input.value); return false; } else if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); closeModal(null); return false; } else if (event.key !== "Tab") { if (event.target.tagName === "INPUT") return; event.preventDefault(); event.stopPropagation(); return false; } }; document.addEventListener("keydown", keyHandler, true); $cancel.addEventListener("click", () => closeModal(null)); $submit.addEventListener("click", () => closeModal($input.value)); $overlay.addEventListener("click", e => { if (e.target === $overlay) closeModal(null); }); }); } function _UAA(username) { return new Promise(resolve => { const closeModal = result => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $modal.classList.add("closing"); setTimeout(() => { $overlay.remove(); resolve(result); }, 200); }; const keyHandler = event => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); closeModal(null); return false; } else if (event.key !== "Tab") { if (event.target.tagName === "INPUT") return; event.preventDefault(); event.stopPropagation(); return false; } }; document.addEventListener("keydown", keyHandler, true); const $overlay = document.createElement("div"); $overlay.classList.add("confirmation-modal-overlay"); document.body.querySelector("#app").appendChild($overlay); const $modal = document.createElement("div"); $modal.classList.add("confirmation-modal"); $overlay.appendChild($modal); const $header = document.createElement("div"); $header.classList.add("confirmation-modal-header"); $modal.appendChild($header); const $title = document.createElement("div"); $title.classList.add("confirmation-modal-title"); $title.textContent = "Report to UAA"; $header.appendChild($title); const $body = document.createElement("div"); $body.classList.add("confirmation-modal-body"); $body.innerHTML = "Select reason for reporting <span class='confirmation-modal-username'></span> to UAA:"; $modal.appendChild($body); $body.querySelector(".confirmation-modal-username").textContent = username; const $footer = document.createElement("div"); $footer.classList.add("confirmation-modal-footer", "confirmation-modal-footer-vertical"); $modal.appendChild($footer); [ "Disruptive", "Offensive", "Promotional", "Misleading" ].forEach(reason => { const text = `${reason} username`; const $button = document.createElement("button"); $button.classList.add("confirmation-modal-button", "confirmation-modal-button-reason"); $button.textContent = text; $button.addEventListener("click", () => closeModal(text)); $footer.appendChild($button); }); const $cancel = document.createElement("button"); $cancel.classList.add("confirmation-modal-button", "confirmation-modal-button-cancel"); $cancel.style.setProperty("--background", "211, 51, 51"); $cancel.textContent = "Cancel"; $cancel.addEventListener("click", () => closeModal(null)); $footer.appendChild($cancel); $overlay.addEventListener("click", event => { if (event.target === $overlay) closeModal(null); }); }); } function _confirm(title, message, username = null, hideUAA = false) { return new Promise(resolve => { const closeModal = result => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $modal.classList.add("closing"); setTimeout(() => { $overlay.remove(); resolve(result); }, 200); }; const keyHandler = event => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); closeModal(null); return false; } else if (event.key !== "Tab") { if (event.target.tagName === "INPUT") return; event.preventDefault(); event.stopPropagation(); return false; } }; document.addEventListener("keydown", keyHandler, true); const $overlay = document.createElement("div"); $overlay.classList.add("confirmation-modal-overlay"); document.body.querySelector("#app").appendChild($overlay); const $modal = document.createElement("div"); $modal.classList.add("confirmation-modal"); $overlay.appendChild($modal); const $header = document.createElement("div"); $header.classList.add("confirmation-modal-header"); $modal.appendChild($header); const $title = document.createElement("div"); $title.classList.add("confirmation-modal-title"); $title.textContent = title; $header.appendChild($title); const $body = document.createElement("div"); $body.classList.add("confirmation-modal-body"); $body.innerHTML = message; $modal.appendChild($body); const $footer = document.createElement("div"); $footer.classList.add("confirmation-modal-footer"); $modal.appendChild($footer); if (username && !hideUAA) { const $uaa = document.createElement("button"); $uaa.classList.add("confirmation-modal-button", "confirmation-modal-button-uaa"); $uaa.style.setProperty("--background", "211, 51, 51"); $uaa.textContent = "Report to UAA"; $footer.appendChild($uaa); $uaa.addEventListener("click", () => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $modal.classList.add("closing"); setTimeout(async () => { $overlay.remove(); const reason = await this.UAA(username, true); if (reason) this.ws.execute({ name: "reportToUAA", params: { reportMessage: reason } }, undefined, undefined, { user: { name: username } }); // fake edit object else resolve(await this.confirm(title, message, username, false, true)); }, 200); }); } const $right = document.createElement("div"); $right.classList.add("confirmation-modal-footer-right"); $footer.appendChild($right); const $no = document.createElement("button"); $no.classList.add("confirmation-modal-button", "confirmation-modal-button-no"); $no.textContent = "No"; $no.addEventListener("click", () => closeModal(false)); $right.appendChild($no); const $yes = document.createElement("button"); $yes.classList.add("confirmation-modal-button", "confirmation-modal-button-yes"); $yes.style.setProperty("--background", "51, 102, 204"); $yes.textContent = "Yes"; $yes.addEventListener("click", () => closeModal(true)); $right.appendChild($yes); $overlay.addEventListener("click", e => { if (e.target === $overlay) closeModal(null); }); requestAnimationFrame(() => $yes.focus()); }); } function _show(title, message) { return new Promise(async resolve => { const $overlay = document.createElement("div"); $overlay.classList.add("confirmation-modal-overlay"); document.body.querySelector("#app").appendChild($overlay); const $dialog = document.createElement("div"); $dialog.classList.add("confirmation-modal"); $overlay.appendChild($dialog); const $header = document.createElement("div"); $header.classList.add("confirmation-modal-header"); $header.textContent = title; $dialog.appendChild($header); const $content = document.createElement("div"); $content.classList.add("confirmation-modal-body"); $content.innerHTML = `<div class="dialog-loading">\n <div class="dialog-spinner"></div>\n <div class="dialog-loading-text">Loading...</div>\n </div>`; $dialog.appendChild($content); const closeModal = () => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $dialog.classList.add("closing"); setTimeout(() => { $overlay.remove(); resolve(); }, 200); }; const keyHandler = event => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); closeModal(); return false; } }; document.addEventListener("keydown", keyHandler, true); $overlay.addEventListener("click", e => { if (e.target === $overlay) closeModal(); }); if (message instanceof Promise) message.then(resolvedMessage => { if ($content) $content.innerHTML = resolvedMessage; }).catch(() => { if ($content) $content.innerHTML = "Failed to load content"; }); else $content.innerHTML = message; }); } /***/ }, /***/ 8469(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.GUI = void 0; var _scriptEsm = __webpack_require__(4192); var _scriptEsm2 = __webpack_require__(4041); var _wikishield = __webpack_require__(7054); var _text = __webpack_require__(2069); var _dialog = __webpack_require__(4784); var _eventManager = __webpack_require__(8921); var _settings = __webpack_require__(9117); var _queue = __webpack_require__(372); var _warnings = __webpack_require__(955); var _buildPalette = __webpack_require__(7698); var _autoScroll = __webpack_require__(317); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _GUI_brand = new WeakSet; class GUI { constructor(ws) { _classPrivateMethodInitSpec(this, _GUI_brand); this.ws = ws; this.dialog = new _dialog.Dialog(this.ws); this.events = new _eventManager.EventManager(this.ws); this.settings = new _settings.Settings(this.ws); this.intervals = { DEFCON: null, outdated: null }; this.controllers = { current: null }; } async build() { this.updateDEFCON(); document.documentElement.style.colorScheme = { light: "only light", auto: "light dark", dark: "only dark" }[this.ws.store.UI.theme.app] || "light dark"; const shhhhh = { code: [ "ArrowUp", "ArrowUp", "ArrowDown", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowLeft", "ArrowRight", "b", "a" ], index: 0, function: event => { if (event.key === shhhhh.code[shhhhh.index]) { if (++shhhhh.index === shhhhh.code.length) { shhhhh.index = 0; this.ws.open("https://ws.luni.me/konami-easter-egg", "force"); } return; } shhhhh.index = event.key === shhhhh.code[0] ? 1 : 0; } }; addEventListener("keydown", shhhhh.function); this.updateAccessibility(); document.querySelector("#initial").classList.remove("hidden"); document.querySelectorAll(".VERSION").forEach(elem => elem.textContent = _wikishield.WikiShield.config.version); if (Math.random() < .01) document.querySelector("#wikishield-sikiwhield").textContent = "SikiWhield"; const controller = new AbortController; let resolve; const promise = new Promise(r => resolve = r); this.ws.audio.playSound([ "startup" ], controller.signal, false, () => resolve()); await promise; let animationFrame; const startupPerformance = this.ws.store.settings.performance.startup; if (startupPerformance !== "always_off") { const paper = document.getElementById("dots-canvas"); const pen = paper.getContext("2d"); const DPR = Math.min(devicePixelRatio || 1, 2); class Dot { constructor() { _defineProperty(this, "radius", 2); this.x = Math.random() * paper.width; this.y = Math.random() * paper.height; this.vx = (Math.random() - .5) * .5; this.vy = (Math.random() - .5) * .5; this.color = Dot.colors[Math.random() * Dot.colors.length | 0]; this.fill = `rgba(${this.color}, 0.8)`; this.shadow = `rgba(${this.color}, 0.8)`; } update() { this.x += this.vx; this.y += this.vy; if (this.x < 0) this.x = paper.width; else if (this.x > paper.width) this.x = 0; if (this.y < 0) this.y = paper.height; else if (this.y > paper.height) this.y = 0; } draw() { pen.beginPath(); pen.arc(this.x, this.y, this.radius, 0, Math.PI * 2); pen.fillStyle = this.fill; pen.fill(); } } _defineProperty(Dot, "dots", []); _defineProperty(Dot, "target", 0); _defineProperty(Dot, "colors", [ "102, 126, 234", // Blue "240, 147, 251", // Pink "118, 75, 162", // Purple "217, 70, 239" ]); let resizeRAF = null; const resizeCanvas = () => { if (resizeRAF) return; resizeRAF = requestAnimationFrame(() => { resizeRAF = null; const oldWidth = paper.width; const oldHeight = paper.height; paper.width = Math.floor(innerWidth * DPR); paper.height = Math.floor(innerHeight * DPR); paper.style.width = `${innerWidth}px`; paper.style.height = `${innerHeight}px`; pen.setTransform(1, 0, 0, 1, 0, 0); pen.scale(DPR, DPR); const scaleX = paper.width / (oldWidth || paper.width); const scaleY = paper.height / (oldHeight || paper.height); Dot.dots.forEach(dot => { dot.x *= scaleX; dot.y *= scaleY; }); Dot.target = Math.floor(innerWidth * innerHeight / 7e3); Dot.target = Math.max(40, Math.min(250, Dot.target)); if (Dot.target > Dot.dots.length) for (let i = Dot.dots.length; i < Dot.target; i++) Dot.dots.push(new Dot); else if (Dot.target < Dot.dots.length) Dot.dots.length = Dot.target; }); }; resizeCanvas(); addEventListener("resize", resizeCanvas); const GRID_SIZE = 160; const LOW_FPS_THRESHOLD = 30; const LOW_FPS_DURATION_MS = 500; let lowFPSStart = null; let lastTimestamp = performance.now(); const lastDeltaTimes = new Array(15).fill(1e3 / 60); const animate = () => { { const now = performance.now(); const deltaTime = now - lastTimestamp; lastTimestamp = now; lastDeltaTimes.shift(); lastDeltaTimes.push(deltaTime); const noOutliers = [ ...lastDeltaTimes ].sort((a, b) => a - b).slice(2, -2); const averageDeltaTime = noOutliers.reduce((a, b) => a + b, 0) / noOutliers.length; const FPS = 1e3 / averageDeltaTime; if (startupPerformance === "adaptive") { if (FPS < LOW_FPS_THRESHOLD) { if (lowFPSStart === null) lowFPSStart = now; if (now - lowFPSStart >= LOW_FPS_DURATION_MS) { if (animationFrame) cancelAnimationFrame(animationFrame); animationFrame = null; pen.clearRect(0, 0, paper.width, paper.height); return; } } else lowFPSStart = null; if (FPS < 45 && Dot.dots.length > 60) { Dot.dots.length = Math.max(60, Math.floor(Dot.dots.length * .9)); Dot.target = Dot.dots.length; } } } pen.clearRect(0, 0, paper.width, paper.height); Dot.dots.forEach(dot => { dot.update(); dot.draw(); }); const cols = Math.ceil(innerWidth / GRID_SIZE); const rows = Math.ceil(innerHeight / GRID_SIZE); const grid = new Array(cols * rows); for (let i = 0; i < grid.length; i++) grid[i] = []; Dot.dots.forEach((d, index) => { const cx = Math.max(0, Math.min(cols - 1, Math.floor(d.x / GRID_SIZE))); const cy = Math.max(0, Math.min(rows - 1, Math.floor(d.y / GRID_SIZE))); grid[cy * cols + cx].push(index); }); const linkRange = 150; const halfW = innerWidth / 2; const halfH = innerHeight / 2; const drawWrappedLine = (x1, y1, x2, y2, strokeStyle) => { const xShifts = [ 0 ]; if (Math.max(x1, x2) > innerWidth) xShifts.push(-innerWidth); if (Math.min(x1, x2) < 0) xShifts.push(innerWidth); const yShifts = [ 0 ]; if (Math.max(y1, y2) > innerHeight) yShifts.push(-innerHeight); if (Math.min(y1, y2) < 0) yShifts.push(innerHeight); pen.lineWidth = 1; pen.strokeStyle = strokeStyle; for (const shiftX of xShifts) for (const shiftY of yShifts) { pen.beginPath(); pen.moveTo(x1 + shiftX, y1 + shiftY); pen.lineTo(x2 + shiftX, y2 + shiftY); pen.stroke(); } }; for (let cy = 0; cy < rows; cy++) { for (let cx = 0; cx < cols; cx++) { const cellIdx = cy * cols + cx; const indices = grid[cellIdx]; if (indices.length === 0) continue; for (let nyOff = -1; nyOff <= 1; nyOff++) { const ny = (cy + nyOff + rows) % rows; for (let nxOff = -1; nxOff <= 1; nxOff++) { const nx = (cx + nxOff + cols) % cols; const nIdx = ny * cols + nx; const neighbors = grid[nIdx]; if (neighbors.length === 0) continue; for (let ii = 0; ii < indices.length; ii++) { const a = Dot.dots[indices[ii]]; for (let jj = 0; jj < neighbors.length; jj++) { const bi = neighbors[jj]; if (bi <= indices[ii]) continue; const b = Dot.dots[bi]; let dx = a.x - b.x; let dy = a.y - b.y; if (dx > halfW) dx -= innerWidth; if (dx < -halfW) dx += innerWidth; if (dy > halfH) dy -= innerHeight; if (dy < -halfH) dy += innerHeight; const dist2 = dx * dx + dy * dy; if (dist2 < linkRange * linkRange) { const distance = Math.sqrt(dist2); const opacity = (1 - distance / linkRange) * .4; const aSplit = a.color.split(","); const bSplit = b.color.split(","); const avgR = (parseInt(aSplit[0]) + parseInt(bSplit[0])) / 2; const avgG = (parseInt(aSplit[1]) + parseInt(bSplit[1])) / 2; const avgB = (parseInt(aSplit[2]) + parseInt(bSplit[2])) / 2; drawWrappedLine(a.x, a.y, a.x - dx, a.y - dy, `rgba(${avgR}, ${avgG}, ${avgB}, ${opacity})`); } } } } } } } animationFrame = requestAnimationFrame(animate); }; animate(); } if (this.ws.rights.rollback || this.ws.api.username === "LuniZunie") { document.querySelector("#rollback-needed").classList.add("hidden"); document.querySelector("#start-button").classList.remove("hidden"); } else { document.querySelector("#rollback-needed").classList.remove("hidden"); document.querySelector("#start-button").classList.add("hidden"); } document.querySelector("#start-button").addEventListener("click", () => { window.removeEventListener("keydown", shhhhh.function); controller.abort(); this.ws.audio.playSound([ "ui", "click" ]); if (animationFrame) cancelAnimationFrame(animationFrame); this.ws.start(); }); window.addEventListener("click", event => { [ ...document.querySelectorAll(".tooltip.buttons") ].forEach(elem => elem.remove()); const $href = event.target.closest("[href]"); if ($href) { const url = new URL($href.href, location.href); if (url.origin === location.origin && url.pathname === location.pathname) return; if ($href.dataset.multipleHrefs) { try { const [type, values = ""] = $href.dataset.multipleHrefs.split(";"); const items = Object.fromEntries(values.split("&").map(keyValue => { const [key, value] = keyValue.split("="); return [ key, decodeURIComponent(value) ]; })); switch (type) { case "page": { const title = items.title; const id = +items.id; this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "Page"; $page.addEventListener("click", event => { this.ws.open(this.ws.page(title), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "Revision"; $preview.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:Permalink/${id}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($preview); const $history = document.createElement("div"); $history.classList.add("button"); $history.innerText = "Diff"; $history.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:Diff/${id}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($history); }); } break; case "page-abuse": { const title = items.title; const id = +items.id; this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "Page"; $page.addEventListener("click", event => { this.ws.open(this.ws.page(title), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "Details"; $preview.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:AbuseLog/${id}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($preview); const $history = document.createElement("div"); $history.classList.add("button"); $history.innerText = "Examine"; $history.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:AbuseFilter/examine/log/${id}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($history); }); } break; case "log": { const title = items.title; const log = JSON.parse(items.log); this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "Page"; $page.addEventListener("click", event => { this.ws.open(this.ws.page(title), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "Log"; $preview.addEventListener("click", event => { const page = this.ws.page(`Special:Log/${encodeURIComponent(log.user)}?page=${encodeURIComponent(title)}&type=${log.type}&wptime=${log.timestamp}&limit=1`, false, false); const popup = this.ws.open(page, event.altKey); $tooltip.remove(); popup.addEventListener("load", () => { popup.scroll({ behavior: "smooth", top: popup.document.body.scrollHeight }); }, { once: true }); }); $tooltip.appendChild($preview); }); } break; case "user": { const username = items.name; this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "User talk"; $preview.addEventListener("click", event => { this.ws.open(this.ws.page(`User talk:${username}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($preview); const $history = document.createElement("div"); $history.classList.add("button"); $history.innerText = "User contribs"; $history.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:Contribs/${username}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($history); const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "User page"; $page.addEventListener("click", event => { this.ws.open(this.ws.page(`User:${username}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); }); } break; case "email": { this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "Emergency"; $preview.addEventListener("click", event => { this.ws.open(this.ws.page("Special:EmailUser/Emergency"), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($preview); const $history = document.createElement("div"); $history.classList.add("button"); $history.innerText = "ArbCom"; $history.addEventListener("click", event => { this.ws.open(this.ws.page("Special:EmailUser/Arbitration Committee"), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($history); const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "Oversight"; $page.addEventListener("click", event => { this.ws.open(this.ws.page("Special:EmailUser/Oversight"), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); }); } break; } } catch (error) { this.ws.open($href.getAttribute("href"), event.altKey); } finally { event.preventDefault(); } } else this.ws.open($href.getAttribute("href"), event.altKey); event.preventDefault(); } }); document.querySelector("#loading").classList.add("hidden"); } async start() { this.intervals.DEFCON = setInterval(this.updateDEFCON.bind(this), 6e4); document.querySelector("#DEFCON").addEventListener("click", event => { this.ws.open("https://en.wikipedia.org/w/index.php?tagfilter=mw-manual-revert%7Cmw-rollback%7Cmw-undo&title=Special%3ARecentChanges&urlversion=2", event.altKey); }); this.settings.start(); document.querySelector("#app").classList.remove("hidden"); document.querySelector("#initial").classList.add("hidden"); document.querySelectorAll(".bottom-tool-trigger").forEach($trigger => { $trigger.addEventListener("click", e => { e.stopPropagation(); const $item = $trigger.closest(".bottom-tool-item"); const $menu = document.querySelector(`#${$item.dataset.menu}-menu`); const isOpen = $menu.classList.contains("show"); switch ($item.dataset.menu) { case "revert": { $menu.innerHTML = ""; this.createWarnMenu("reverts", $menu, this.ws.queue.current.item); } break; case "warn": { $menu.innerHTML = ""; this.createWarnMenu("warnings", $menu, this.ws.queue.current.item); } break; case "page": { var _item$page; const item = this.ws.queue.current.item; const watched = (item === null || item === void 0 || (_item$page = item.page) === null || _item$page === void 0 ? void 0 : _item$page.watched) === true; document.querySelector("#page-watch").classList.toggle("hidden", watched); document.querySelector("#page-unwatch").classList.toggle("hidden", !watched); } break; } this.closeMenus(); if (!isOpen) { $menu.classList.add("show"); $trigger.classList.add("active"); this.positionBottomMenu($item, $menu); } }); }); document.querySelectorAll(".submenu-trigger").forEach($trigger => { let exited = (0, _scriptEsm.generateRandomUUID)(); $trigger.addEventListener("mouseenter", () => { exited = null; const $parentMenu = $trigger.closest(".bottom-tool-menu"); if ($parentMenu) { $parentMenu.querySelectorAll(".submenu").forEach($submenu => $submenu.classList.remove("show")); } const $submenu = $trigger.querySelector(".submenu"); if ($submenu) { this.events.submenu($submenu, $submenu.dataset.eventName); $submenu.classList.add("show"); this.positionSubmenu($submenu, $trigger); } }); $trigger.addEventListener("mouseleave", () => { const UUID = (0, _scriptEsm.generateRandomUUID)(); exited = UUID; setTimeout(() => { if (exited !== UUID) return; const $submenu = $trigger.querySelector(".submenu"); if ($submenu) $submenu.classList.remove("show"); }, 500); }); }); document.querySelectorAll(".menu-option:not(.submenu-trigger)").forEach($option => { $option.addEventListener("click", () => this.closeMenus()); }); document.querySelectorAll(".submenu").forEach($submenu => { $submenu.addEventListener("click", e => e.stopPropagation()); }); document.querySelectorAll("#queue-tabs > .queue-tab").forEach($el => this.addTooltipListener($el)); { const types = [ "alert", "message" ]; types.forEach(type => { const $icon = document.querySelector(`#${type}s-icon`); this.addTooltipListener($icon); $icon.addEventListener("click", () => { const $panel = document.querySelector(`#${type}s-panel`); $panel.classList.toggle("show"); if ($panel.classList.contains("show")) this.ws.notifications.seen(type); }); document.querySelector(`#mark-all-${type}s-read`).addEventListener("click", e => { this.ws.notifications.read(type); }); }); document.addEventListener("click", e => { for (const type of types) { const $panel = document.querySelector(`#${type}s-panel`); const $icon = document.querySelector(`#${type}s-icon`); if (!($panel !== null && $panel !== void 0 && $panel.contains(e.target)) && !($icon !== null && $icon !== void 0 && $icon.contains(e.target))) $panel === null || $panel === void 0 || $panel.classList.remove("show"); } if (!e.target.closest(".bottom-tool-menu") && !e.target.closest(".confirmation-modal-overlay")) this.closeMenus(); }); } const $latest = document.querySelector("#latest-edits-tab"); $latest.addEventListener("click", () => this.updateDiffDisplay(this.ws.queue.current.item, false)); this.addTooltipListener($latest); const $consecutive = document.querySelector("#consecutive-edits-tab"); $consecutive.addEventListener("click", () => this.updateDiffDisplay(this.ws.queue.current.item, true)); this.addTooltipListener($consecutive); document.querySelector("#pending-changes-container > .accept").addEventListener("click", async e => { await this.ws.gui.settings.waitForClose(); const message = await this.dialog.input("Accept Pending Changes", "Enter an optional edit summary for accepting this change:", "Edit summary (optional)", ""); if (message !== null) this.ws.execute({ actions: [ { name: "next-item", params: {} }, { name: "accept-pending-edit", params: { summary: message } } ] }); }); document.querySelector("#pending-changes-container > .reject").addEventListener("click", async e => { await this.ws.gui.settings.waitForClose(); const message = await this.dialog.input("Reject Pending Changes", "Enter an optional edit summary for rejecting this change:", "Edit summary (optional)", ""); if (message !== null) this.ws.execute({ actions: [ { name: "next-item", params: {} }, { name: "reject-pending-edit", params: { summary: message } } ] }); }); document.querySelectorAll("#bottom-tools [data-tooltip]").forEach($el => this.addTooltipListener($el)); { // width adjusts const $queue = document.querySelector("#queue"); { const width = this.ws.store.UI.queue.width; if (width) { $queue.style.width = width; document.querySelector("#right-container").style.width = `calc(100% - ${width})`; } } const $details = document.querySelector("#right-details"); { const width = this.ws.store.UI.details.width; if (width) { $details.style.width = width; document.querySelector("#main-container").style.width = `calc(100% - ${width})`; } } const resize = { active: null, section: null, x: null, width: null, windowWidth: null }; const startResize = ($handle, $section, e) => { e.preventDefault(); resize.active = $handle; resize.section = $section; resize.x = e.clientX; resize.width = $section.getBoundingClientRect().width; resize.windowWidth = innerWidth; }; const $queueHandle = document.querySelector("#queue-width-adjust"); $queueHandle.addEventListener("pointerdown", e => startResize($queueHandle, $queue, e)); const $detailsHandle = document.querySelector("#details-width-adjust"); $detailsHandle.addEventListener("pointerdown", e => startResize($detailsHandle, $details, e)); addEventListener("pointerup", () => { if (resize.active === $queueHandle) this.ws.store.UI.queue.width = $queue.style.width; else if (resize.active === $detailsHandle) this.ws.store.UI.details.width = $details.style.width; resize.active = null; resize.section = null; }); addEventListener("pointermove", e => { if (!resize.active) return; const dx = e.clientX - resize.x; let newWidth; if (resize.active === $queueHandle) newWidth = resize.width + dx; else if (resize.active === $detailsHandle) newWidth = resize.width - dx; const min = resize.windowWidth * .1; // 10vw const max = resize.windowWidth * .3; // 30vw newWidth = Math.max(min, Math.min(max, newWidth)); const vw = newWidth / resize.windowWidth * 100; resize.section.style.width = `${vw}vw`; if (resize.active === $queueHandle) document.querySelector("#right-container").style.width = `calc(100% - ${vw}vw)`; else if (resize.active === $detailsHandle) document.querySelector("#main-container").style.width = `calc(100% - ${vw}vw)`; }); } const version = _wikishield.WikiShield.config.changelog.version; if (version.endsWith("!") || version !== this.ws.store.changelog) { var _electron$open, _electron; this.ws.store.changelog = version.replace(/!$/, ""); (_electron$open = (_electron = electron).open) === null || _electron$open === void 0 || _electron$open.call(_electron, "changelog"); } this.addTooltipListener(document.querySelector("#settings-icon")); document.querySelectorAll("#queue-top-right > span").forEach($el => this.addTooltipListener($el)); this.updateZenMode(); this.reorderQueues(); this.newCurrentItem(null); document.querySelector("#settings-icon").addEventListener("click", () => { this.settings.open(); }); this.events.button(document.querySelector("#clear-queue"), "clear-queue"); this.events.button(document.querySelector("#previous-item-button"), "previous-item"); this.events.button(document.querySelector("#next-item-button"), "next-item"); this.events.button(document.querySelector("#user-open-user-page"), "open-user-page"); this.events.button(document.querySelector("#user-open-user-talk"), "open-user-talk"); this.events.button(document.querySelector("#user-view-contribs"), "open-user-contributions"); this.events.button(document.querySelector("#user-view-filter-log"), "open-filter-log"); this.events.button(document.querySelector("#user-whitelist"), "whitelist-user"); this.events.button(document.querySelector("#user-unwhitelist"), "unwhitelist-user"); this.events.button(document.querySelector("#user-highlight"), "highlight-user"); this.events.button(document.querySelector("#user-unhighlight"), "unhighlight-user"); this.events.submenu(document.querySelector("#user-welcome .submenu"), "welcome-user"); this.events.submenu(document.querySelector("#user-report-aiv .submenu"), "report-user-to-aiv"); this.events.submenu(document.querySelector("#user-report-uaa .submenu"), "report-user-to-uaa"); this.events.submenu(document.querySelector("#user-request-global-block .submenu"), "request-global-block"); this.events.submenu(document.querySelector("#user-request-global-lock .submenu"), "request-global-lock"); this.events.submenu(document.querySelector("#user-new-talk-topic .submenu"), "send-message-to-user-talk"); this.events.button(document.querySelector("#page-open-page"), "open-page"); this.events.button(document.querySelector("#page-open-talk"), "open-page-talk"); this.events.button(document.querySelector("#page-watch"), "watch-page"); this.events.button(document.querySelector("#page-unwatch"), "unwatch-page"); this.events.button(document.querySelector("#page-whitelist"), "whitelist-page"); this.events.button(document.querySelector("#page-unwhitelist"), "unwhitelist-page"); this.events.button(document.querySelector("#page-highlight"), "highlight-page"); this.events.button(document.querySelector("#page-unhighlight"), "unhighlight-page"); this.events.submenu(document.querySelector("#page-request-protection .submenu"), "request-page-protection"); this.events.button(document.querySelector("#page-view-history"), "open-page-history"); this.events.submenu(document.querySelector("#page-new-talk-topic .submenu"), "send-message-to-page-talk"); this.events.button(document.querySelector("#edit-view-revision"), "open-revision"); this.events.button(document.querySelector("#edit-view-diff"), "open-diff"); this.events.button(document.querySelector("#edit-thank-user"), "thank-user"); this.events.submenu(document.querySelector("#edit-rollback .submenu"), "rollback-edit"); this.events.submenu(document.querySelector("#edit-rollback-goodfaith .submenu"), "rollback-goodfaith-edit"); this.events.submenu(document.querySelector("#edit-undo .submenu"), "undo-edit"); this.events.button(document.querySelector("#copy-link"), "copy-link"); this.events.button(document.querySelector("#refresh-user-contributions"), "refresh-user-contributions"); this.events.button(document.querySelector("#user-contributions > .footer"), "open-user-contributions"); this.events.button(document.querySelector("#refresh-page-history"), "refresh-page-history"); this.events.button(document.querySelector("#page-history > .footer"), "open-page-history"); _queue.Queue.types.forEach(type => { this.events.button(document.querySelector(`#queue-tab-${type}`), `switch-to-${type}-queue`); }); this.animation(); this.update(); this.renderQueue(); electron.menuEnabler({ browser: true, settings: { preferences: true }, help: { changelog: true } }); } animation() { try { (0, _autoScroll.AutoScroll)(); } catch (error) { console.error("Error in animation loop:", error); } requestAnimationFrame(() => this.animation()); } update() { try { const now = new Date; document.querySelectorAll("[data-time]").forEach($el => { const timestamp = new Date($el.dataset.time); switch ($el.dataset.timeFormat) { case "notification": { $el.textContent = this.ws.util.formatNotificationTime(timestamp, "timeNow" in $el.dataset ? new Date($el.dataset.timeNow) : now) + ($el.dataset.timePostfix || ""); } break; case "duration": { $el.textContent = this.ws.util.formatDuration(timestamp, "timeNow" in $el.dataset ? new Date($el.dataset.timeNow) : now) + ($el.dataset.timePostfix || ""); } break; } }); } catch (error) { console.error("Error updating time elements:", error); } setTimeout(() => this.update(), 1e3); } async updateDEFCON() { var _DEFCON$info; const DEFCON = await this.ws.getDEFCON(); const $DEFCON = document.querySelector("#DEFCON"); $DEFCON.title = `DEFCON-${DEFCON.level !== null ? DEFCON.level : "N/A"} (${DEFCON.info ? `${DEFCON.info} revert${+DEFCON.info === 1 ? "" : "s"} per minute` : "No data"})`; const $dot = $DEFCON.querySelector(".dot"); $dot.className = "dot"; if (DEFCON.level !== null) $dot.classList.add(`DEFCON-${DEFCON.level}`); document.querySelector(".DEFCON-RPM").textContent = (_DEFCON$info = DEFCON.info) !== null && _DEFCON$info !== void 0 ? _DEFCON$info : "N/A"; } generateItemHTML(item, removeButton = false) { const oresColor = this.getORESColor(item.ores); const diffColor = "sizediff" in item ? this.ws.util.getChangeColor(item.sizediff) : undefined; const $item = (0, _scriptEsm2.CreateDOMElement)("div"); { const $color = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-color", style: { "--ores-color": oresColor }, dataset: { ores: item.ores } }); $item.appendChild($color); } { var _ref, _item$tags, _item$filters; const $body = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-body", style: { "--ores-color": oresColor, "--diff-color": diffColor }, datset: { ores: item.ores } }); $item.appendChild($body); { const $header = (0, _scriptEsm2.CreateDOMElement)("div", { class: "header" }); $body.appendChild($header); { const highlighted = this.ws.store.highlight.pages.has(item.page.title); const $title = (0, _scriptEsm2.CreateDOMElement)("span", { class: "page-title" + (highlighted ? " highlighted" : ""), content: item.page.title, dataset: highlighted ? { tooltip: "Page is highlighted", tooltipDelay: 500 } : {} }); this.addTooltipListener($title); $header.appendChild($title); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-file-lines" }); $title.prepend($icon); } { const $timestamp = (0, _scriptEsm2.CreateDOMElement)("span", { class: "timestamp" }); $header.appendChild($timestamp); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-clock", style: { "font-size": "11px" } }); $timestamp.appendChild($icon); const $time = (0, _scriptEsm2.CreateDOMElement)("span", { content: this.ws.util.formatNotificationTime(new Date(item.timestamp)), dataset: { tooltip: new Date(item.timestamp).toLocaleString(), tooltipDelay: 500, time: item.timestamp, timeFormat: "notification" } }); this.addTooltipListener($time); $timestamp.appendChild($time); } } { var _item$performer; const $meta = (0, _scriptEsm2.CreateDOMElement)("div", { class: "meta" }); $body.appendChild($meta); const user = (_item$performer = item.performer) !== null && _item$performer !== void 0 ? _item$performer : item.user; { const blocked = user.blocked; const blockExpiry = this.ws.util.expiryToDate(blocked === null || blocked === void 0 ? void 0 : blocked.expiry); const highlighted = this.ws.store.highlight.users.has(user.name); const emptyTalk = user.talk === undefined; const $user = (0, _scriptEsm2.CreateDOMElement)("span", { class: "user-chip" + ((blocked === null || blocked === void 0 ? void 0 : blocked.partial) === false ? " blocked" : "") + (highlighted ? " highlighted" : "") + (emptyTalk ? " empty-talk" : ""), content: item.user.name, dataset: (blocked === null || blocked === void 0 ? void 0 : blocked.partial) === false ? { tooltip: `Blocked ${blockExpiry === Infinity ? "indefinitely" : `until ${blockExpiry.toLocaleString()}`} (${blocked.reason})`, tooltipDelay: 500 } : highlighted ? { tooltip: "User is highlighted", tooltipDelay: 500 } : emptyTalk ? { tooltip: "User has an empty talk page", tooltipDelay: 500 } : {} }); this.addTooltipListener($user); $meta.appendChild($user); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${user.anon ? "user-secret" : "user"}`, style: { "font-size": "11px" } }); $user.prepend($icon); } { const $chips = (0, _scriptEsm2.CreateDOMElement)("div", { class: "chips" }); $meta.appendChild($chips); if (item.type === "abuselog") { const results = [ "disallow", "warn", "showcaptcha", "tag", "none" ]; const len = results.length; let action = len - 1; for (let i = 0; i < len; i++) if (item.origin.result.has(results[i])) { action = i; break; } const $ores = (0, _scriptEsm2.CreateDOMElement)("span", { class: "ores-chip", dataset: { tooltip: `Action taken: ${results[action]}`, tooltipDelay: 500 } }); this.addTooltipListener($ores); $chips.appendChild($ores); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${[ "ban", "exclamation-triangle", "robot", "tag", "check" ][action]}`, style: { "font-size": "11px" } }); $ores.prepend($icon); } else { const $ores = (0, _scriptEsm2.CreateDOMElement)("span", { class: "ores-chip", content: Number.isNaN(item.ores) ? "-" : Math.round(item.ores * 100), dataset: { tooltip: "Score", tooltipDelay: 500 } }); this.addTooltipListener($ores); $chips.appendChild($ores); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-fire", style: { "font-size": "11px" } }); $ores.prepend($icon); } { const $diffChips = (0, _scriptEsm2.CreateDOMElement)("div", { class: "diff-chips" }); $chips.appendChild($diffChips); if (item.minor) { const $minor = (0, _scriptEsm2.CreateDOMElement)("span", { class: "minor-chip", dataset: { tooltip: "Minor edit", tooltipDelay: 500 } }); this.addTooltipListener($minor); $diffChips.appendChild($minor); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-m", style: { "font-size": "11px" } }); $minor.appendChild($icon); } if ("sizediff" in item) { const $diff = (0, _scriptEsm2.CreateDOMElement)("span", { class: "diff-chip", content: Math.abs(item.sizediff).toLocaleString(), dataset: { tooltip: "Size difference", tooltipDelay: 500 } }); this.addTooltipListener($diff); $diffChips.appendChild($diff); if (item.sizediff !== 0) { const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${item.sizediff > 0 ? "plus" : "minus"}`, style: { "font-size": "11px" } }); $diff.prepend($icon); } } } } } if (item.has_comment) { const $comment = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-comment" }); $body.appendChild($comment); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-comment", style: { "font-size": "11px" } }); $comment.appendChild($icon); const $text = (0, _scriptEsm2.CreateDOMElement)("span", { class: "text", html: item.comment, dataset: { tooltip: item.comment, tooltipHtml: true, tooltipDelay: 500 } }); this.addTooltipListener($text); $comment.appendChild($text); } const tags = (_ref = (_item$tags = item.tags) !== null && _item$tags !== void 0 ? _item$tags : (_item$filters = item.filters) === null || _item$filters === void 0 ? void 0 : _item$filters.map(filter => `${filter.filter} (${filter.id === "-1" ? "private" : filter.id})`)) !== null && _ref !== void 0 ? _ref : []; if (tags.length > 0) { const $tags = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-tags" }); $body.appendChild($tags); tags.forEach(tag => { const $tag = (0, _scriptEsm2.CreateDOMElement)("span", { class: "tag", content: tag }); $tags.appendChild($tag); }); } } if (removeButton) { const $remove = (0, _scriptEsm2.CreateDOMElement)("div", { class: "remove-button" }); $item.appendChild($remove); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-xmark" }); $remove.appendChild($icon); } return $item.innerHTML; } generateEditDetails(item, consecutive = false) { if (!item) return void (document.querySelector("#edit-details").innerHTML = "<div class='central'>Nothing selected</div>"); const pending = _queue.Queue.groups[item.type] === "edit" ? this.ws.queue.pending.get(item.id) : null; const $details = document.querySelector("#edit-details"); $details.style.setProperty("--diff-color", "sizediff" in item ? this.ws.util.getChangeColor(item.sizediff) : undefined); $details.innerHTML = ""; { const $header = (0, _scriptEsm2.CreateDOMElement)("div", { class: "header" }); $details.appendChild($header); { const highlighted = this.ws.store.highlight.pages.has(item.page.title); const $title = (0, _scriptEsm2.CreateDOMElement)("span", { class: "page-title" + (highlighted ? " highlighted" : ""), dataset: highlighted ? { tooltip: "Page is highlighted", tooltipDelay: 500 } : {} }); this.addTooltipListener($title); $header.appendChild($title); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-file-lines" }); $title.appendChild($icon); let pageHref; switch (_queue.Queue.groups[item.type]) { case "edit": { pageHref = "page"; } break; case "logevent": { pageHref = "log"; } break; case "abuselog": { pageHref = "page-abuse"; } break; } const $link = (0, _scriptEsm2.CreateDOMElement)("a", { content: item.page.title, dataset: { multipleHrefs: `${pageHref};title=${encodeURIComponent(item.page.title)}&${pageHref === "log" ? `log=${JSON.stringify(item)}` : `id=${item.id}`}`, tooltip: item.page.title, tooltipDelay: 500 }, attributes: { href: null } }); this.addTooltipListener($link); $title.appendChild($link); } { var _item$performer2; const $meta = (0, _scriptEsm2.CreateDOMElement)("div", { class: "meta" }); $header.appendChild($meta); const user = (_item$performer2 = item.performer) !== null && _item$performer2 !== void 0 ? _item$performer2 : item.user; { var _pending$users; const otherUsers = Object.keys((_pending$users = pending === null || pending === void 0 ? void 0 : pending.users) !== null && _pending$users !== void 0 ? _pending$users : {}).filter(pendingUser => pendingUser !== user.name); const blocked = user.blocked; const blockExpiry = this.ws.util.expiryToDate(blocked === null || blocked === void 0 ? void 0 : blocked.expiry); const highlighted = this.ws.store.highlight.users.has(user.name); const emptyTalk = user.talk === undefined; const $user = (0, _scriptEsm2.CreateDOMElement)("span", { class: "user-chip" + ((blocked === null || blocked === void 0 ? void 0 : blocked.partial) === false ? " blocked" : "") + (highlighted ? " highlighted" : "") + (emptyTalk ? " empty-talk" : ""), dataset: (blocked === null || blocked === void 0 ? void 0 : blocked.partial) === false ? { tooltip: `Blocked ${blockExpiry === Infinity ? "indefinitely" : `until ${blockExpiry.toLocaleString()}`} (${blocked.reason})`, tooltipDelay: 500 } : highlighted ? { tooltip: "User is highlighted", tooltipDelay: 500 } : emptyTalk ? { tooltip: "User has an empty talk page", tooltipDelay: 500 } : {} }); this.addTooltipListener($user); $meta.appendChild($user); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${otherUsers.length > 0 ? "users" : user.anon ? "user-secret" : "user"}` }); $user.appendChild($icon); const $link = (0, _scriptEsm2.CreateDOMElement)("a", { content: user.name, dataset: { multipleHrefs: `user;name=${encodeURIComponent(user.name)}`, tooltip: user.name, tooltipDelay: 500 }, attributes: { href: null } }); this.addTooltipListener($link); $user.appendChild($link); if (otherUsers.length > 0) { const $others = (0, _scriptEsm2.CreateDOMElement)("span", { class: "other-users", content: ` and ${otherUsers.length} ${_text.Text.pluralize("other", otherUsers.length)}`, dataset: { tooltip: otherUsers.join(", "), tooltipDelay: 500 } }); this.addTooltipListener($others); $user.appendChild($others); } } } } { var _item$consecutive; const $subheader = (0, _scriptEsm2.CreateDOMElement)("div", { class: "subheader" }); $details.appendChild($subheader); if ((pending === null || pending === void 0 ? void 0 : pending.count) > 1 || consecutive && ((_item$consecutive = item.consecutive) === null || _item$consecutive === void 0 ? void 0 : _item$consecutive.count) > 1) { const $comment = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-comment" }); $subheader.appendChild($comment); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-comments", style: { "font-size": "11px" } }); $comment.appendChild($icon); const data = pending !== null && pending !== void 0 ? pending : item.consecutive; const $text = (0, _scriptEsm2.CreateDOMElement)("span", { class: "text", content: `${data.count} ${_text.Text.pluralize("edit", data.count)} over the course of `, dataset: { tooltip: data.edits.map(edit => { const $body = (0, _scriptEsm2.CreateDOMElement)("div", { style: { display: "flex", "flex-direction": "column", gap: "6px" } }); { const $header = (0, _scriptEsm2.CreateDOMElement)("div", { style: { display: "flex", "align-items": "center", gap: "6px", width: "100%", "justify-content": "space-between", "font-size": "13px" } }); $body.appendChild($header); { const $user = (0, _scriptEsm2.CreateDOMElement)("span", { style: { display: "flex", "align-items": "center", gap: "4px", "font-weight": "500" }, content: edit.user }); $header.appendChild($user); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${edit.anon ? "user-secret" : "user"}`, style: { "font-size": "11px", opacity: "0.7" } }); $user.prepend($icon); } { const $time = (0, _scriptEsm2.CreateDOMElement)("span", { style: { display: "flex", "align-items": "center", gap: "4px", "font-size": "12px", opacity: "0.75" }, content: this.ws.util.formatNotificationTime(new Date(edit.timestamp)), dataset: { time: edit.timestamp, timeFormat: "notification" } }); $header.appendChild($time); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-clock", style: { "font-size": "10px", opacity: "0.7" } }); $time.prepend($icon); } } { const $comment = (0, _scriptEsm2.CreateDOMElement)("div", { style: { display: "flex", "align-items": "flex-start", gap: "4px", "font-size": "12px", opacity: "0.85", padding: "2px 0" }, content: edit.comment || "No edit summary" }); $body.appendChild($comment); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-comment", style: { "font-size": "10px", opacity: "0.7", "flex-shrink": "0", "margin-top": "2px" } }); $comment.prepend($icon); } return $body.outerHTML; }).join("<br>"), tooltipHtml: true, tooltipDelay: 500 } }); this.addTooltipListener($text); $comment.appendChild($text); const $time = (0, _scriptEsm2.CreateDOMElement)("span", { class: "time", content: this.ws.util.formatDuration(new Date(data.timestamp.old), new Date(data.timestamp.new)), dataset: { tooltip: `${new Date(data.timestamp.old).toLocaleString()}&mdash;${new Date(data.timestamp.new).toLocaleString()}`, tooltipHtml: true, tooltipDelay: 500, time: data.timestamp.old, timeNow: data.timestamp.new, timeFormat: "duration" } }); this.addTooltipListener($time); $comment.appendChild($time); } else if (item.has_comment) { const $comment = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-comment" }); $subheader.appendChild($comment); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-comment", style: { "font-size": "11px" } }); $comment.appendChild($icon); const $text = (0, _scriptEsm2.CreateDOMElement)("span", { class: "text", html: item.comment, dataset: { tooltip: item.comment, tooltipHtml: true, tooltipDelay: 500 } }); this.addTooltipListener($text); $comment.appendChild($text); } else { const $noComment = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-comment none", content: "No edit summary" }); $subheader.appendChild($noComment); } { const $meta = (0, _scriptEsm2.CreateDOMElement)("div", { class: "meta" }); $subheader.appendChild($meta); { if (item.minor) { const $minor = (0, _scriptEsm2.CreateDOMElement)("span", { class: "minor-chip", dataset: { tooltip: "Minor edit", tooltipDelay: 500 } }); this.addTooltipListener($minor); $meta.appendChild($minor); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-m", style: { "font-size": "11px" } }); $minor.appendChild($icon); } if ("sizediff" in item) { const $diff = (0, _scriptEsm2.CreateDOMElement)("span", { class: "diff-chip", content: Math.abs(item.sizediff).toLocaleString(), dataset: { tooltip: "Size difference", tooltipDelay: 500 } }); this.addTooltipListener($diff); $meta.appendChild($diff); if (item.sizediff !== 0) { const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${item.sizediff > 0 ? "plus" : "minus"}`, style: { "font-size": "11px" } }); $diff.prepend($icon); } } } } } } renderQueue(queue = null, current = null, type = null) { var _$queue$querySelector, _this$ws$queue$queues2, _current4; document.querySelector("#previous-item-button").classList.toggle("disabled", !this.ws.queue.canGoPrevious()); document.querySelector("#next-item-button").classList.toggle("disabled", !this.ws.queue.canGoNext()); queue !== null && queue !== void 0 ? queue : queue = this.ws.queue.current.queue; current !== null && current !== void 0 ? current : current = this.ws.queue.current.item; type !== null && type !== void 0 ? type : type = this.ws.queue.current.type; this.updateQueueTabs(); if (type !== this.ws.queue.current.type) return; const $queue = document.querySelector("#queue-items"); if (queue.length === 0) { var _this$ws$queue$queues, _current; const $empty = document.createElement("div"); $empty.classList.add("queue-empty"); $empty.textContent = "No items in queue"; $queue.innerHTML = $empty.outerHTML; if (((_this$ws$queue$queues = this.ws.queue.queues[type].previous) === null || _this$ws$queue$queues === void 0 ? void 0 : _this$ws$queue$queues.id) !== ((_current = current) === null || _current === void 0 ? void 0 : _current.id)) { this.ws.queue.queues[type].previous = current; this.newCurrentItem(current); } return; } else $queue.querySelectorAll(".queue-empty").forEach($el => $el.remove()); const dom = new Map; for (const $el of $queue.children) dom.set(+$el.dataset.id, $el); let $previous = null; for (const item of queue) { var _current3; let $el = dom.get(item.id); if (!$el) { var _$el$querySelector; $el = document.createElement("div"); $el.classList.add("queue-item"); $el.dataset.id = item.id; $el.dataset.type = type; $el.innerHTML = this.generateItemHTML(item, type !== "pending"); (_$el$querySelector = $el.querySelector(".remove-button")) === null || _$el$querySelector === void 0 || _$el$querySelector.addEventListener("click", e => { e.stopPropagation(); const i = queue.findIndex(queueItem => queueItem.id === item.id); if (i >= 0) { var _current2; if (item.id === ((_current2 = current) === null || _current2 === void 0 ? void 0 : _current2.id)) this.ws.queue.next(); else { queue.splice(i, 1); this.ws.queue.queues[type].history.push({ ...item, history: performance.now() }); this.removeQueueItem(type, item.id); this.renderQueue(); } } }); if (item.mentions.has && this.ws.store.settings.username_highlighting.enabled) { $el.classList.add("mentions-me"); $el.dataset.tooltip = "This queue item contains your username"; this.addTooltipListener($el); } $el.addEventListener("click", () => { this.ws.queue.queues[type].item = item; this.ws.current = this.ws.queue.queues[type]; // saftey fallback this.renderQueue(); }); $queue.appendChild($el); dom.set(item.id, $el); $el.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); } if ($previous === null) { if ($el !== $queue.firstChild) $queue.insertBefore($el, $queue.firstChild); } else if ($el.previousSibling !== $previous) $queue.insertBefore($el, $previous.nextSibling); $el.classList.toggle("current", item.id === ((_current3 = current) === null || _current3 === void 0 ? void 0 : _current3.id)); $previous = $el; } for (const [id, $el] of dom.entries()) if (!queue.some(item => item.id === id)) $el.remove(); let historical = null; for (const item of queue) { if (item.history !== false) historical = item; else break; } (_$queue$querySelector = $queue.querySelector(".historical-bar")) === null || _$queue$querySelector === void 0 || _$queue$querySelector.remove(); if (historical !== null) { const $bar = (0, _scriptEsm2.CreateDOMElement)("div", { class: "historical-bar" }); $queue.insertBefore($bar, dom.get(historical.id).nextSibling); const $label = (0, _scriptEsm2.CreateDOMElement)("span", { class: "label" }); $bar.appendChild($label); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-box-archive", attributes: { title: "All items above this line have been viewed" } }); $label.appendChild($icon); } if (((_this$ws$queue$queues2 = this.ws.queue.queues[type].previous) === null || _this$ws$queue$queues2 === void 0 ? void 0 : _this$ws$queue$queues2.id) !== ((_current4 = current) === null || _current4 === void 0 ? void 0 : _current4.id)) { this.ws.queue.queues[type].previous = current; this.newCurrentItem(current); } } removeQueueItem(type, id) { const $el = document.querySelector(`.queue-item[data-type="${type}"][data-id="${id}"]`); if ($el) { $el.remove(); this.updateQueueTabs([ type ]); } } clearQueueItems() { document.querySelector("#queue-items").innerHTML = ""; this.renderQueue(); } updateHiddenItems(item) { if (item === undefined) item = this.ws.queue.current.item; if (item === null) { if (!this.ws.store.UI.hide_tools) // if not hiding tools, just keep it as is return document.querySelectorAll("[data-queue-type]").forEach($el => $el.classList.add("hidden")); return document.querySelectorAll("[data-queue-type]").forEach($el => $el.classList.add("hidden")); } let type = item.type; if (type === "abuselog") { if (item.revid) type = "edit"; } const group = _queue.Queue.groups[type]; document.querySelectorAll("[data-queue-type]").forEach($el => { const forType = $el.dataset.queueType || "*"; if (forType === "*") $el.classList.remove("hidden"); else $el.classList.toggle("hidden", !forType.split(",").includes(group)); }); } async newCurrentItem(item = null, circular = false) { var _this$controllers$cur, _item$page2; (_this$controllers$cur = this.controllers.current) === null || _this$controllers$cur === void 0 || _this$controllers$cur.abort(); const controller = new AbortController; this.controllers.current = controller; if (item !== null) { this.updateDiffDisplay("loading"); await this.ws.queue.propagate(item, true); } this.stopOutdatedCheck(); this.toggleEditWarNotice((item === null || item === void 0 ? void 0 : item.reverts) >= 3, (item === null || item === void 0 ? void 0 : item.reverts) || 0); this.toggleOutdatedNotice(false); this.togglePendingNotice(false); this.closeMenus(); this.removeTooltips(); document.querySelectorAll("#right-top > div > :not(.hidden)").forEach(el => el.classList.add("hidden")); const $contributions = document.querySelector("#user-contributions > .queue-list"); $contributions.innerHTML = ""; const $history = document.querySelector("#page-history > .queue-list"); $history.innerHTML = ""; document.querySelector("#user-contributions > .header > .pills").innerHTML = ""; document.querySelector("#page-history > .header > .pills").innerHTML = ""; document.querySelector("#pending-changes-container").classList.toggle("hidden", !(this.ws.rights.review && this.ws.queue.pending.has(item === null || item === void 0 ? void 0 : item.id))); this.updateHiddenItems(item); if (item === null) { this.generateEditDetails(); document.querySelector("#diff-container").innerHTML = ""; document.querySelector("#diff-scroll-up").classList.add("hidden"); document.querySelector("#diff-scroll-down").classList.add("hidden"); document.querySelector("#ai-analysis-container").classList.add("hidden"); if ([ ...document.querySelectorAll(`#queue-tabs > .queue-tab`) ].every(tab => getComputedStyle(tab).display === "none")) document.querySelector("#diff-container").innerHTML = `\n\t\t\t\t\t<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: grey;">\n\t\t\t\t\t\t<div style="font-size: 48px; margin-bottom: 16px;">\n\t\t\t\t\t\t\t<i class="fas fa-shield-alt"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 24px; margin-bottom: 8px; text-align: center;">\n\t\t\t\t\t\t\tNo queues are enabled\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 14px; text-align: center; max-width: 100%; margin-top: 10px;">\n\t\t\t\t\t\t\tI heard there was a WikiShield,<br>\n\t\t\t\t\t\t\tWhich entered an oversaturated field,<br>\n\t\t\t\t\t\t\tBut you don&rsquo;t ever use Huggle, do you?<br>\n\t\t\t\t\t\t\tWell it simplifies any AIV,<br>\n\t\t\t\t\t\t\tBut superintendence matters to me\n\t\t\t\t\t\t\t<span style="display: block; margin-top: 8px;">&mdash; User:WikiMacaroons</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`; return; } const type = item.type; const group = _queue.Queue.groups[type]; if (!circular && type === "abuselog" && !item.revid) { const update = async () => { if (controller.signal.aborted) return; this.ws.api.getAbuseLogRevid(item.id).then(revid => { var _this$ws$queue$curren2; if (revid) { var _this$ws$queue$curren; item.revid = revid; if (item.id === ((_this$ws$queue$curren = this.ws.queue.current.item) === null || _this$ws$queue$curren === void 0 ? void 0 : _this$ws$queue$curren.id)) this.newCurrentItem(this.ws.queue.current.item, true); } if (item.id === ((_this$ws$queue$curren2 = this.ws.queue.current.item) === null || _this$ws$queue$curren2 === void 0 ? void 0 : _this$ws$queue$curren2.id)) setTimeout(() => update(), 1e3); }); }; update(); } const watched = item === null || item === void 0 || (_item$page2 = item.page) === null || _item$page2 === void 0 ? void 0 : _item$page2.watched; document.querySelector("#page-watch").classList.toggle("hidden", watched === true); document.querySelector("#page-unwatch").classList.toggle("hidden", watched !== true); document.querySelector("#user-report-uaa").classList.toggle("hidden", item === null || item === void 0 ? void 0 : item.user.anon); document.querySelector("#user-request-global-lock").classList.toggle("hidden", item === null || item === void 0 ? void 0 : item.user.anon); if (this.ws.AI) { const storage = this.ws.store; if (item.AI.edit === null && storage.settings.AI.edit_analysis.enabled) this.ws.AI.analyze.edit(item).then(analysis => { item.AI.edit = analysis; }).catch(err => { item.AI.edit = { error: err.message }; }).finally(() => { var _this$ws$queue$curren3; if (item.id === ((_this$ws$queue$curren3 = this.ws.queue.current.item) === null || _this$ws$queue$curren3 === void 0 ? void 0 : _this$ws$queue$curren3.id)) this.updateAIAnalysisDisplay(item.AI.edit); }); if (item.AI.username === null && !item.user.anon && !storage.whitelist.users.has(item.user) && storage.settings.AI.username_analysis.enabled) this.ws.AI.analyze.username(item).then(analysis => { item.AI.username = analysis; if (analysis.flag) this.ws.queue.promptUAA(item, analysis); }).catch(err => { item.AI.username = { error: err.message }; }); } this.updateAIAnalysisDisplay(item.AI.edit); if (!item.seen) { item.seen = true; this.ws.store.statistics.edits_reviewed.total++; switch (this.ws.queue.current.type) { case "recent": { this.ws.store.statistics.recent_changes_reviewed.total++; } break; case "pending": { this.ws.store.statistics.pending_changes_reviewed.total++; } break; case "watchlist": { this.ws.store.statistics.watchlist_changes_reviewed.total++; } break; case "users": { this.ws.store.statistics.users_reviewed.total++; } break; } } { const $editPill = (0, _scriptEsm2.CreateDOMElement)("div", { class: "pill", content: `${item.user.edits.toLocaleString()} edit${item.user.edits === 1 ? "" : "s"}` }); document.querySelector("#user-contributions > .header > .pills").appendChild($editPill); } if (item.user.warning !== "0") { const $warnings = (0, _scriptEsm2.CreateDOMElement)("div", { class: `pill uw-${item.user.warning}` }); document.querySelector("#user-contributions > .header > .pills").appendChild($warnings); $warnings.textContent = `uw-${item.user.warning}`; const warnings = item.user.warnings; if (warnings.length > 0) { const $tooltip = document.createElement("div"); const $title = document.createElement("div"); $title.classList.add("tooltip-title"); $title.textContent = `Warnings for ${item.user.name}`; $tooltip.appendChild($title); for (const warning of warnings) { const $warning = document.createElement("div"); $warning.classList.add("tooltip-item", "user-warnings"); $tooltip.appendChild($warning); const $level = document.createElement("span"); $level.classList.add("tooltip-item-level"); $level.textContent = `${warning.template}${warning.level}`; $warning.appendChild($level); const $details = document.createElement("div"); $details.classList.add("tooltip-item-details"); $warning.appendChild($details); const $user = document.createElement("span"); $user.classList.add("tooltip-item-user"); $user.textContent = warning.username ? `by User:${warning.username}` : "by Unknown"; $details.appendChild($user); $details.appendChild(document.createElement("br")); const $date = document.createElement("span"); $date.classList.add("tooltip-item-date"); $details.appendChild($date); if (warning.timestamp) { $date.dataset.time = warning.timestamp; $date.dataset.timeFormat = "notification"; $date.textContent = this.ws.util.formatNotificationTime(new Date(warning.timestamp)); } else $date.textContent = "Date unknown"; } $warnings.dataset.tooltip = $tooltip.innerHTML; $warnings.dataset.tooltipHtml = true; } this.addTooltipListener($warnings); } const blocks = item.user.blocks; if (blocks.length > 0) { const $blocks = (0, _scriptEsm2.CreateDOMElement)("div", { class: "pill ub" }); document.querySelector("#user-contributions > .header > .pills").appendChild($blocks); const $tooltip = document.createElement("div"); const $title = document.createElement("div"); $title.classList.add("tooltip-title"); $title.textContent = `Blocks for ${item.user.name}`; $tooltip.appendChild($title); for (const block of blocks) { var _block$params; const $block = document.createElement("div"); $block.classList.add("tooltip-item", "user-blocks"); $tooltip.appendChild($block); const $level = document.createElement("span"); $level.classList.add("tooltip-item-level"); $level.innerHTML = block.parsedcomment || "No reason provided"; $block.appendChild($level); const $details = document.createElement("div"); $details.classList.add("tooltip-item-details"); $block.appendChild($details); const $user = document.createElement("span"); $user.classList.add("tooltip-item-user"); $user.textContent = block.user ? `by User:${block.user}` : "by Unknown"; $details.appendChild($user); $details.appendChild(document.createElement("br")); const $date = document.createElement("span"); $date.classList.add("tooltip-item-time"); $details.appendChild($date); const $timestamp = document.createElement("span"); if (block.timestamp) { $timestamp.dataset.time = block.timestamp; $timestamp.dataset.timeFormat = "notification"; $timestamp.textContent = this.ws.util.formatNotificationTime(new Date(block.timestamp)); } else $timestamp.textContent = "Date unknown"; $date.appendChild($timestamp); const $duration = document.createElement("span"); $duration.textContent = `(for ${((_block$params = block.params) === null || _block$params === void 0 ? void 0 : _block$params.duration) || "an unknown duration"})`; $date.appendChild($duration); } $blocks.classList.remove("hidden"); $blocks.textContent = `${blocks.length} block${blocks.length === 1 ? "" : "s"}`; $blocks.dataset.tooltip = $tooltip.innerHTML; $blocks.dataset.tooltipHtml = true; this.addTooltipListener($blocks); } { // users whitelist & highlight buttons const $whitelist = document.querySelector("#user-whitelist"); const $unwhitelist = document.querySelector("#user-unwhitelist"); if ($whitelist && $unwhitelist) { const func = () => { const isWhitelisted = this.ws.store.whitelist.users.has(item.user.name); $whitelist.classList.toggle("hidden", isWhitelisted); $unwhitelist.classList.toggle("hidden", !isWhitelisted); }; $whitelist.onclick = func; $unwhitelist.onclick = func; func(); } const $highlight = document.querySelector("#user-highlight"); const $unhighlight = document.querySelector("#user-unhighlight"); if ($highlight && $unhighlight) { const func = () => { const isHighlighted = this.ws.store.highlight.users.has(item.user.name); $highlight.classList.toggle("hidden", isHighlighted); $unhighlight.classList.toggle("hidden", !isHighlighted); }; $highlight.onclick = func; $unhighlight.onclick = func; func(); } } { // pages whitelist & highlight buttons const $addWhitelist = document.querySelector("#page-whitelist"); const $removeWhitelist = document.querySelector("#page-unwhitelist"); if ($addWhitelist && $removeWhitelist) { const func = () => { const isWhitelisted = this.ws.store.whitelist.pages.has(item.page.title); $addWhitelist.classList.toggle("hidden", isWhitelisted); $removeWhitelist.classList.toggle("hidden", !isWhitelisted); }; $addWhitelist.onclick = func; $removeWhitelist.onclick = func; func(); } const $highlight = document.querySelector("#page-highlight"); const $unhighlight = document.querySelector("#page-unhighlight"); if ($highlight && $unhighlight) { const func = () => { const isHighlighted = this.ws.store.highlight.pages.has(item.page.title); $highlight.classList.toggle("hidden", isHighlighted); $unhighlight.classList.toggle("hidden", !isHighlighted); }; $highlight.onclick = func; $unhighlight.onclick = func; func(); } } { // contributions const load = async signal => { const contributions = item.user.contributions; for (const item of contributions) { var _this$ws$queue$curren4; const $item = document.createElement("div"); $item.className = "queue-item no-transition"; $item.classList.toggle("current", item.id === ((_this$ws$queue$curren4 = this.ws.queue.current.item.revid) !== null && _this$ws$queue$curren4 !== void 0 ? _this$ws$queue$curren4 : this.ws.queue.current.item.id)); $item.innerHTML = this.generateItemHTML({ page: { title: item.title }, user: { name: item.user }, comment: "Loading...", timestamp: item.timestamp, sizediff: 0, ores: NaN, tags: item.tags || [], type: "edit" }); $contributions.appendChild($item); requestAnimationFrame(() => $item.classList.remove("no-transition")); } if (item.page.cached_contributions) { const cached = await item.page.cached_contributions; if (signal.aborted) return; if (contributions.some((rev, i) => { var _cached$i; return rev.id !== ((_cached$i = cached[i]) === null || _cached$i === void 0 ? void 0 : _cached$i.id); })) delete item.page.cached_contributions; } if (!item.user.cached_contributions) item.user.cached_contributions = this.ws.queue.generate("edit", contributions, true); const items = await item.user.cached_contributions; if (signal.aborted) return; $contributions.innerHTML = ""; for (const item of items.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))) { var _this$ws$queue$curren5; const $item = document.createElement("div"); $item.className = "queue-item no-transition"; $item.classList.toggle("current", item.id === ((_this$ws$queue$curren5 = this.ws.queue.current.item.revid) !== null && _this$ws$queue$curren5 !== void 0 ? _this$ws$queue$curren5 : this.ws.queue.current.item.id)); $item.innerHTML = this.generateItemHTML(item); $contributions.appendChild($item); $item.addEventListener("mouseover", () => this.ws.queue.propagate(item, true)); $item.addEventListener("click", () => this.ws.queue.loadFromItem(item)); $item.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); requestAnimationFrame(() => $item.classList.remove("no-transition")); } }; load(controller.signal).catch(err => { if (controller.signal.aborted) return; console.error("Error loading contributions:", err); }); } switch (group) { case "edit": { this.startOutdatedCheck(item); if (!this.ws.queue.pending.has(item.id)) { var _item$consecutive2; if (((_item$consecutive2 = item.consecutive) === null || _item$consecutive2 === void 0 ? void 0 : _item$consecutive2.count) >= 2) { document.querySelector("#latest-edits-tab").classList.remove("hidden"); document.querySelector("#consecutive-edits-tab").classList.remove("hidden"); } } const protection = item.page.protection; if (protection.protected || this.ws.queue.pending.has(item.id)) { const $protection = (0, _scriptEsm2.CreateDOMElement)("div", { class: "pill" }); document.querySelector("#page-history > .header > .pills").appendChild($protection); if (protection.protected) { let icon, tooltip; switch (protection.level) { case "sysop": { icon = "F"; tooltip = "Requires sysop right to edit"; } break; case "template": { icon = "T"; tooltip = "Requires template editor to edit"; } break; case "extendedconfirmed": { icon = "EC"; tooltip = "Requires extended confirmed right to edit"; } break; case "autoconfirmed": { icon = "AC"; tooltip = "Requires autoconfirmed right to edit"; } break; default: { icon = "?"; tooltip = "Uknown protection level"; } break; } $protection.innerHTML = `<i class="fas fa-lock"></i> <span class="protection-icon" data-tooltip="${tooltip}">${icon}</span>`; this.addTooltipListener($protection.querySelector("[data-tooltip]")); } else if (this.ws.queue.pending.has(item.id)) { var _this$ws$queue$pendin; const comment = ((_this$ws$queue$pendin = this.ws.queue.pending.get(item.id).pending.stability) === null || _this$ws$queue$pendin === void 0 ? void 0 : _this$ws$queue$pendin.parsedcomment) || "No comment provided"; const $icon = document.createElement("span"); $icon.classList.add("protection-icon"); $icon.innerHTML = "<i class='fas fa-lock'></i> PC"; $icon.dataset.tooltip = comment; $icon.dataset.tooltipHtml = true; $protection.appendChild($icon); this.addTooltipListener($protection.querySelector("[data-tooltip]")); } } for (const metadata of item.page.metadata) { const $metadata = (0, _scriptEsm2.CreateDOMElement)("div", { class: "pill", content: metadata }); document.querySelector("#page-history > .header > .pills").appendChild($metadata); } } break; case "logevent": {} break; case "abuselog": { if (item.revid) this.startOutdatedCheck(item); const $protection = document.querySelector("#protection-indicator"); if ($protection) { const protection = item.page.protection; if (protection.protected) { let icon, tooltip; switch (protection.level) { case "sysop": { icon = "P"; tooltip = "Requires sysop right to edit"; } break; case "extendedconfirmed": { icon = "X"; tooltip = "Requires extended confirmed right to edit"; } break; case "autoconfirmed": { icon = "A"; tooltip = "Requires autoconfirmed right to edit"; } break; default: { icon = "?"; tooltip = "Uknown protection level"; } break; } $protection.innerHTML = `<span class="protection-icon" data-tooltip="${tooltip}">${icon}</span>`; this.addTooltipListener($protection.querySelector("[data-tooltip]")); } else if (this.ws.queue.pending.has(item.id)) { var _this$ws$queue$pendin2; const comment = ((_this$ws$queue$pendin2 = this.ws.queue.pending.get(item.id).pending.stability) === null || _this$ws$queue$pendin2 === void 0 ? void 0 : _this$ws$queue$pendin2.parsedcomment) || "No comment provided"; const $icon = document.createElement("span"); $icon.classList.add("protection-icon"); $icon.textContent = "PC"; $icon.dataset.tooltip = comment; $icon.dataset.tooltipHtml = true; $protection.appendChild($icon); this.addTooltipListener($protection.querySelector("[data-tooltip]")); } else $protection.innerHTML = ""; } } break; } if (group === "edit" || group === "abuselog") { // history const load = async signal => { const history = item.page.history; for (const item of history) { var _this$ws$queue$curren6; const $item = document.createElement("div"); $item.className = "queue-item no-transition"; $item.classList.toggle("current", item.id === ((_this$ws$queue$curren6 = this.ws.queue.current.item.revid) !== null && _this$ws$queue$curren6 !== void 0 ? _this$ws$queue$curren6 : this.ws.queue.current.item.id)); $item.innerHTML = this.generateItemHTML({ page: { title: item.title }, user: { name: item.user }, comment: "Loading...", timestamp: item.timestamp, sizediff: 0, ores: NaN, tags: item.tags || [], type: "edit" }); $history.appendChild($item); requestAnimationFrame(() => $item.classList.remove("no-transition")); } if (item.page.cached_history) { const cached = await item.page.cached_history; if (signal.aborted) return; if (history.some((rev, i) => { var _cached$i2; return rev.id !== ((_cached$i2 = cached[i]) === null || _cached$i2 === void 0 ? void 0 : _cached$i2.id); })) delete item.page.cached_history; } if (!item.page.cached_history) item.page.cached_history = this.ws.queue.generate("edit", history, true); const items = await item.page.cached_history; if (signal.aborted) return; $history.innerHTML = ""; for (const item of items.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))) { var _this$ws$queue$curren7; const $item = document.createElement("div"); $item.className = "queue-item no-transition"; $item.classList.toggle("current", item.id === ((_this$ws$queue$curren7 = this.ws.queue.current.item.revid) !== null && _this$ws$queue$curren7 !== void 0 ? _this$ws$queue$curren7 : this.ws.queue.current.item.id)); $item.innerHTML = this.generateItemHTML(item); $history.appendChild($item); $item.addEventListener("mouseover", () => this.ws.queue.propagate(item, true)); $item.addEventListener("click", () => this.ws.queue.loadFromItem(item)); $item.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); requestAnimationFrame(() => $item.classList.remove("no-transition")); } }; load(controller.signal).catch(err => { if (controller.signal.aborted) return; console.error("Error loading history:", err); }); } this.updateDiffDisplay(item, false); } updateDiffDisplay(item, consecutive) { var _$changes$; const $diff = document.querySelector("#diff-container"); if (!item) { document.querySelector("#diff-scroll-up").classList.add("hidden"); document.querySelector("#diff-scroll-down").classList.add("hidden"); return; } else if (item === "loading") { const $container = document.createElement("div"); $container.className = "loading-container"; const $spinner = document.createElement("div"); $spinner.className = "loading-spinner"; $container.appendChild($spinner); const $icon = document.createElement("i"); $icon.className = "fas fa-spinner fa-spin"; $spinner.appendChild($icon); const $text = document.createElement("div"); $text.className = "loading-text animate-loading-dots"; $text.textContent = "Loading edit"; $container.appendChild($text); return void ($diff.innerHTML = $container.outerHTML); } document.querySelectorAll("#right-top > .tabs > .tab.selected").forEach($tab => $tab.classList.remove("selected")); this.generateEditDetails(item, consecutive); switch (_queue.Queue.groups[item.type]) { case "edit": { var _item$diff, _item$consecutive3; const pending = this.ws.queue.pending.get(item.id); if (pending) $diff.innerHTML = `<table>${(_item$diff = item.diff) !== null && _item$diff !== void 0 ? _item$diff : "<em>No diff available</em>"}</table>`; else if (consecutive && ((_item$consecutive3 = item.consecutive) === null || _item$consecutive3 === void 0 ? void 0 : _item$consecutive3.count) > 1) { var _item$consecutive$dif, _item$consecutive$dif2; document.querySelector("#consecutive-edits-tab").classList.add("selected"); if ((_item$consecutive$dif = item.consecutive.diff) !== null && _item$consecutive$dif !== void 0 ? _item$consecutive$dif : true) $diff.innerHTML = `<table>${(_item$consecutive$dif2 = item.consecutive.diff) !== null && _item$consecutive$dif2 !== void 0 ? _item$consecutive$dif2 : "<em>No diff available</em>"}</table>`; else $diff.innerHTML = `<table><em>No difference</em></table>`; } else { var _item$diff2; document.querySelector("#latest-edits-tab").classList.add("selected"); $diff.innerHTML = `<table>${(_item$diff2 = item.diff) !== null && _item$diff2 !== void 0 ? _item$diff2 : "<em>No diff available</em>"}</table>`; } if (this.ws.store.settings.username_highlighting.enabled) { const username = this.ws.api.username; if (username) { if (item.mentions.diff) $diff.querySelectorAll("td").forEach($td => { if ($td.textContent && this.ws.util.match(username, $td.textContent)) $td.classList.add("ws-username-highlight"); }); if (item.mentions.comment) if (item.comment && this.ws.util.match(username, item.comment)) document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"); } } } break; case "logevent": { switch (item.type) { case "users": { $diff.innerHTML = ""; const evaluation = item.user.profanity; const $container = document.createElement("div"); $container.classList.add("profanity"); $diff.appendChild($container); const $header = document.createElement("div"); { $header.classList.add("profanity-header"); $container.appendChild($header); const $score = document.createElement("div"); { $score.classList.add("profanity-score"); $header.appendChild($score); const $label = document.createElement("span"); $label.classList.add("score-label"); $label.textContent = "Profanity Score:"; $score.appendChild($label); const $value = document.createElement("span"); $value.classList.add("score-value"); $value.textContent = evaluation.finalScore; $score.appendChild($value); } const $risk = document.createElement("div"); { $risk.classList.add("profanity-risk", `risk-${evaluation.risk.toLowerCase()}`); $header.appendChild($risk); const $icon = document.createElement("span"); $icon.classList.add("fa"); switch (evaluation.risk) { case "No": { $icon.classList.add("fa-smile"); } break; case "Low": { $icon.classList.add("fa-thumbs-up"); } break; case "Medium": { $icon.classList.add("fa-meh"); } break; case "High": { $icon.classList.add("fa-thumbs-down"); } break; case "Critical": { $icon.classList.add("fa-skull-crossbones"); } break; } $risk.appendChild($icon); const $label = document.createElement("span"); $label.textContent = `${evaluation.risk} risk`; $risk.appendChild($label); } } const matches = evaluation.matches; if (matches.length > 0) { const $header = document.createElement("div"); $header.classList.add("profanity-matches-header"); $container.appendChild($header); const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-search"); $header.appendChild($icon); const $text = document.createElement("span"); $text.textContent = `Matched Terms (${matches.length})`; $header.appendChild($text); const $matches = document.createElement("div"); $matches.classList.add("profanity-matches-list"); $container.appendChild($matches); for (const match of matches) { const $match = document.createElement("div"); { $match.classList.add("profanity-match"); $matches.appendChild($match); const $header = document.createElement("div"); { $header.classList.add("match-header"); $match.appendChild($header); const $text = document.createElement("span"); { $text.classList.add("match-text"); $text.textContent = match.match; $header.appendChild($text); } const $arrow = document.createElement("span"); { $arrow.classList.add("fa", "fa-arrow-right"); $header.appendChild($arrow); } const $name = document.createElement("span"); { $name.classList.add("match-name"); $name.textContent = match.name; $header.appendChild($name); } } const $details = document.createElement("div"); { $details.classList.add("match-details"); $match.appendChild($details); const $confidence = document.createElement("div"); { $confidence.classList.add("match-stat"); $details.appendChild($confidence); const $label = document.createElement("span"); { $label.classList.add("stat-label"); $label.textContent = "Confidence"; $confidence.appendChild($label); } const $value = document.createElement("span"); { $value.classList.add("stat-value"); $value.dataset.tooltip = "How certain we are this is a match."; $value.dataset.tooltipDelay = 500; $value.textContent = `${Math.round(match.confidence * 100)}%`; $confidence.appendChild($value); } } const $obfuscation = document.createElement("div"); { $obfuscation.classList.add("match-stat"); $details.appendChild($obfuscation); const $label = document.createElement("span"); { $label.classList.add("stat-label"); $label.textContent = "Obfuscation"; $obfuscation.appendChild($label); } const $value = document.createElement("span"); { $value.classList.add("stat-value"); $value.dataset.tooltip = "How much the term was altered from its original form."; $value.dataset.tooltipDelay = 500; $value.textContent = `${Math.round(match.obfuscation * 100)}%`; $obfuscation.appendChild($value); } } const $severity = document.createElement("div"); { $severity.classList.add("match-stat"); $details.appendChild($severity); const $label = document.createElement("span"); { $label.classList.add("stat-label"); $label.textContent = "Severity"; $severity.appendChild($label); } const $value = document.createElement("span"); { $value.classList.add("stat-value", `severity-${match.severity}`); $value.dataset.tooltip = "How severe this term is considered."; $value.dataset.tooltipDelay = 500; $value.textContent = match.severity; $severity.appendChild($value); } } } if (match.note) { const $note = document.createElement("div"); { $note.classList.add("match-note"); $match.appendChild($note); const $icon = document.createElement("span"); { $icon.classList.add("fa", "fa-info-circle"); $note.appendChild($icon); } const $text = document.createElement("span"); { $text.classList.add("note-text"); $text.textContent = match.note; $note.appendChild($text); } } } } $match.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); } } else { const $noMatches = document.createElement("div"); $noMatches.classList.add("profanity-no-matches"); $container.appendChild($noMatches); const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-check-circle"); $noMatches.appendChild($icon); const $text = document.createElement("span"); $text.textContent = "No profanity detected."; $noMatches.appendChild($text); } } break; } } break; case "abuselog": { var _item$diff3; $diff.innerHTML = `<table>${(_item$diff3 = item.diff) !== null && _item$diff3 !== void 0 ? _item$diff3 : "<em>No diff available</em>"}</table>`; if (this.ws.store.settings.username_highlighting.enabled) { const username = this.ws.api.username; if (username) { if (item.mentions.diff) $diff.querySelectorAll("td").forEach($td => { if ($td.textContent && this.ws.util.match(username, $td.textContent)) $td.classList.add("ws-username-highlight"); }); if (item.mentions.comment) if (item.comment && this.ws.util.match(username, item.comment)) document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"); } } } break; } $diff.querySelectorAll(":is(.mw-diff-movedpara-left, .mw-diff-movedpara-right)").forEach($el => { const href = $el.href.split("#")[1]; delete $el.href; $el.innerHTML = $el.classList.contains("mw-diff-movedpara-left") ? ">" : "<"; $el.addEventListener("click", e => { e.preventDefault(); const $target = $diff.querySelector(`a[name="${href}"]`); if ($target) { const targetRect = $target.getBoundingClientRect(); const diffRect = $diff.getBoundingClientRect(); const elementOffset = targetRect.top - diffRect.top + $diff.scrollTop; const targetScroll = elementOffset - (diffRect.height - targetRect.height) / 2; $diff.scrollTo({ top: Math.max(0, targetScroll), behavior: "smooth" }); $diff.querySelectorAll(".flash-highlight").forEach($old => $old.classList.remove("flash-highlight")); const $highlight = $target.parentElement.parentElement; $highlight.classList.add("flash-highlight"); setTimeout(() => { var _$highlight$classList; return $highlight === null || $highlight === void 0 || (_$highlight$classList = $highlight.classList) === null || _$highlight$classList === void 0 ? void 0 : _$highlight$classList.remove("flash-highlight"); }, 3e3); } }); }); const $lines = $diff.querySelectorAll(".diff-addedline, .diff-deletedline"); const $changes = $diff.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange"); const $scroll = (_$changes$ = $changes[0]) !== null && _$changes$ !== void 0 ? _$changes$ : $lines[0]; if ($scroll) requestAnimationFrame(() => { const scrollRect = $scroll.getBoundingClientRect(); const diffRect = $diff.getBoundingClientRect(); const elementOffset = scrollRect.top - diffRect.top + $diff.scrollTop; const targetScroll = elementOffset - (diffRect.height - scrollRect.height) / 2; $diff.scrollTo({ top: Math.max(0, targetScroll), behavior: "smooth" }); function updateOffScreen() { const $changes = $diff.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange"); let $above = null, $below = null; const rect = $diff.getBoundingClientRect(); for (const $change of $changes) { let thisAbove = false, thisBelow = false; const changeRect = $change.getBoundingClientRect(); if (changeRect.bottom < rect.top) thisAbove = true; if (changeRect.top > rect.bottom) thisBelow = true; if (!(thisAbove && thisBelow)) { if (thisAbove) $above = $change; if ($below === null && thisBelow) $below = $change; } } const $scrollUp = document.querySelector("#diff-scroll-up"); $scrollUp.classList.toggle("hidden", !$above); $scrollUp.onclick = () => { const aboveRect = $above.getBoundingClientRect(); const diffRect = $diff.getBoundingClientRect(); const elementOffset = aboveRect.top - diffRect.top + $diff.scrollTop; const targetScroll = elementOffset - (diffRect.height - aboveRect.height) / 2; $diff.scrollTo({ top: Math.max(0, targetScroll), behavior: "smooth" }); $above.classList.add("flash-highlight"); setTimeout(() => { var _$above; return (_$above = $above) === null || _$above === void 0 || (_$above = _$above.classList) === null || _$above === void 0 ? void 0 : _$above.remove("flash-highlight"); }, 3e3); }; const $scrollDown = document.querySelector("#diff-scroll-down"); $scrollDown.classList.toggle("hidden", !$below); $scrollDown.onclick = () => { const belowRect = $below.getBoundingClientRect(); const diffRect = $diff.getBoundingClientRect(); const elementOffset = belowRect.top - diffRect.top + $diff.scrollTop; const targetScroll = elementOffset - (diffRect.height - belowRect.height) / 2; $diff.scrollTo({ top: Math.max(0, targetScroll), behavior: "smooth" }); $below.classList.add("flash-highlight"); setTimeout(() => { var _$below; return (_$below = $below) === null || _$below === void 0 || (_$below = _$below.classList) === null || _$below === void 0 ? void 0 : _$below.remove("flash-highlight"); }, 3e3); }; } updateOffScreen(); $diff.onscroll = () => requestAnimationFrame(updateOffScreen); window.onresize = () => requestAnimationFrame(updateOffScreen); }); else { document.querySelector("#diff-scroll-up").classList.add("hidden"); document.querySelector("#diff-scroll-down").classList.add("hidden"); } } updateAIAnalysisDisplay(analysis) { const $analysis = document.querySelector("#ai-analysis-container"); if ($analysis && analysis) $analysis.classList.remove("hidden"); else return $analysis.classList.add("hidden"); if (analysis.error) { const $assessment = $analysis.querySelector(":scope > .header > .assessment"); $assessment.textContent = "Error"; $assessment.className = "assessment error"; $analysis.querySelector(":scope > .header > .confidence").textContent = ""; $analysis.querySelector(":scope > .explanation").textContent = analysis.error; const $issues = $analysis.querySelector(":scope > .issues"); $issues.innerHTML = ""; } else { const $assessment = $analysis.querySelector(":scope > .header > .assessment"); $assessment.textContent = analysis.assessment; $assessment.className = `assessment ${analysis.assessment.toLowerCase().replace(/\s+/g, "-")}`; $analysis.querySelector(":scope > .header > .confidence").textContent = `${Math.round((analysis.confidence || 0) * 100)}% confidence`; const explanationHtml = _assertClassBrand(_GUI_brand, this, _sanitizeInlineHtml).call(this, analysis.explanation || "No explanation provided."); $analysis.querySelector(":scope > .explanation").innerHTML = explanationHtml; const $issues = $analysis.querySelector(":scope > .issues"); $issues.innerHTML = ""; for (const issue of analysis.issues || []) { const $issue = document.createElement("div"); $issue.classList.add("issue", issue.severity.toLowerCase().replace(/\s+/g, "-")); $issue.textContent = issue.policy; $issues.appendChild($issue); } $analysis.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); } } async outdated(item) { let type = item.type, id = item.id; if (type === "abuselog" && item.revid) { type = "edit"; id = item.revid; } if (_queue.Queue.groups[type] !== "edit") { this.toggleOutdatedNotice(false); this.togglePendingNotice(false); return; } if (item.type === "pending") return this.togglePendingNotice(!this.ws.queue.pending.has(id), true); else if (!item.pending && this.ws.queue.type === "pending") return this.togglePendingNotice(true, false); try { var _this$ws$queue$curren8; const newer = (await this.ws.api.getLatestIds([ item.page.title ]))[item.page.title]; if (((_this$ws$queue$curren8 = this.ws.queue.current.item) === null || _this$ws$queue$curren8 === void 0 ? void 0 : _this$ws$queue$curren8.id) === item.id) this.toggleOutdatedNotice(newer > id, newer, item.page.title, id); } catch (error) { console.error("Error checking if edit is outdated:", error); this.toggleOutdatedNotice(false); } } startOutdatedCheck(item) { this.stopOutdatedCheck(); this.outdated(item); this.intervals.outdated = setInterval(() => { var _this$ws$queue$curren9; if (item.id === ((_this$ws$queue$curren9 = this.ws.queue.current.item) === null || _this$ws$queue$curren9 === void 0 ? void 0 : _this$ws$queue$curren9.id)) this.outdated(item); else this.stopOutdatedCheck(); }, 1e3); } stopOutdatedCheck() { if (this.intervals.outdated) { clearInterval(this.intervals.outdated); this.intervals.outdated = null; } this.toggleOutdatedNotice(false); this.togglePendingNotice(false); } toggleEditWarNotice(show, count) { const $exists = document.querySelector("#edit-war-notice"); show !== null && show !== void 0 ? show : show = !$exists; if (show === Boolean($exists)) return; if (show) { const $notice = document.createElement("div"); $notice.id = "edit-war-notice"; $notice.classList.add("notice", "edit-war"); const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-warning"); $notice.appendChild($icon); const $text = document.createElement("span"); $text.classList.add("text"); $text.innerHTML = `<b>3RR:</b> You have made ${count} reverts on this page in the last 24 hours.`; $notice.appendChild($text); const $diff = document.querySelector("#diff-container"); $diff.parentElement.insertBefore($notice, $diff); } else { const $notice = document.querySelector("#edit-war-notice"); if ($notice) $notice.remove(); } } toggleOutdatedNotice(show, newer, page, current) { const $exists = document.querySelector("#outdated-notice"); show !== null && show !== void 0 ? show : show = !$exists; if (show === Boolean($exists)) { if ($exists) { $exists.dataset.id = newer; $exists.dataset.page = page; } return; } if (show) { const $notice = document.createElement("div"); $notice.id = "outdated-notice"; $notice.classList.add("notice", "outdated"); $notice.dataset.id = newer; $notice.dataset.page = page; const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-clock-rotate-left"); $notice.appendChild($icon); const $text = document.createElement("span"); $text.classList.add("text"); $text.textContent = "Newer revision available on this page."; $notice.appendChild($text); const $restore = document.createElement("span"); $restore.classList.add("button"); $restore.innerHTML = "<i class='fas fa-redo restore'></i> Restore this revision"; $restore.addEventListener("click", async e => { e.preventDefault(); const message = await this.dialog.input("Restore Edit", "Are you sure you want to restore this revision? This will create a new edit that reverts the page to this revision.", "Edit summary (optional)", ""); if (message !== null) this.ws.execute({ actions: [ { name: "restore-edit", params: { summary: message } } ] }); }); $notice.appendChild($restore); const $latest = document.createElement("span"); $latest.classList.add("button"); $latest.innerHTML = "View latest <i class='fas fa-arrow-right'></i>"; $latest.addEventListener("click", e => { e.preventDefault(); const page = $notice.dataset.page; const id = +$notice.dataset.id; if (page && id) this.ws.queue.loadFromRevision(page, id); }); $notice.appendChild($latest); const $diff = document.querySelector("#diff-container"); $diff.parentElement.insertBefore($notice, $diff); } else { const $notice = document.querySelector("#outdated-notice"); if ($notice) $notice.remove(); } } togglePendingNotice(show, pending) { const $exists = document.querySelector("#pending-notice"); show !== null && show !== void 0 ? show : show = !$exists; if (show === Boolean($exists)) return; if (show) { const $notice = document.createElement("div"); $notice.id = "pending-notice"; $notice.classList.add("notice", "outdated", "pending"); const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-shield-alt"); $notice.appendChild($icon); const $text = document.createElement("span"); $text.classList.add("text"); $text.textContent = pending ? "This revision cannot be reviewed because it is outdated" : "This revision cannot be reviewed because it is not pending review"; $notice.appendChild($text); const $diff = document.querySelector("#diff-container"); $diff.parentElement.insertBefore($notice, $diff); } else { const $notice = document.querySelector("#pending-notice"); if ($notice) $notice.remove(); } } getORESColor(ores) { if (isNaN(ores) || ores < 0) return "rgba(128, 128, 128, .5)"; // Grey for unknown ores = Math.min(Math.max(ores || 0, 0), 1); const palette = GUI.palettes[this.ws.store.UI.theme.palette]; return palette[ores * (palette.length - 1) | 0]; } updatePalette() { document.querySelectorAll("[data-ores]").forEach($el => { $el.style.setProperty("--ores-color", this.getORESColor(parseFloat($el.dataset.ores))); }); } updateZenMode() { this.ws.notifications.count(); const zen = this.ws.store.settings.zen_mode; if (zen.enabled && zen.music.enabled) this.ws.audio.zengine.start(); else this.ws.audio.zengine.stop(); document.querySelectorAll("[data-zen-show]").forEach($el => { const keys = $el.dataset.zenShow.split(","); if (zen.enabled && !keys.some(key => { var _zen$key; return (_zen$key = zen[key]) === null || _zen$key === void 0 ? void 0 : _zen$key.enabled; })) $el.style.display = "none"; else $el.style.display = ""; }); } updateAccessibility() { document.body.classList.toggle("colorblind-mode", this.ws.store.settings.accessibility.colorblind); document.body.classList.toggle("dyslexia-font", this.ws.store.settings.accessibility.dyslexia); document.body.classList.toggle("high-contrast", this.ws.store.settings.accessibility.high_contrast); document.body.classList.toggle("reduce-motion", this.ws.store.settings.accessibility.reduce_motion); } reorderQueues() { var _queues$find; const queues = _queue.Queue.types.map(type => ({ name: type, ...this.ws.store.settings.queue[type] })); queues.sort((a, b) => a.order - b.order); queues.forEach(queue => { const $tab = document.querySelector(`#queue-tab-${queue.name}`); if ($tab) { $tab.style.display = queue.enabled ? "" : "none"; $tab.parentElement.appendChild($tab); } }); const tab = queues.find(q => q.name === this.ws.queue.current.type) ? this.ws.queue.current.type : (_queues$find = queues.find(q => q.enabled)) === null || _queues$find === void 0 ? void 0 : _queues$find.name; if (tab) this.ws.queue.switch(tab); else { const $empty = document.createElement("div"); $empty.classList.add("queue-empty"); $empty.textContent = "No items in queue"; document.querySelector("#queue-items").innerHTML = $empty.outerHTML; this.newCurrentItem(null); this.ws.queue.switch("void"); } } updateQueueTabs(types = _queue.Queue.types) { const queues = this.ws.queue.queues; types.forEach(type => { const $tab = document.querySelector(`#queue-tab-${type}`); if (!$tab || !queues[type]) return; const $count = $tab.querySelector(":scope > span > .icon-count"); const len = queues[type].queue.length; $count.classList.toggle("hidden", len === 0); $count.textContent = len; $tab.classList.toggle("mentions-me", this.ws.store.settings.username_highlighting.enabled && queues[type].queue.some(item => item.mentions.has)); }); } createTooltip($target, className = "", content = "", isHTML = false, delay = 10, callback = null) { const $tooltip = document.createElement("div"); $tooltip.className = `tooltip ${className}`; $tooltip.style.opacity = 0; if (isHTML) $tooltip.innerHTML = content; else $tooltip.textContent = content; document.body.querySelector("#app").appendChild($tooltip); if (typeof callback === "function") callback($tooltip); $tooltip.offsetHeight; // Force reflow const tooltipRect = $tooltip.getBoundingClientRect(); const tw = tooltipRect.width; const th = tooltipRect.height; const targetRect = $target.getBoundingClientRect(); const gap = 10; const vw = innerWidth; const vh = innerHeight; // Position candidates: [name, x, y, shouldShift] const positions = [ // Try below first [ "bottom", (targetRect.left + targetRect.right) / 2 - tw / 2, targetRect.bottom + gap, true ], // Try above [ "top", (targetRect.left + targetRect.right) / 2 - tw / 2, targetRect.top - th - gap, true ], // Try right [ "right", targetRect.right + gap, (targetRect.top + targetRect.bottom) / 2 - th / 2, true ], // Try left [ "left", targetRect.left - tw - gap, (targetRect.top + targetRect.bottom) / 2 - th / 2, true ] ]; let bestPosition = null; let bestScore = -Infinity; for (const [name, x, y, canShift] of positions) { let posX = x, posY = y; // Check if position fits without wrapping if (posX >= 0 && posX + tw <= vw && posY >= 0 && posY + th <= vh) { // Perfect fit - score high bestScore = 100; bestPosition = [ posX, posY ]; break; } // If can shift, try to fit it within bounds if (canShift) { const shiftedX = Math.max(0, Math.min(posX, vw - tw)); const shiftedY = Math.max(0, Math.min(posY, vh - th)); // Check if shifted position overlaps target const overlaps = !(shiftedX + tw <= targetRect.left || shiftedX >= targetRect.right || shiftedY + th <= targetRect.top || shiftedY >= targetRect.bottom); // Score based on overlap and shift distance const shiftDist = Math.abs(shiftedX - x) + Math.abs(shiftedY - y); const score = overlaps ? -50 - shiftDist : 50 - shiftDist / 10; if (score > bestScore) { bestScore = score; bestPosition = [ shiftedX, shiftedY ]; } } } // Apply best position found if (bestPosition) { $tooltip.style.left = `${bestPosition[0]}px`; $tooltip.style.top = `${bestPosition[1]}px`; } else { // Last resort fallback $tooltip.style.left = `${Math.max(0, Math.min((targetRect.left + targetRect.right) / 2 - tw / 2, vw - tw))}px`; $tooltip.style.top = `${Math.max(0, Math.min((targetRect.top + targetRect.bottom) / 2 - th / 2, vh - th))}px`; } $target.addEventListener("mousewheel", e => $tooltip.scrollBy({ left: e.deltaX, top: e.deltaY, behavior: "smooth" })); setTimeout(() => $tooltip.style.opacity = 1, delay); return $tooltip; } removeTooltips() { document.querySelectorAll(".tooltip").forEach($tooltip => $tooltip.remove()); } addTooltipListener($el) { if (!$el.dataset.tooltip) return; let $tooltip; $el.addEventListener("mouseenter", () => { if (!$el.dataset.tooltip) return; else if ($tooltip) $tooltip.remove(); $tooltip = this.createTooltip($el, "", $el.dataset.tooltip, $el.dataset.tooltipHtml === "true", +$el.dataset.tooltipDelay || 100); }); $el.addEventListener("mouseleave", () => { if ($tooltip) { $tooltip.remove(); $tooltip = null; } }); } positionBottomMenu($button, $menu) { // Reset positioning $menu.style.left = ""; $menu.style.right = ""; $menu.style.top = ""; $menu.style.bottom = ""; const position = () => { if (!$menu.classList.contains("show")) return; const menuRect = $menu.getBoundingClientRect(); const buttonRect = $button.getBoundingClientRect(); const vw = innerWidth; const vh = innerHeight; const fitsLeft = buttonRect.left + menuRect.width <= vw; if (fitsLeft) { $menu.style.left = `${buttonRect.left}px`; $menu.style.right = "auto"; } else { $menu.style.right = `${vw - buttonRect.right}px`; $menu.style.left = "auto"; } const fitsAbove = buttonRect.top >= menuRect.height; if (fitsAbove) { $menu.style.bottom = `${vh - buttonRect.top}px`; $menu.style.top = "auto"; } else { $menu.style.top = `${buttonRect.bottom}px`; $menu.style.bottom = "auto"; } requestAnimationFrame(() => position()); }; requestAnimationFrame(() => position()); } positionSubmenu($submenu, $trigger) { // Reset positioning $submenu.style.left = ""; $submenu.style.right = ""; $submenu.style.top = ""; $submenu.style.bottom = ""; const position = () => { if (!$submenu.classList.contains("show")) return; const submenuRect = $submenu.getBoundingClientRect(); const triggerRect = $trigger.getBoundingClientRect(); const vw = innerWidth; const vh = innerHeight; const spaceRight = vw - triggerRect.right; const spaceLeft = triggerRect.left; if (spaceRight < submenuRect.width + 20 && spaceLeft > spaceRight) { $submenu.style.left = "auto"; $submenu.style.right = "calc(100% + 4px)"; } const spaceBelow = vh - triggerRect.bottom; const spaceAbove = triggerRect.top; if (submenuRect.bottom > vh && spaceAbove > spaceBelow) { $submenu.style.top = "auto"; $submenu.style.bottom = "0"; } requestAnimationFrame(() => position()); }; requestAnimationFrame(() => position()); } positionLevelsMenu($button, $menu) { // Reset previous positioning $menu.style.left = ""; $menu.style.right = ""; $menu.style.top = ""; $menu.style.bottom = ""; const position = () => { if (!$menu.classList.contains("show")) return; const menuRect = $menu.getBoundingClientRect(); const buttonRect = $button.getBoundingClientRect(); const vw = innerWidth; const vh = innerHeight; const spaceRight = vw - buttonRect.right; const spaceLeft = buttonRect.left; const fitsRight = spaceRight >= menuRect.width + 8; const fitsLeft = spaceLeft >= menuRect.width + 8; if (fitsRight) { $menu.style.left = `${buttonRect.right + 8}px`; $menu.style.right = "auto"; } else if (fitsLeft) { $menu.style.right = `${vw - buttonRect.left + 8}px`; $menu.style.left = "auto"; } else { if (spaceRight > spaceLeft) { $menu.style.left = `${buttonRect.right + 8}px`; $menu.style.right = "auto"; } else { $menu.style.right = `${vw - buttonRect.left + 8}px`; $menu.style.left = "auto"; } } const top = Math.max(Math.min(buttonRect.top + (buttonRect.height - menuRect.height) / 2, vh - menuRect.height - 8), 8); $menu.style.top = `${top}px`; $menu.style.bottom = "auto"; requestAnimationFrame(() => position()); }; requestAnimationFrame(() => position()); } positionWarningSubmenu($submenu, $trigger) { // Reset previous positioning $submenu.style.left = ""; $submenu.style.right = ""; $submenu.style.top = ""; $submenu.style.bottom = ""; const position = () => { if (!$submenu.classList.contains("show")) return; const submenuRect = $submenu.getBoundingClientRect(); const triggerRect = $trigger.getBoundingClientRect(); const vw = innerWidth; const vh = innerHeight; const spaceRight = vw - triggerRect.right; const spaceLeft = triggerRect.left; const fitsRight = spaceRight >= submenuRect.width + 8; const fitsLeft = spaceLeft >= submenuRect.width + 8; if (fitsRight) { $submenu.style.left = `${triggerRect.right + 8}px`; $submenu.style.right = "auto"; } else if (fitsLeft) { $submenu.style.right = `${vw - triggerRect.left + 8}px`; $submenu.style.left = "auto"; } else { if (spaceRight > spaceLeft) { $submenu.style.left = `${triggerRect.right + 8}px`; $submenu.style.right = "auto"; } else { $submenu.style.right = `${vw - triggerRect.left + 8}px`; $submenu.style.left = "auto"; } } const top = Math.max(Math.min(triggerRect.top + (triggerRect.height - submenuRect.height) / 2, vh - submenuRect.height - 8), 8); $submenu.style.top = `${top}px`; $submenu.style.bottom = "auto"; requestAnimationFrame(() => position()); }; requestAnimationFrame(() => position()); } createWarningItem(warning, executeWithWarn, executeNoWarn, key, isFavorite = false) { const favorites = this.ws.store.favorite[key]; const $item = document.createElement("div"); $item.classList.add("warning-menu-item"); if (isFavorite) { $item.draggable = true; $item.classList.add("favorite-item"); } else $item.classList.add("submenu-option"); $item.dataset.warning = warning.title; const $star = document.createElement("span"); $star.classList.add("favorite-star"); if (favorites.includes(warning.title)) { $star.classList.add("favorited"); $star.innerHTML = "<i class='fas fa-star'></i>"; } else $star.innerHTML = "<i class='fa-regular fa-star'></i>"; $item.appendChild($star); $star.addEventListener("click", e => { e.stopPropagation(); const i = favorites.indexOf(warning.title); const $menu = key === "reverts" ? document.querySelector("#revert-menu > .warning-menu") : document.querySelector("#warn-menu > .warning-menu"); if (i === -1) { favorites.push(warning.title); $star.classList.add("favorited", "spin"); $star.innerHTML = "<i class='fas fa-star'></i>"; let $favorites = $menu.querySelector(".favorites-section"); if (!$favorites) { $favorites = document.createElement("div"); $favorites.className = "favorites-section"; const $header = document.createElement("div"); $header.className = "favorites-header"; $header.innerHTML = '<span class="icon fas fa-star"></span><span>Favorites</span>'; $favorites.appendChild($header); const $container = document.createElement("div"); $container.className = "favorites-container"; $favorites.appendChild($container); $menu.insertBefore($favorites, $menu.firstChild); const $separator = document.createElement("div"); $separator.className = "favorites-separator"; $menu.insertBefore($separator, $favorites.nextSibling); } const executeCallbacks = $menu.__executeCallbacks__; if (executeCallbacks) $favorites.querySelector(".favorites-container").appendChild(this.createWarningItem(warning, executeCallbacks.executeWithWarn, executeCallbacks.executeNoWarn, key, true)); } else { favorites.splice(i, 1); $star.classList.remove("favorited"); $star.classList.add("spin"); $star.innerHTML = "<i class='fa-regular fa-star'></i>"; if (isFavorite) { $item.remove(); const $favorites = $menu.querySelector(".favorites-section"); if (($favorites === null || $favorites === void 0 ? void 0 : $favorites.querySelector(".favorites-container").children.length) === 0) { var _$menu$querySelector; $favorites.remove(); (_$menu$querySelector = $menu.querySelector(".favorites-separator")) === null || _$menu$querySelector === void 0 || _$menu$querySelector.remove(); } const $subitem = document.body.querySelector(`.warning-menu-item:not(.favorite-item)[data-warning="${warning.title}"]`); if ($subitem) { const $star = $subitem.querySelector(".favorite-star"); $star.classList.remove("favorited"); $star.innerHTML = "<i class='fa-regular fa-star'></i>"; $star.classList.add("spin"); setTimeout(() => $star.classList.remove("spin"), 500); } } else { const $favorites = $menu.querySelector(".favorites-section"); if ($favorites) { const $favorite = $favorites.querySelector(`[data-warning="${warning.title}"]`); if ($favorite) { $favorite.remove(); if ($favorites.querySelector(".favorites-container").children.length === 0) { var _$menu$querySelector2; $favorites.remove(); (_$menu$querySelector2 = $menu.querySelector(".favorites-separator")) === null || _$menu$querySelector2 === void 0 || _$menu$querySelector2.remove(); } } } } } setTimeout(() => $star.classList.remove("spin"), 500); }); const $icon = document.createElement("span"); $icon.className = `icon ${warning.icon}`; $item.appendChild($icon); const $label = document.createElement("span"); $label.className = "warning-menu-title"; $label.textContent = warning.title; $item.appendChild($label); const $helpIcon = document.createElement("span"); $helpIcon.className = "fas fa-circle-question"; $helpIcon.dataset.tooltip = `${warning.description} (click for template preview)`; $item.appendChild($helpIcon); this.addTooltipListener($helpIcon); $helpIcon.addEventListener("click", async event => { event.preventDefault(); event.stopPropagation(); const ws = this.ws; this.dialog.show(warning.title, async function() { const previews = await Promise.allSettled(warning.templates.map(template => { const item = ws.queue.current.item; return ws.api.parse(`{{${template.template}|${item.page.title}}}`, `User:${item.user.name}`, true); })); const content = previews.map(result => { let html = ""; if (result.status === "fulfilled") html = result.value; else html = `<em>Error loading template preview: ${result.reason}</em>`; const parser = new DOMParser; const doc = parser.parseFromString(html, "text/html"); const $preview = doc.body; $preview.querySelectorAll("[href]").forEach($link => { const href = $link.getAttribute("href"); $link.setAttribute("href", new URL(href, `https://${ws.server}`).href); }); $preview.querySelectorAll("[src]").forEach($img => { const src = $img.getAttribute("src"); $img.setAttribute("src", new URL(src, `https://${ws.server}`).href); }); $preview.querySelectorAll("[srcset]").forEach($img => { const srcset = $img.getAttribute("srcset"); const newSrcset = srcset.split(",").map(part => { const [url, descriptor] = part.trim().split(/\s+/, 2); const newUrl = new URL(url, `https://${ws.server}`).href; return descriptor ? `${newUrl} ${descriptor}` : newUrl; }).join(", "); $img.setAttribute("srcset", newSrcset); }); return $preview.innerHTML; }); return content.join("<div style='height: 1px; background: #0004; margin: 8px 0;'></div>"); }()); }); if (!isFavorite) { const $button = document.createElement("div"); $button.classList.add("warning-menu-buttons"); if (key === "reverts") { const $noWarn = document.createElement("span"); $noWarn.className = "warning-menu-button warning-menu-no-warn-button"; $noWarn.textContent = "no warn"; $button.appendChild($noWarn); $noWarn.addEventListener("click", async e => { e.stopPropagation(); await executeNoWarn(warning.title); }); } const $levelsButton = document.createElement("span"); $levelsButton.className = "warning-menu-button warning-menu-levels-button"; $levelsButton.textContent = "advanced"; $button.appendChild($levelsButton); $item.appendChild($button); const $levelsMenu = document.createElement("div"); $levelsMenu.className = "levels-menu"; for (const template of warning.templates) { if (template.generic) continue; const $levelButton = document.createElement("span"); $levelButton.className = `levels-menu-item colorize-level colorize-level-${template.name}`; $levelButton.textContent = template.name; $levelsMenu.appendChild($levelButton); $levelButton.addEventListener("click", async () => await executeWithWarn(warning.title, template.name)); } document.body.querySelector("#app").appendChild($levelsMenu); $levelsButton.addEventListener("click", e => { e.stopPropagation(); const wasShown = $levelsMenu.classList.contains("show"); document.body.querySelectorAll(".levels-menu.show").forEach(menu => menu.classList.remove("show")); if (!wasShown) { $levelsMenu.classList.add("show"); this.positionLevelsMenu($levelsButton, $levelsMenu); } }); } $item.addEventListener("click", async e => { if (e.target.closest(".warning-menu-button") || e.target.closest(".favorite-star")) return; await executeWithWarn(warning.title, "auto"); }); if (isFavorite) { $item.addEventListener("dragstart", e => { e.dataTransfer.effectAllowed = "move"; e.dataTransfer.setData("text/plain", warning.title); $item.classList.add("dragging"); }); $item.addEventListener("dragend", () => { $item.classList.remove("dragging"); }); $item.addEventListener("dragover", e => { e.preventDefault(); e.dataTransfer.dropEffect = "move"; const draggingItem = document.querySelector(".dragging"); if (draggingItem && draggingItem !== $item) { const rect = $item.getBoundingClientRect(); const midpoint = rect.top + rect.height / 2; if (e.clientY < midpoint) $item.parentNode.insertBefore(draggingItem, $item); else $item.parentNode.insertBefore(draggingItem, $item.nextSibling); } }); $item.addEventListener("drop", e => { e.preventDefault(); const favoriteItems = Array.from($item.closest(".favorites-section").querySelectorAll(".favorite-item")); this.ws.store.favorite[key] = favoriteItems.map(el => el.dataset.warning); }); } return $item; } createWarnMenu(type, $container, item) { var _this$ws$queue$curren0, _this$ws$queue$curren1, _this$ws$queue$curren10; removeEventListener("keydown", this.warningMenuKeyListener); document.querySelectorAll(".levels-menu").forEach($menu => $menu.remove()); document.querySelectorAll(".warning-submenu").forEach($submenu => $submenu.remove()); const $menu = document.createElement("div"); $menu.className = "warning-menu"; $container.appendChild($menu); $menu.addEventListener("click", e => { if (!e.target.closest(".warning-submenu")) document.body.querySelectorAll(".warning-submenu.show").forEach($submenu => $submenu.classList.remove("show")); if (!e.target.closest(".levels-menu")) document.body.querySelectorAll(".levels-menu.show").forEach($menu => $menu.classList.remove("show")); }); const executeWithWarn = async (warningTitle, level) => { const warning = (0, _warnings.getWarningFromLookup)(warningTitle); const reportObject = { name: "if", condition: { name: "user-final-warning" }, actions: [ { name: "report-user-to-aiv", params: { reportMessage: "Vandalism past final warning" } } ] }; const autoReporting = this.ws.store.settings.auto_report; await this.ws.execute({ actions: [ { name: "next-item", params: {} }, type === "reverts" ? { name: "rollback-edit", params: { summary: warning.summary } } : {}, { name: "warn-user", params: { warning: warningTitle, level } }, { name: "highlight-user", params: {} } ].concat(autoReporting.enabled && warning.reportable && autoReporting.for.has(warningTitle) ? [ reportObject ] : []) }); }; const executeNoWarn = async warningTitle => { const warning = (0, _warnings.getWarningFromLookup)(warningTitle); await this.ws.execute({ actions: [ { name: "next-item", params: {} }, { name: "rollback-edit", params: { summary: warning.summary } } ] }); }; const itemType = (_this$ws$queue$curren0 = (_this$ws$queue$curren1 = this.ws.queue.current.item) === null || _this$ws$queue$curren1 === void 0 ? void 0 : _this$ws$queue$curren1.type) !== null && _this$ws$queue$curren0 !== void 0 ? _this$ws$queue$curren0 : this.ws.queue.current.type; let group = _queue.Queue.groups[itemType]; if (itemType === "abuselog" && (_this$ws$queue$curren10 = this.ws.queue.current.item) !== null && _this$ws$queue$curren10 !== void 0 && _this$ws$queue$curren10.revid) group = "edit"; $menu.__executeCallbacks__ = { executeWithWarn, executeNoWarn }; if (this.ws.store.favorite.reverts.length > 0) { const $favorites = document.createElement("div"); $favorites.className = "favorites-section"; const $header = document.createElement("div"); $header.className = "favorites-header"; $header.innerHTML = '<span class="icon fas fa-star"></span><span>Favorites</span>'; $favorites.appendChild($header); const $container = document.createElement("div"); $container.className = "favorites-container"; $favorites.appendChild($container); const allWarnings = Object.values(_warnings.warningsLookup).filter(w => w.queueType.includes(group) && (!item || typeof w.show !== "function" || w.show(item))); for (const favorite of this.ws.store.favorite[type]) { const warning = allWarnings.find(w => w.title === favorite); if (warning) { const $item = this.createWarningItem(warning, executeWithWarn, executeNoWarn, type, true); $container.appendChild($item); } } $menu.appendChild($favorites); const $separator = document.createElement("div"); $separator.className = "favorites-separator"; $menu.appendChild($separator); } let allMade = 0; for (const [, category] of Object.entries(_warnings.warnings)) { let categoryMade = 0; const categoryWarnings = []; for (const warning of category.warnings) { if (typeof warning.show === "function" && !warning.show(item)) continue; if (!warning.queueType.includes(group)) continue; categoryWarnings.push(warning); categoryMade++; allMade++; } if (categoryMade === 0) continue; const $option = document.createElement("div"); $option.className = "menu-option submenu-trigger"; const $icon = document.createElement("span"); $icon.className = `icon ${category.icon}`; $option.appendChild($icon); const $label = document.createElement("span"); $label.textContent = category.title; $option.appendChild($label); const $arrowIcon = document.createElement("span"); $arrowIcon.className = "submenu-arrow fas fa-chevron-right"; $option.appendChild($arrowIcon); $menu.appendChild($option); const $submenu = document.createElement("div"); $submenu.className = "warning-submenu submenu"; document.body.querySelector("#app").appendChild($submenu); for (const warning of categoryWarnings) { const $item = this.createWarningItem(warning, executeWithWarn, executeNoWarn, type, false); $submenu.appendChild($item); } $option.addEventListener("click", e => { e.stopPropagation(); const wasShown = $submenu.classList.contains("show"); document.body.querySelectorAll(".warning-submenu.show").forEach($menu => { if ($menu !== $submenu) { $menu.classList.remove("show"); document.body.querySelectorAll(".levels-menu.show").forEach($menu => $menu.classList.remove("show")); } }); if (!wasShown) { $option.classList.add("focus-opened"); $submenu.classList.add("show"); this.positionWarningSubmenu($submenu, $option); } else { $option.classList.remove("focus-opened"); $submenu.classList.remove("show"); document.body.querySelectorAll(".levels-menu.show").forEach($menu => $menu.classList.remove("show")); } }); } if (allMade === 0) { const $noWarnings = document.createElement("div"); $noWarnings.className = "warning-menu-no-items"; $noWarnings.textContent = "No warnings available for this edit."; $menu.appendChild($noWarnings); } addEventListener("keydown", this.warningMenuKeyListener); } warningMenuKeyListener(event) { if (event.key === "Tab") { const $activeMenu = document.querySelector("#warn-menu.show, #revert-menu.show"); if ($activeMenu) { const $selectedMenu = $activeMenu.querySelector(":scope > div > .menu-option.focus-opened"); if ($selectedMenu) { const $submenu = document.body.querySelector(".submenu.show"); if ($submenu) { const $focusable = $submenu.querySelectorAll(":scope > .warning-menu-item"); if ($focusable.length > 0) { const index = Array.from($focusable).indexOf($submenu.querySelector(".focus-visible")); const nextIndex = (index + (event.shiftKey ? -1 : 1) + $focusable.length) % $focusable.length; document.querySelectorAll(".focus-visible").forEach($item => $item.classList.remove("focus-visible")); $focusable[nextIndex].classList.add("focus-visible"); event.preventDefault(); } } } else { const $focusable = $activeMenu.querySelectorAll(`:scope > div > .favorites-section > .favorites-container > .warning-menu-item,\n\t\t\t\t\t\t :scope > div > .menu-option`); if ($focusable.length > 0) { const index = Array.from($focusable).indexOf($activeMenu.querySelector(".focus-visible")); const nextIndex = (index + (event.shiftKey ? -1 : 1) + $focusable.length) % $focusable.length; document.querySelectorAll(".focus-visible").forEach($item => $item.classList.remove("focus-visible")); $focusable[nextIndex].classList.add("focus-visible"); event.preventDefault(); } } } } else if (event.key === "Enter") { const $activeMenu = document.querySelector("#warn-menu.show, #revert-menu.show"); if ($activeMenu) { const $focused = document.querySelector(".focus-visible"); if ($focused) { $focused.click(); event.preventDefault(); } } } else if (event.key === "Escape") { const $activeMenu = document.querySelector("#warn-menu.show, #revert-menu.show"); if ($activeMenu) { const $opened = document.querySelector(".focus-opened"); if ($opened) { $opened.classList.remove("focus-opened"); $opened.classList.add("focus-visible"); $opened.click(); } else { document.querySelectorAll(".bottom-tool-menu").forEach($menu => $menu.classList.remove("show")); document.querySelectorAll(".bottom-tool-trigger").forEach($trigger => $trigger.classList.remove("active")); document.querySelectorAll(".submenu").forEach($submenu => $submenu.classList.remove("show")); document.querySelectorAll(".levels-menu").forEach($menu => $menu.classList.remove("show")); } event.preventDefault(); } } } closeMenus() { document.querySelectorAll(".bottom-tool-menu").forEach($menu => $menu.classList.remove("show")); document.querySelectorAll(".bottom-tool-trigger").forEach($trigger => $trigger.classList.remove("active")); document.querySelectorAll(".submenu").forEach($submenu => $submenu.classList.remove("show")); document.querySelectorAll(".levels-menu").forEach($menu => $menu.classList.remove("show")); } } exports.GUI = GUI; function _sanitizeInlineHtml(html) { const allowed = new Set([ "B", "I", "EM", "STRONG", "CODE", "SPAN", "BR" ]); const container = document.createElement("div"); container.innerHTML = html; const walk = node => { const children = [ ...node.childNodes ]; for (const child of children) { if (child.nodeType === Node.ELEMENT_NODE) { if (!allowed.has(child.tagName)) { child.replaceWith(...child.childNodes); } else { // strip all attributes while (child.attributes.length > 0) child.removeAttribute(child.attributes[0].name); walk(child); } } } }; walk(container); return container.innerHTML; } _defineProperty(GUI, "palettes", { traffic: (0, _buildPalette.BuildPalette)(1e3, "#78c675", "#fdff7a", "#fcff54", "#fbff12", "#ffc619", "#ff8812", "#f56214", "#f73214", "#fc0303", "#fc0303"), magma: (0, _buildPalette.BuildPalette)(1e3, "#000004", "#1b0c41", "#4a0c6b", "#781c6d", "#a52c60", "#cf4446", "#ed6925", "#fb9b06", "#f7d13d", "#fcffa4"), plasma: (0, _buildPalette.BuildPalette)(1e3, "#0d0887", "#46039f", "#7201a8", "#9c179e", "#bd3786", "#d8576b", "#ed7953", "#fb9f3a", "#fdca26", "#f0f921"), viridis: (0, _buildPalette.BuildPalette)(1e3, "#440154", "#3b528b", "#21918c", "#5ec962", "#fde725"), natural: (0, _buildPalette.BuildPalette)(1e3, "#ffffff", "#18ff18"), cool: (0, _buildPalette.BuildPalette)(1e3, "#ffffff", "#1818ff"), heat: (0, _buildPalette.BuildPalette)(1e3, "#ffffff", "#ff1818"), grey: (0, _buildPalette.BuildPalette)(1e3, "#000000", "#ffffff") }); /***/ }, /***/ 4674(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Notifications = void 0; class Notifications { constructor(ws) { this.ws = ws; this.first = {}; [ "alert", "message" ].forEach(type => { this[type] = []; this.update(type); this.first[type] = true; this.load(type); }); } find(type, id) { if ((type !== null && type !== void 0 ? type : false) === false) { let notification = this.alert.find(n => n.id === id); if (notification) return { type: "alert", notification }; notification = this.message.find(n => n.id === id); if (notification) return { type: "message", notification }; return undefined; } else return this[type].find(n => n.id === id); } async load(type) { try { const response = (await this.ws.api.continuous({ action: "query", meta: "notifications", notlimit: "max", notprop: "list", notfilter: "!read", notsections: type, notformat: "model" })).responses.flatMap(response => { var _response$query; return ((_response$query = response.query) === null || _response$query === void 0 || (_response$query = _response$query.notifications) === null || _response$query === void 0 ? void 0 : _response$query.list) || []; }); await Promise.all(response.map(async n => this.ws.api.parse(n["*"].body).then(parsed => { var _n$$parsed; return (_n$$parsed = void (n["*"].parsed = parsed)) !== null && _n$$parsed !== void 0 ? _n$$parsed : n; }))); let update = false; for (const n of response) { if (!this[type].some(existing => existing.id === n.id && existing.read === n.read)) { this[type].unshift(n); update = true; } } if (update) { const zen = this.ws.store.settings.zen_mode; if (!zen.enabled || zen[`${type}s`].enabled) this.ws.audio.playSound([ "notification", type ]); this.update(type); } } finally { setTimeout(() => this.load(type), 10 * 1e3); } } update(type) { this.count(); const notifications = this[type]; const unread = notifications.filter(n => !n.read); const zen = this.ws.store.settings.zen_mode; if (!zen.enabled || zen[`${type}s`].enabled) unread.filter(n => !n.seen && !n.notified).forEach(n => { n.notified = true; if (!this.first[type]) electron.sendNotification({ title: this.ws.util.textify(n["*"].header), body: this.ws.util.textify(n["*"].body) }, n["*"].links.primary.url); }); this.first[type] = false; const $count = document.querySelector(`#${type}s-count`); const $list = document.querySelector(`#${type}s-list`); $count.textContent = unread.length; $count.classList.toggle("hidden", unread.length === 0); if (notifications.length === 0) $list.innerHTML = `<div class="notifications-empty">No new ${type}s</div>`; else { $list.innerHTML = ""; notifications.forEach(notification => { const model = notification["*"]; { // create element const $notification = document.createElement("div"); $notification.classList.add("notification"); $notification.classList.add(notification.read ? "read" : "unread"); $notification.addEventListener("click", () => { this.read(type, notification); this.ws.open(model.links.primary.url); }); { // icon const $icon = document.createElement("div"); $icon.classList.add("notification-icon"); $icon.innerHTML = `<img src="${new URL(model.iconUrl, `https://${this.ws.server}/`).toString()}" alt="icon">`; $notification.appendChild($icon); } { // content const $content = document.createElement("div"); $content.classList.add("notification-content"); $notification.appendChild($content); { // header const $header = document.createElement("div"); $header.classList.add("notification-header"); $header.innerHTML = this.ws.util.truncate(model.header, 100); $content.appendChild($header); } { // body const $body = document.createElement("div"); $body.classList.add("notification-body"); $body.innerHTML = model.parsed; $content.appendChild($body); $body.querySelectorAll("[href]").forEach($link => { const href = $link.getAttribute("href"); $link.setAttribute("href", new URL(href, `https://${this.ws.server}`).href); }); $body.querySelectorAll("[src]").forEach($img => { const src = $img.getAttribute("src"); $img.setAttribute("src", new URL(src, `https://${this.ws.server}`).href); }); $body.querySelectorAll("[srcset]").forEach($img => { const srcset = $img.getAttribute("srcset"); const newSrcset = srcset.split(",").map(part => { const [url, descriptor] = part.trim().split(/\s+/, 2); const newUrl = new URL(url, `https://${this.ws.server}`).href; return descriptor ? `${newUrl} ${descriptor}` : newUrl; }).join(", "); $img.setAttribute("srcset", newSrcset); }); $body.querySelectorAll("a").forEach(link => { link.target = "_blank"; }); } { // links const $links = document.createElement("div"); $links.classList.add("notification-links"); model.links.secondary.forEach(link => { const $link = document.createElement("a"); $link.href = link.url; $link.target = "_blank"; $link.textContent = link.label; $links.appendChild($link); }); $content.appendChild($links); } } { // right const $right = document.createElement("div"); $right.classList.add("notification-right"); $notification.appendChild($right); if (!notification.read) { { // unread indicator const $unread = document.createElement("div"); $unread.classList.add("notification-unread-indicator"); $unread.addEventListener("click", e => { e.stopPropagation(); this.read(type, notification); }); $right.appendChild($unread); } } { // time const $time = document.createElement("div"); $time.classList.add("notification-timestamp"); $time.dataset.time = notification.timestamp.utciso8601; $time.dataset.timeFormat = "notification"; $time.textContent = this.ws.util.formatNotificationTime(new Date(notification.timestamp.utciso8601)); $right.appendChild($time); } } $list.appendChild($notification); } }); } } seen(type) { this.ws.api.postWithToken({ action: "echomarkseen", type }); this[type].forEach(n => n.seen = true); } read(type, notification) { if (notification) { notification.read = true; this.update(type); this.ws.api.postWithToken({ action: "echomarkread", sections: type, list: notification.id }); } else { this[type].forEach(n => n.read = true); this.update(type); this.ws.api.postWithToken({ action: "echomarkread", sections: type, all: true }); } } count() { var _this$alert, _this$message; const zen = this.ws.store.settings.zen_mode; let unread = 0; if (!zen.enabled || zen.alerts.enabled) unread += ((_this$alert = this.alert) === null || _this$alert === void 0 ? void 0 : _this$alert.filter(n => !n.read).length) || 0; if (!zen.enabled || zen.messages.enabled) unread += ((_this$message = this.message) === null || _this$message === void 0 ? void 0 : _this$message.filter(n => !n.read).length) || 0; electron.setBadgeCount(unread); if (unread > 0) document.title = `(${unread}) WikiShield`; else document.title = `WikiShield`; } } exports.Notifications = Notifications; /***/ }, /***/ 6151(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ProgressBar = void 0; class ProgressBar { constructor() { this.$bar = document.createElement("div"); this.$bar.classList.add("progress-bar"); this.$bar.style.opacity = 1; document.querySelector("#progress-bar-container").appendChild(this.$bar); this.$overlay = document.createElement("div"); this.$overlay.classList.add("progress-bar-overlay"); this.$overlay.style.width = "0%"; this.$bar.appendChild(this.$overlay); this.$text = document.createElement("div"); this.$text.classList.add("progress-bar-text"); this.$bar.appendChild(this.$text); } set(text, portion, error) { this.$text.textContent = text; this.$overlay.style.width = `${Math.min(Math.max(portion, 0), 1) * 100}%`; this.$bar.classList.toggle("error", error); if (portion >= 1) setTimeout(() => { this.$bar.style.opacity = 0; setTimeout(() => this.$bar.remove(), 300); }, 1700); } } exports.ProgressBar = ProgressBar; }, /***/ 9117(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Settings = void 0; var _class = __webpack_require__(8678); var _conditions = __webpack_require__(870); var _controlKeys = __webpack_require__(9808); var _events = __webpack_require__(985); var _queue = __webpack_require__(372); var _wikishield = __webpack_require__(7054); var _namespaces = __webpack_require__(4018); var _manager = __webpack_require__(9501); var _warnings = __webpack_require__(955); var _scripts = __webpack_require__(5564); var _text = __webpack_require__(2069); var _gui = __webpack_require__(8469); function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } // TODO make watching, whitelisting, and highlighting require times as a param const formatTime = ms => { const seconds = Math.floor(ms / 1e3); const days = Math.floor(seconds / 86400); const hours = Math.floor(seconds % 86400 / 3600); const mins = Math.floor(seconds % 3600 / 60); const secs = seconds % 60; let str = ""; if (days > 0) str += `${days}d `; if (hours > 0) str += `${hours}h `; if (mins > 0) str += `${mins}m `; str += `${secs}s`; return str.trim(); }; var _keypressListener = new WeakMap; var _promiseResolve = new WeakMap; var _promise = new WeakMap; class Settings { constructor(ws) { _classPrivateFieldInitSpec(this, _keypressListener, void 0); _classPrivateFieldInitSpec(this, _promiseResolve, void 0); _classPrivateFieldInitSpec(this, _promise, void 0); this.ws = ws; this.ws.api.getTags().then(tags => { this.wikipediaTags = tags; }); } get active() { return document.querySelector("#settings-container > .settings > .settings-right > div:not(.hidden)"); } controller(event) { const key = event.key.toLowerCase(); if (!_classPrivateFieldGet(_keypressListener, this)) { if (key === "escape" && event.type === "keydown") this.close(); return; } else if (key === "escape") return _classPrivateFieldGet(_keypressListener, this).call(this, "escape", true); if (key === "control" || key === "shift" || key === "alt" || _controlKeys.controls.has(key)) { event.preventDefault(); switch (event.type) { case "keydown": { _classPrivateFieldGet(_keypressListener, this).call(this, (0, _controlKeys.buildShortcut)(event), false); } break; case "keyup": { _classPrivateFieldGet(_keypressListener, this).call(this, (0, _controlKeys.buildShortcut)(event), true); } break; } } } collapsible($container, titleCallback, desc, collapsed = true) { const $collapse = document.createElement("div"); $collapse.className = "settings-section collapsible"; $container.appendChild($collapse); const $header = document.createElement("div"); $header.className = "settings-section-header collapse-title"; $header.textContent = titleCallback(collapsed); $collapse.appendChild($header); const $content = document.createElement("div"); $content.className = "collapse-content collapsible"; $collapse.appendChild($content); const $desc = document.createElement("div"); $desc.className = "settings-section-desc"; $desc.textContent = desc; $content.appendChild($desc); if (collapsed) { $content.style.height = "0px"; $content.style.opacity = 0; $content.style.overflow = "hidden"; $collapse.classList.add("collapsed"); } else { $content.style.height = "auto"; $content.style.opacity = 1; $content.style.overflow = "visible"; $collapse.classList.remove("collapsed"); } let isAnimating = false, animationFrame; let startTime, startHeight, startOpacity, targetHeight, targetOpacity; const duration = 300; const ease = t => t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t; const animate = timestamp => { if (!startTime) startTime = timestamp; const elapsed = timestamp - startTime; const progress = Math.min(elapsed / duration, 1); const eased = ease(progress); const height = startHeight + (targetHeight - startHeight) * eased; const opacity = startOpacity + (targetOpacity - startOpacity) * eased; $content.style.height = `${height}px`; $content.style.opacity = opacity; if (progress < 1) animationFrame = requestAnimationFrame(animate); else { if (!collapsed) { $content.style.height = "auto"; $content.style.overflow = "visible"; } else $content.style.overflow = "hidden"; isAnimating = false; animationFrame = null; startTime = null; } }; const toggle = () => { if (isAnimating) { cancelAnimationFrame(animationFrame); const computedHeight = $content.getBoundingClientRect().height; startHeight = computedHeight; startOpacity = parseFloat(getComputedStyle($content).opacity); } else { startHeight = collapsed ? 0 : $content.scrollHeight; startOpacity = collapsed ? 0 : 1; } collapsed = !collapsed; $header.textContent = titleCallback(collapsed); $collapse.classList.toggle("collapsed", collapsed); $content.style.overflow = "hidden"; if (collapsed) { targetHeight = 0; targetOpacity = 0; } else { targetHeight = $content.scrollHeight; targetOpacity = 1; } isAnimating = true; startTime = null; animationFrame = requestAnimationFrame(animate); }; $header.addEventListener("click", toggle); return $content; } start() { electron.onOpenChangelog(() => { var _this$open; return (_this$open = void this.open()) !== null && _this$open !== void 0 ? _this$open : this.changelog(); }); let cockBlock = 0; document.querySelector("#settings-container").addEventListener("click", e => { if (e.target.id === "settings-container" && !(cockBlock = Math.max(0, cockBlock))) this.close(); }); document.querySelector("#settings-general-button").addEventListener("click", this.general.bind(this)); document.querySelector("#settings-audio-button").addEventListener("click", this.audio.bind(this)); document.querySelector("#settings-controls-button").addEventListener("click", this.controls.bind(this)); document.querySelector("#settings-zen-button").addEventListener("click", this.zen.bind(this)); document.querySelector("#settings-app-button").addEventListener("click", this.app.bind(this)); document.querySelector("#settings-queue-button").addEventListener("click", this.queue.bind(this)); document.querySelector("#settings-accessibility-button").addEventListener("click", this.accessibility.bind(this)); document.querySelector("#settings-AI-button").addEventListener("click", this.AI.bind(this)); document.querySelector("#settings-auto-reporting-button").addEventListener("click", this.autoReporting.bind(this)); document.querySelector("#settings-gadgets-button").addEventListener("click", this.gadgets.bind(this)); document.querySelector("#settings-whitelist-users-button").addEventListener("click", this.whitelist.bind(this, "user")); document.querySelector("#settings-whitelist-pages-button").addEventListener("click", this.whitelist.bind(this, "page")); document.querySelector("#settings-whitelist-tags-button").addEventListener("click", this.whitelist.bind(this, "tag")); document.querySelector("#settings-highlight-users-button").addEventListener("click", this.highlight.bind(this, "user")); document.querySelector("#settings-highlight-pages-button").addEventListener("click", this.highlight.bind(this, "page")); document.querySelector("#settings-highlight-tags-button").addEventListener("click", this.highlight.bind(this, "tag")); document.querySelector("#settings-statistics-button").addEventListener("click", this.statistics.bind(this)); document.querySelector("#settings-save-button").addEventListener("click", this.save.bind(this)); document.querySelector("#settings-changelog-button").addEventListener("click", this.changelog.bind(this)); document.querySelector("#settings-about-button").addEventListener("click", this.about.bind(this)); { const $slider = document.querySelector("#settings-ores-bias"); const $track = $slider.querySelector(".settings-slider-track"); const $thumb = $slider.querySelector(".settings-slider-thumb"); const $leftLabel = $slider.querySelector(".settings-slider-label-left"); const $leftPercent = $leftLabel.querySelector(".percent"); const $rightLabel = $slider.querySelector(".settings-slider-label-right"); const $rightPercent = $rightLabel.querySelector(".percent"); const updateValue = value => { this.ws.store.settings.queue.ores_bias = +value.toFixed(2); value = Math.max(0, Math.min(100, Math.round(value * 100))); $thumb.style.left = `${value}%`; $track.style.setProperty("--fill", `${value}%`); const left = 100 - value; $leftPercent.textContent = `${left}%`; $leftLabel.classList.toggle("active", left > 0); const right = value; $rightPercent.textContent = `${right}%`; $rightLabel.classList.toggle("active", right > 0); }; const getValue = e => { const rect = $track.getBoundingClientRect(); return (e.clientX - rect.left) / rect.width; }; $track.addEventListener("click", e => updateValue(getValue(e))); let dragging = false; $thumb.addEventListener("mousedown", e => { e.preventDefault(); dragging = true; cockBlock++; $thumb.classList.add("dragging"); }); window.addEventListener("mousemove", e => { if (!dragging) return; updateValue(getValue(e)); }); window.addEventListener("mouseup", () => { if (!dragging) return; dragging = false; cockBlock--; $thumb.classList.remove("dragging"); }); updateValue(this.ws.store.settings.queue.ores_bias); } { const $edits = document.querySelector("#settings-maximum-edit-count"); $edits.value = this.ws.store.settings.queue.max_edits; $edits.addEventListener("change", e => { const max = +e.target.value; this.ws.store.settings.queue.max_edits = max; for (const [user, count] of this.ws.queue.bypass.entries()) if (count <= max) this.ws.queue.bypass.delete(user); }); const $size = document.querySelector("#settings-maximum-queue-size"); $size.value = this.ws.store.settings.queue.max_size; $size.addEventListener("change", e => this.ws.store.settings.queue.max_size = +e.target.value); const $ores = document.querySelector("#settings-minimum-ores-score"); $ores.value = this.ws.store.settings.queue.min_ores; $ores.addEventListener("change", e => this.ws.store.settings.queue.min_ores = +e.target.value); const $watchlist = document.querySelector("#settings-watchlist-expiry"); $watchlist.value = this.ws.store.settings.expiry.watchlist; $watchlist.addEventListener("change", e => this.ws.store.settings.expiry.watchlist = e.target.value); const $ns = document.querySelector("#settings-namespaces-container"); $ns.innerHTML = ""; _namespaces.namespaces.forEach(ns => { const $item = document.createElement("div"); $item.className = "namespace-item"; $item.dataset.namespaceId = ns.id; $item.innerHTML = `\n\t\t\t\t\t<label class="checkbox-box">\n\t\t\t\t\t\t<input type="checkbox" autoComplete="off">\n\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t</label>\n\t\t\t\t\t<span class="namespace-name">${ns.name}</span>\n\t\t\t\t`; const $checkbox = $item.querySelector("input[type=checkbox]"); $checkbox.checked = this.ws.store.settings.namespaces.includes(ns.id); $checkbox.addEventListener("change", e => { if (e.target.checked) { if (!this.ws.store.settings.namespaces.includes(ns.id)) this.ws.store.settings.namespaces.push(ns.id); } else { const index = this.ws.store.settings.namespaces.indexOf(ns.id); if (index !== -1) this.ws.store.settings.namespaces.splice(index, 1); } }); $ns.appendChild($item); }); } { const $ores = document.querySelector("#settings-ORES-alert-toggle"); $ores.value = this.ws.store.settings.audio.ores_alert.enabled; $ores.addEventListener("change", e => { this.ws.store.settings.audio.ores_alert.enabled = $ores.value; }); const $threshold = document.querySelector("#settings-ORES-alert-threshold"); $threshold.value = this.ws.store.settings.audio.ores_alert.threshold; $threshold.addEventListener("change", e => { this.ws.store.settings.audio.ores_alert.threshold = +$threshold.value; }); const $master = document.querySelector("#settings-master-volume"); $master.value = this.ws.store.settings.audio.volume.master; $master.addEventListener("change", e => { this.ws.store.settings.audio.volume.master = +$master.value; }); const build = { sound: ($el, path, title, desc, preview) => { const key = [ "master", ...path ].join("."); const $volume = document.createElement("volume-control"); $volume.setAttribute("title", title); $volume.setAttribute("description", desc); if (preview) $volume.setPreview(this.ws.audio, path); $volume.value = this.ws.store.settings.audio.volume[key]; $volume.addEventListener("change", () => { const current = this.ws.store.settings.audio.volume[key]; this.ws.store.settings.audio.volume[key] = $volume.value; if (current !== $volume.value) this.ws.audio.onvolumechanged(); }); $el.appendChild($volume); }, category: ($el, path, title, desc) => { const key = [ "master", ...path ].join("."); const $section = this.collapsible($el, collapsed => title, desc, true); const $volume = document.createElement("volume-control"); $volume.setAttribute("title", "Category Volume"); $volume.value = this.ws.store.settings.audio.volume[key]; $volume.addEventListener("change", () => { const current = this.ws.store.settings.audio.volume[key]; this.ws.store.settings.audio.volume[key] = $volume.value; if (current !== $volume.value) this.ws.audio.onvolumechanged(); }); $section.appendChild($volume); const $content = document.createElement("div"); $content.className = "settings-content"; $section.appendChild($content); return $content; } }; const loop = (obj, path, $el) => { for (const [key, value] of Object.entries(obj)) { switch (value.type) { case "sound": { var _value$preview; build.sound($el, [ ...path, key ], value.title, value.description, (_value$preview = value.preview) !== null && _value$preview !== void 0 ? _value$preview : true); } break; case "category": { loop(value.properties, [ ...path, key ], build.category($el, [ ...path, key ], value.title, value.description)); } break; } } }; loop(this.ws.audio.audio, [], document.querySelector("#settings-sounds-container")); } { const $repeatScripts = document.querySelector("#repeat-control-scripts-toggle"); $repeatScripts.value = this.ws.store.settings.repeat_control_scripts; $repeatScripts.addEventListener("change", e => this.ws.store.settings.repeat_control_scripts = $repeatScripts.value); document.querySelector("#settings-new-control-script").addEventListener("click", async () => { this.ws.store.control_scripts.unshift({ keys: [], actions: [] }); this.controls(); }); } { const $zen = document.querySelector("#settings-zen-mode"); $zen.value = this.ws.store.settings.zen_mode.enabled; $zen.addEventListener("change", e => { this.ws.store.settings.zen_mode.enabled = $zen.value; this.ws.gui.updateZenMode(); }); const $sound = document.querySelector("#settings-zen-mode-sound"); $sound.value = this.ws.store.settings.zen_mode.sound.enabled; $sound.addEventListener("change", e => { this.ws.store.settings.zen_mode.sound.enabled = $sound.value; this.ws.gui.updateZenMode(); }); const $music = document.querySelector("#settings-zen-mode-music"); $music.value = this.ws.store.settings.zen_mode.music.enabled; $music.addEventListener("change", e => { this.ws.store.settings.zen_mode.music.enabled = $music.value; this.ws.gui.updateZenMode(); }); const $alerts = document.querySelector("#settings-zen-mode-alerts"); $alerts.value = this.ws.store.settings.zen_mode.alerts.enabled; $alerts.addEventListener("change", e => { this.ws.store.settings.zen_mode.alerts.enabled = $alerts.value; this.ws.gui.updateZenMode(); }); const $messages = document.querySelector("#settings-zen-mode-messages"); $messages.value = this.ws.store.settings.zen_mode.messages.enabled; $messages.addEventListener("change", e => { this.ws.store.settings.zen_mode.messages.enabled = $messages.value; this.ws.gui.updateZenMode(); }); const $toasts = document.querySelector("#settings-zen-mode-toasts"); $toasts.value = this.ws.store.settings.zen_mode.toasts.enabled; $toasts.addEventListener("change", e => { this.ws.store.settings.zen_mode.toasts.enabled = $toasts.value; this.ws.gui.updateZenMode(); }); const $badges = document.querySelector("#settings-zen-mode-badges"); $badges.value = this.ws.store.settings.zen_mode.badges.enabled; $badges.addEventListener("change", e => { this.ws.store.settings.zen_mode.badges.enabled = $badges.value; this.ws.gui.updateZenMode(); }); } { if (false) // removed by dead control flow {} if (!window.isElectron) { const $launch = document.querySelector("#settings-launch-behavior"); document.querySelectorAll("#settings-launch-behavior .selected").forEach($el => $el.classList.remove("selected")); document.querySelector(`#settings-launch-behavior [data-value=${electron.localStorage.get("WikiShield:OpenExternally") ? "new_tab" : "current_tab"}]`).classList.add("selected"); const $current = $launch.querySelector("[data-value=current_tab]"); $current.addEventListener("click", () => { $launch.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $current.classList.add("selected"); electron.localStorage.set("WikiShield:OpenExternally", false); }); const $new = $launch.querySelector("[data-value=new_tab]"); $new.addEventListener("click", () => { $launch.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $new.classList.add("selected"); electron.localStorage.set("WikiShield:OpenExternally", true); }); } { const $performance = document.querySelector("#settings-startup-performance"); document.querySelectorAll("#settings-startup-performance .selected").forEach($el => $el.classList.remove("selected")); document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected"); const $off = $performance.querySelector("[data-value=always_off]"); $off.addEventListener("click", () => { $performance.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $off.classList.add("selected"); this.ws.store.settings.performance.startup = "always_off"; }); const $adaptive = $performance.querySelector("[data-value=adaptive]"); $adaptive.addEventListener("click", () => { $performance.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $adaptive.classList.add("selected"); this.ws.store.settings.performance.startup = "adaptive"; }); const $on = $performance.querySelector("[data-value=always_on]"); $on.addEventListener("click", () => { $performance.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $on.classList.add("selected"); this.ws.store.settings.performance.startup = "always_on"; }); } } { const $queue = document.querySelector("#settings-queues"); _queue.Queue.types.map(type => ({ type, data: this.ws.store.settings.queue[type] })).sort((a, b) => a.data.order - b.data.order).forEach(queue => { var _recent$pending$users; const $item = document.createElement("draggable-order-item"); $item.setAttribute("key", queue.type); $item.setAttribute("name", (_recent$pending$users = { recent: "Recent changes", pending: "Pending changes", users: "User creations", watchlist: "Watchlist", abuselog: "Abuse log" }[queue.type]) !== null && _recent$pending$users !== void 0 ? _recent$pending$users : queue.type); $item.enabled = queue.data.enabled; $queue.addItem($item, queue.type); }); $queue.addEventListener("toggle", e => { var _e$target$closest; const queueType = (_e$target$closest = e.target.closest("draggable-order-item")) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.getAttribute("key"); if (queueType) { this.ws.store.settings.queue[queueType].enabled = e.detail.enabled; this.ws.gui.reorderQueues(); } }); $queue.addEventListener("reorder", e => { e.detail.keys.forEach((key, index) => { this.ws.store.settings.queue[key].order = index; this.ws.gui.reorderQueues(); }); }); const $palettes = document.querySelector("#settings-palette-selector"); Object.entries(_gui.GUI.palettes).forEach(([key, palette]) => { const $palette = document.createElement("div"); $palette.className = "palette-option"; $palette.classList.toggle("selected", this.ws.store.UI.theme.palette === key); $palette.dataset.palette = key; $palette.addEventListener("click", () => { document.querySelectorAll(".palette-option.selected").forEach($el => $el.classList.remove("selected")); $palette.classList.add("selected"); this.ws.store.UI.theme.palette = key; this.ws.gui.updatePalette(); }); $palettes.appendChild($palette); const $name = document.createElement("div"); $name.className = "palette-name"; $name.textContent = new _text.Text(key).case(_text.Text.Case.Title).get(); $palette.appendChild($name); const $preview = document.createElement("div"); $preview.className = "palette-preview"; $palette.appendChild($preview); const len = palette.length; const paper = document.createElement("canvas"); paper.width = len; paper.height = 1; const pen = paper.getContext("2d"); const imgData = pen.createImageData(len, 1); palette.forEach((color, i) => { const rgb = color.match(/\d+/g).map(v => parseInt(v, 10)); const offset = i * 4; imgData.data[offset] = rgb[0]; imgData.data[offset + 1] = rgb[1]; imgData.data[offset + 2] = rgb[2]; imgData.data[offset + 3] = 255; }); pen.putImageData(imgData, 0, 0); $preview.appendChild(paper); }); } { /* const $colorblind = document.querySelector("#settings-colorblind-mode"); $colorblind.value = this.ws.store.settings.accessibility.colorblind; $colorblind.addEventListener("change", e => { this.ws.store.settings.accessibility.colorblind = $colorblind.value; this.ws.gui.updateAccessibility(); }); */ const $dyslexia = document.querySelector("#settings-dyslexia-font"); $dyslexia.value = this.ws.store.settings.accessibility.dyslexia; $dyslexia.addEventListener("change", e => { this.ws.store.settings.accessibility.dyslexia = $dyslexia.value; this.ws.gui.updateAccessibility(); }); /* const $contrast = document.querySelector("#settings-high-contrast-mode"); $contrast.value = this.ws.store.settings.accessibility.high_contrast; $contrast.addEventListener("change", e => { this.ws.store.settings.accessibility.high_contrast = $contrast.value; this.ws.gui.updateAccessibility(); }); */ const $motion = document.querySelector("#settings-reduce-motion"); $motion.value = this.ws.store.settings.accessibility.reduce_motion; $motion.addEventListener("change", e => { this.ws.store.settings.accessibility.reduce_motion = $motion.value; this.ws.gui.updateAccessibility(); }); } { const $AI = document.querySelector("#settings-AI-toggle"); $AI.value = this.ws.store.settings.AI.enabled; $AI.addEventListener("change", e => { var _this$ws$AI; (_this$ws$AI = this.ws.AI) === null || _this$ws$AI === void 0 || _this$ws$AI.cancel.all(true); this.ws.store.settings.AI.enabled = $AI.value; if (this.ws.store.settings.AI.enabled) switch (this.ws.store.settings.AI.provider) { case "Ollama": { this.ws.AI = new _class.AI.providers.Ollama(this.ws, this.ws.store.settings.AI.Ollama); } break; default: { this.ws.AI = null; } break; } else this.ws.AI = null; }); const $editAnalysis = document.querySelector("#settings-AI-edit-analysis-toggle"); $editAnalysis.value = this.ws.store.settings.AI.edit_analysis.enabled; $editAnalysis.addEventListener("change", e => this.ws.store.settings.AI.edit_analysis.enabled = e.target.value); const $usernameAnalysis = document.querySelector("#settings-AI-username-analysis-toggle"); $usernameAnalysis.value = this.ws.store.settings.AI.username_analysis.enabled; $usernameAnalysis.addEventListener("change", e => this.ws.store.settings.AI.username_analysis.enabled = e.target.value); const $url = document.querySelector("#ollama-url-input"); $url.value = this.ws.store.settings.AI.Ollama.server; $url.addEventListener("change", e => { this.ws.store.settings.AI.Ollama.server = $url.value.trim(); if (this.ws.store.settings.AI.provider === "Ollama" && this.ws.AI) this.ws.AI.cancel.all(true); }); const $test = document.querySelector("#settings-ollama-test-connection"); $test.addEventListener("click", async () => { var _this$ws$AI2; if ($test.disabled) return; $test.disabled = true; const $status = document.querySelector("#settings-ollama-connection-status"); const $container = $status.parentElement; $container.classList.add("testing"); $container.classList.remove("connected", "failed"); $status.classList.add("animate-loading-dots"); $status.textContent = "Testing connection"; let temp; switch (this.ws.store.settings.AI.provider) { case "Ollama": { temp = new _class.AI.providers.Ollama(this.ws, this.ws.store.settings.AI.Ollama); } break; } (_this$ws$AI2 = this.ws.AI) === null || _this$ws$AI2 === void 0 || _this$ws$AI2.cancel.all(true); if (temp instanceof _class.AI && await temp.test()) { $container.classList.add("connected"); $container.classList.remove("testing", "failed"); $status.innerHTML = "<span class='fa fa-check-circle'></span> Connected!"; } else { $container.classList.add("failed"); $container.classList.remove("testing", "connected"); $status.innerHTML = "<span class='fa fa-times-circle'></span> Failed to connect.<br><small>Make sure you have followed the setup instructions (see below)</small>"; } $status.classList.remove("animate-loading-dots"); $test.disabled = false; }); const $refresh = document.querySelector("#settings-ollama-refresh-models"); $refresh.addEventListener("click", async () => { var _this$ws$AI3; if ($refresh.disabled) return; $refresh.disabled = true; const $models = document.querySelector("#settings-ollama-models"); const $status = document.querySelector("#settings-ollama-models-status"); const $container = $status.parentElement; $status.textContent = "Searching"; $container.classList.add("searching", "animate-loading-dots"); $container.classList.remove("none", "error"); (_this$ws$AI3 = this.ws.AI) === null || _this$ws$AI3 === void 0 || _this$ws$AI3.cancel.all(true); try { let temp; switch (this.ws.store.settings.AI.provider) { case "Ollama": { temp = new _class.AI.providers.Ollama(this.ws, this.ws.store.settings.AI.Ollama); } break; } const models = temp instanceof _class.AI && await temp.models() || []; if (models.length > 0) { $container.classList.remove("searching", "none", "error", "animate-loading-dots"); $status.innerHTML = `<span class="fa fa-check-circle"></span> Found ${models.length} ${new _text.Text("model").get(models.length)}.`; $models.innerHTML = ""; models.forEach(model => { const isSelected = model.name === this.ws.store.settings.AI.Ollama.model; const $model = document.createElement("div"); $model.className = "model"; $model.classList.toggle("selected", isSelected); $model.dataset.model = model.name; $models.appendChild($model); const $top = document.createElement("div"); $top.className = "model-top"; $model.appendChild($top); const $button = document.createElement("span"); $button.className = "indicator fa"; $button.classList.add(isSelected ? "fa-check-circle" : "fa-circle"); $top.appendChild($button); const $name = document.createElement("span"); $name.className = "model-name"; $name.textContent = model.name; $top.appendChild($name); /* LOL i just found this comment in the old code, and i still can't be bothered to fix it here's the comment if anyone is actually reading this: // i don't feel like figuring out the css to truly center the model name, so just add an invisible element to take up space */ const $psuedo = document.createElement("span"); $psuedo.className = "psuedo-indicator fa fa-circle"; $top.appendChild($psuedo); const $bottom = document.createElement("div"); $bottom.className = "model-bottom"; $model.appendChild($bottom); const $size = document.createElement("span"); $size.className = "model-size"; $size.textContent = this.ws.util.formatBytes(model.size); $bottom.appendChild($size); const $modified = document.createElement("span"); $modified.className = "model-modified"; $modified.textContent = new Date(model.modified_at).toLocaleDateString(); $bottom.appendChild($modified); $model.addEventListener("click", () => { var _this$ws$AI4; (_this$ws$AI4 = this.ws.AI) === null || _this$ws$AI4 === void 0 || _this$ws$AI4.cancel.all(true); switch (this.ws.store.settings.AI.provider) { case "Ollama": { this.ws.store.settings.AI.Ollama.model = model.name; } break; } $models.querySelectorAll(".model.selected").forEach($el => { $el.classList.remove("selected"); const $indicator = $el.querySelector(".indicator"); $indicator.classList.remove("fa-circle"); $indicator.classList.add("fa-check-circle"); }); $model.classList.add("selected"); const $indicator = $model.querySelector(".indicator"); $indicator.classList.remove("fa-circle"); $indicator.classList.add("fa-check-circle"); }); }); } else { $container.classList.add("none"); $container.classList.remove("searching", "error", "animate-loading-dots"); $status.textContent = "No models found."; } } catch (error) { $container.classList.add("error"); $container.classList.remove("searching", "none", "animate-loading-dots"); $status.innerHTML = "<span class='fa fa-times-circle'></span> Error fetching models."; } $refresh.disabled = false; }); } { const $reporting = document.querySelector("#settings-auto-reporting-toggle"); $reporting.value = this.ws.store.settings.auto_report.enabled; $reporting.addEventListener("change", e => { this.ws.store.settings.auto_report.enabled = $reporting.value; }); const $warnings = document.querySelector("#settings-auto-reporting-warnings-container"); Object.entries(_warnings.warningsLookup).filter(([key, warning]) => warning.reportable).sort((a, b) => a[1].title.localeCompare(b[1].title)).forEach(([key, warning]) => { const $item = document.createElement("div"); $item.className = "auto-reportable-warning-item"; $item.innerHTML = `\n\t\t\t\t\t\t<label class="checkbox-box" data-warning-key="${key}">\n\t\t\t\t\t\t\t<input type="checkbox" autoComplete="off" ${this.ws.store.settings.auto_report.for.has(key) ? "checked" : ""}>\n\t\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<span class="checkbox-name">${warning.title}</span>\n\t\t\t\t\t`; $item.querySelector("input[type=checkbox]").addEventListener("change", e => { if (e.target.checked) { if (!this.ws.store.settings.auto_report.for.has(key)) this.ws.store.settings.auto_report.for.add(key); } else this.ws.store.settings.auto_report.for.delete(key); }); $warnings.appendChild($item); }); } { const $welcome = document.querySelector("#settings-auto-welcome-toggle"); $welcome.value = this.ws.store.settings.auto_welcome.enabled; $welcome.addEventListener("change", e => { this.ws.store.settings.auto_welcome.enabled = $welcome.value; }); const $popups = document.querySelector("#settings-wikipedia-popups-toggle"); $popups.value = this.ws.store.settings.wikipedia_popups.enabled; $popups.addEventListener("change", e => { this.ws.store.settings.wikipedia_popups.enabled = $popups.value; }); const $talkPageThanksForTemporaryUsersToggle = document.querySelector("#talk-page-thanks-for-temporary-users-toggle"); $talkPageThanksForTemporaryUsersToggle.value = this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled; $talkPageThanksForTemporaryUsersToggle.addEventListener("change", e => { this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled = $talkPageThanksForTemporaryUsersToggle.value; }); const $highlight = document.querySelector("#settings-username-highlighting-toggle"); $highlight.value = this.ws.store.settings.username_highlighting.enabled; $highlight.addEventListener("change", e => { this.ws.store.settings.username_highlighting.enabled = $highlight.value; }); const $fuzzy = document.querySelector("#settings-username-highlighting-fuzzy-toggle"); $fuzzy.value = this.ws.store.settings.username_highlighting.fuzzy; $fuzzy.addEventListener("change", e => { this.ws.store.settings.username_highlighting.fuzzy = $fuzzy.value; }); } { const $status = document.querySelector("#settings-save-status"); const $export = document.querySelector("#settings-export-button"); $export.addEventListener("click", async e => { try { const b64 = this.ws.export(); await electron.copyToClipboard(b64); $status.classList.remove("hidden", "error", "info"); $status.classList.add("success"); $status.innerHTML = `\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings exported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">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`; } catch (error) { $status.classList.remove("hidden", "success", "info"); $status.classList.add("error"); $status.innerHTML = `\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Export failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${error.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`; } }); const $import = document.querySelector("#settings-import-button"); $import.addEventListener("click", async e => { try { const b64 = await this.ws.gui.dialog.input("Import Settings", "Please paste the base64 string of your exported settings below:"); if (!b64) throw new Error("No input provided."); const logs = await this.ws.noinit(b64); const [expected, unexpected] = logs.reduce((acc, log) => { if (log.expected) acc[0].push(log); else acc[1].push(log); return acc; }, [ [], [] ]); $status.classList.remove("hidden", "error", "info"); $status.classList.add("success"); $status.innerHTML = `\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings imported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">\n\t\t\t\t\t\t\t\t\t${unexpected.length > 0 ? `<br><br><strong>Encountered ${new _text.Text("%n issue").get(unexpected.length)}:</strong><br>${unexpected.map(log => `- ${log.message}`).join("<br>")}` : ""}\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`; } catch (error) { $status.classList.remove("hidden", "success", "info"); $status.classList.add("error"); $status.innerHTML = `\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Import failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${error.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`; } }); const $reset = document.querySelector("#settings-reset-button"); $reset.addEventListener("click", async e => { const confirm = await this.ws.gui.dialog.confirm("Reset Settings", "Are you sure you want to reset all settings to their default values? This action cannot be undone.", "Reset Settings", true); if (!confirm) return; this.ws.noinit("e30="); // "{}" in base64 $status.classList.remove("hidden", "error", "success"); $status.classList.add("info"); $status.innerHTML = `\n\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t<i class="fa fa-info-circle status-icon"></i>\n\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t<div class="status-title">Settings reset successfully.</div>\n\t\t\t\t\t\t\t<div class="status-desc">All settings have been restored to their default values.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`; }); } { document.querySelectorAll("#settings-container > .settings > .settings-right > .about [data-link]").forEach($el => { $el.addEventListener("click", event => this.ws.open($el.dataset.link, event.altKey)); }); } } // update all values update() { { document.querySelector("#settings-maximum-edit-count").value = this.ws.store.settings.queue.max_edits; document.querySelector("#settings-maximum-queue-size").value = this.ws.store.settings.queue.max_size; document.querySelector("#settings-minimum-ores-score").value = this.ws.store.settings.queue.min_ores; document.querySelector("#settings-watchlist-expiry").value = this.ws.store.settings.expiry.watchlist; document.querySelectorAll("#settings-namespaces-container .namespace-item").forEach($item => { const ns = parseInt($item.dataset.namespaceId, 10); $item.querySelector("input[type=checkbox]").checked = this.ws.store.settings.namespaces.includes(ns); }); } { document.querySelector("#settings-zen-mode").value = this.ws.store.settings.zen_mode.enabled; document.querySelector("#settings-zen-mode-sound").value = this.ws.store.settings.zen_mode.sound.enabled; document.querySelector("#settings-zen-mode-music").value = this.ws.store.settings.zen_mode.music.enabled; document.querySelector("#settings-zen-mode-alerts").value = this.ws.store.settings.zen_mode.alerts.enabled; document.querySelector("#settings-zen-mode-messages").value = this.ws.store.settings.zen_mode.messages.enabled; document.querySelector("#settings-zen-mode-toasts").value = this.ws.store.settings.zen_mode.toasts.enabled; document.querySelector("#settings-zen-mode-badges").value = this.ws.store.settings.zen_mode.badges.enabled; } { document.querySelectorAll("#settings-startup-performance .selected").forEach($el => $el.classList.remove("selected")); document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected"); } { const $queue = document.querySelector("#settings-queues"); $queue.clearItems(); _queue.Queue.types.map(type => ({ type, data: this.ws.store.settings.queue[type] })).sort((a, b) => a.data.order - b.data.order).forEach(queue => { var _recent$pending$users2; const $item = document.createElement("draggable-order-item"); $item.setAttribute("key", queue.type); $item.setAttribute("name", (_recent$pending$users2 = { recent: "Recent changes", pending: "Pending changes", users: "User creations", watchlist: "Watchlist" }[queue.type]) !== null && _recent$pending$users2 !== void 0 ? _recent$pending$users2 : queue.type); $item.enabled = queue.data.enabled; $queue.addItem($item, queue.type); }); document.querySelectorAll(".palette-option").forEach($el => { $el.classList.toggle("selected", $el.dataset.palette === this.ws.store.UI.theme.palette); }); } { document.querySelector("#settings-AI-toggle").value = this.ws.store.settings.AI.enabled; document.querySelector("#settings-AI-edit-analysis-toggle").value = this.ws.store.settings.AI.edit_analysis.enabled; document.querySelector("#settings-AI-username-analysis-toggle").value = this.ws.store.settings.AI.username_analysis.enabled; document.querySelector("#ollama-url-input").value = this.ws.store.settings.AI.Ollama.server; { const $status = document.querySelector("#settings-ollama-connection-status"); const $container = $status.parentElement; $status.innerHTML = ""; $container.classList.remove("testing", "connected", "failed"); } { const $models = document.querySelector("#settings-ollama-models"); $models.querySelectorAll(".model").forEach($el => $el.remove()); const $status = document.querySelector("#settings-ollama-models-status"); const $container = $status.parentElement; $status.innerHTML = ""; $container.classList.remove("searching", "none", "error"); } } { document.querySelector("#settings-auto-reporting-toggle").value = this.ws.store.settings.auto_report.enabled; document.querySelectorAll("#settings-auto-reporting-warnings-container .auto-reportable-warning-item").forEach($item => { const key = $item.querySelector("label").dataset.warningKey; $item.querySelector("input[type=checkbox]").checked = this.ws.store.settings.auto_report.for.has(key); }); } { document.querySelector("#settings-auto-welcome-toggle").value = this.ws.store.settings.auto_welcome.enabled; document.querySelector("#settings-wikipedia-popups-toggle").value = this.ws.store.settings.wikipedia_popups.enabled; document.querySelector("#settings-username-highlighting-toggle").value = this.ws.store.settings.username_highlighting.enabled; document.querySelector("#settings-username-highlighting-fuzzy-toggle").value = this.ws.store.settings.username_highlighting.fuzzy; } } open() { document.querySelector("#settings-container").classList.add("show"); this.general(); _classPrivateFieldSet(_promise, this, new Promise(resolve => { _classPrivateFieldSet(_promiseResolve, this, resolve); })); } close() { this.deselect(); this.ws.audio.stopPreviews(); document.querySelector("#settings-container").classList.remove("show"); if (_classPrivateFieldGet(_promiseResolve, this)) { _classPrivateFieldGet(_promiseResolve, this).call(this); _classPrivateFieldSet(_promiseResolve, this, null); } } waitForClose() { return _classPrivateFieldGet(_promise, this); } deselect() { document.querySelectorAll("#settings-container > .settings > .settings-left .settings-left-menu-item.selected").forEach($item => $item.classList.remove("selected")); document.querySelectorAll("#settings-container > .settings > .settings-right > :not(.hidden)").forEach($section => $section.classList.add("hidden")); } general() { this.deselect(); document.querySelector("#settings-general-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .general").classList.remove("hidden"); } performance() { this.deselect(); document.querySelector("#settings-performance-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .performance").classList.remove("hidden"); } audio() { this.deselect(); document.querySelector("#settings-audio-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .audio").classList.remove("hidden"); } controls() { this.deselect(); document.querySelector("#settings-controls-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .controls").classList.remove("hidden"); { const findParentAction = (action, parent) => { if (parent.actions.includes(action)) return parent; for (const act of parent.actions) if (act.name === "if" || act.name === "if not") { const found = findParentAction(action, act); if (found) return found; } return null; }; const createActionItem = ($action, action, script, callback) => { const $item = document.createElement("div"); $item.className = "control-action"; $action.appendChild($item); if (action.name === "if" || action.name === "if not") { var _action$condition, _condition$name, _condition$params; $item.innerHTML = `\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t\t\t${action.name === "if" ? "If" : "If not"} <select></select> <span class="params"></span> then:\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`; const $select = $item.querySelector("select"); Object.entries(_conditions.conditions).forEach(([key, condition]) => { if ("title" in condition) $select.innerHTML += `<option value="${key}">${condition.title}</option>`; else $select.innerHTML += `<option value="${key}">${key}</option>`; }); const condition = (_action$condition = action.condition) !== null && _action$condition !== void 0 ? _action$condition : { name: Object.keys(_conditions.conditions)[0], params: {} }; (_condition$name = condition.name) !== null && _condition$name !== void 0 ? _condition$name : condition.name = Object.keys(_conditions.conditions)[0]; (_condition$params = condition.params) !== null && _condition$params !== void 0 ? _condition$params : condition.params = {}; $select.value = condition.name; $select.addEventListener("change", e => { condition.name = $select.value; callback(); }); const dependencyMap = new Map; for (const param of (0, _scripts.sortDependencies)(((_conditions$condition = (_conditions$condition2 = _conditions.conditions[condition.name]).parameters) === null || _conditions$condition === void 0 ? void 0 : _conditions$condition.call(_conditions$condition2)) || [])) { var _conditions$condition, _conditions$condition2; const $param = document.createElement("div"); $param.className = "condition-parameter"; $item.querySelector(".params").appendChild($param); const dependencies = {}; for (const dependent of (_param$dependencies = param.dependencies) !== null && _param$dependencies !== void 0 ? _param$dependencies : []) { var _param$dependencies; dependencies[dependent] = condition.params[dependent]; } const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; let callback = null; switch (param.type) { case "choice": { const $select = document.createElement("select"); $select.dataset.paramid = param.id; $param.appendChild($select); const options = typeof param.options === "function" ? param.options(dependencies) : param.options; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $select.appendChild($option); } if (condition.params[param.id] !== undefined) { $select.value = condition.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $select.value = _default; condition.params[param.id] = _default; } callback = () => { const dependencies = {}; for (const dependent of (_param$dependencies2 = param.dependencies) !== null && _param$dependencies2 !== void 0 ? _param$dependencies2 : []) { var _param$dependencies2; dependencies[dependent] = condition.params[dependent]; } const value = $select.value; const options = typeof param.options === "function" ? param.options(dependencies) : param.options; $select.innerHTML = ""; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $select.appendChild($option); } if (options.includes(value)) $select.value = value; else { const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; $select.value = _default; condition.params[param.id] = _default; } }; $select.addEventListener("change", () => { condition.params[param.id] = $select.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "text": { const $input = document.createElement("input"); $input.type = "text"; $input.dataset.paramid = param.id; $param.appendChild($input); if (condition.params[param.id] !== undefined) { $input.value = condition.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.value = _default; condition.params[param.id] = _default; } $input.addEventListener("change", () => { condition.params[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "boolean": { const $input = document.createElement("input"); $input.type = "checkbox"; $input.dataset.paramid = param.id; $param.appendChild($input); if (condition.params[param.id] !== undefined) { $input.checked = condition.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.checked = _default; condition.params[param.id] = _default; } $input.addEventListener("change", () => { condition.params[param.id] = $input.checked; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "number": { const $input = document.createElement("input"); $input.type = "number"; $input.dataset.paramid = param.id; if ("min" in param) $input.min = param.min; if ("max" in param) $input.max = param.max; $param.appendChild($input); if (condition.params[param.id] !== undefined) { $input.value = condition.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.value = _default; condition.params[param.id] = _default; } $input.addEventListener("change", () => { condition.params[param.id] = parseFloat($input.value); for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; } if (typeof callback === "function") for (const dependent of (_param$dependencies3 = param.dependencies) !== null && _param$dependencies3 !== void 0 ? _param$dependencies3 : []) { var _param$dependencies3; if (!dependencyMap.has(dependent)) dependencyMap.set(dependent, []); dependencyMap.get(dependent).push(callback); } } for (const subaction of action.actions) createActionItem($item, subaction, script, callback); } else { const event = _events.events[action.name]; $item.innerHTML = `\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="${"icon" in event ? event.icon : "fas fa-bolt"}"></span>\n\t\t\t\t\t\t\t\t${"title" in event ? event.title : action.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`; const dependencyMap = new Map; for (const param of (0, _scripts.sortDependencies)(((_event$parameters = event.parameters) === null || _event$parameters === void 0 ? void 0 : _event$parameters.call(event)) || [])) { var _event$parameters; const $param = document.createElement("div"); $param.className = "action-parameter"; $param.innerHTML = `<div class="parameter-title">${param.title}</div>`; $item.appendChild($param); const dependencies = {}; for (const dependent of (_param$dependencies4 = param.dependencies) !== null && _param$dependencies4 !== void 0 ? _param$dependencies4 : []) { var _param$dependencies4; dependencies[dependent] = action.params[dependent]; } const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; let callback = null; switch (param.type) { case "choice": { const $select = document.createElement("select"); $select.dataset.paramid = param.id; $param.appendChild($select); const options = typeof param.options === "function" ? param.options(dependencies) : param.options; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $select.appendChild($option); } if (action.params[param.id] !== undefined) { $select.value = action.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $select.value = _default; action.params[param.id] = _default; } callback = () => { const dependencies = {}; for (const dependent of (_param$dependencies5 = param.dependencies) !== null && _param$dependencies5 !== void 0 ? _param$dependencies5 : []) { var _param$dependencies5; dependencies[dependent] = action.params[dependent]; } const value = $select.value; const options = typeof param.options === "function" ? param.options(dependencies) : param.options; $select.innerHTML = ""; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $select.appendChild($option); } if (options.includes(value)) $select.value = value; else { const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; $select.value = _default; action.params[param.id] = _default; } }; $select.addEventListener("change", () => { action.params[param.id] = $select.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "text": { const $input = document.createElement("input"); $input.type = "text"; $input.dataset.paramid = param.id; $param.appendChild($input); if (action.params[param.id] !== undefined) { $input.value = action.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.value = _default; action.params[param.id] = _default; } $input.addEventListener("change", () => { action.params[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "boolean": { const $input = document.createElement("input"); $input.type = "checkbox"; $input.dataset.paramid = param.id; $param.appendChild($input); if (action.params[param.id] !== undefined) { $input.checked = action.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.checked = _default; action.params[param.id] = _default; } $input.addEventListener("change", () => { action.params[param.id] = $input.checked; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "duration": { const $input = document.createElement("duration-input"); $input.dataset.paramid = param.id; $param.appendChild($input); if (action.params[param.id] !== undefined) { $input.value = action.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.value = _default; action.params[param.id] = _default; } $input.addEventListener("change", () => { action.params[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; } if (typeof callback === "function") for (const dependent of (_param$dependencies6 = param.dependencies) !== null && _param$dependencies6 !== void 0 ? _param$dependencies6 : []) { var _param$dependencies6; if (!dependencyMap.has(dependent)) dependencyMap.set(dependent, []); dependencyMap.get(dependent).push(callback); } } } $item.querySelector(".move-action-up").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); const parent = findParentAction(action, script); const index = parent.actions.indexOf(action); if (parent.actions.indexOf(action) === 0) { if (parent.name !== "if" && parent.name !== "if not") return; const grandparent = findParentAction(parent, script); grandparent.actions.splice(grandparent.actions.indexOf(parent), 0, action); parent.actions.splice(index, 1); } else { const temp = parent.actions[index - 1]; if (temp.name === "if" || temp.name === "if not") { temp.actions.push(action); parent.actions.splice(index, 1); } else { parent.actions.splice(index, 1); parent.actions.splice(index - 1, 0, action); } } callback(); }); $item.querySelector(".move-action-down").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); const parent = findParentAction(action, script); const index = parent.actions.indexOf(action); if (parent.actions.indexOf(action) === parent.actions.length - 1) { if (parent.name !== "if" && parent.name !== "if not") return; const grandparent = findParentAction(parent, script); grandparent.actions.splice(grandparent.actions.indexOf(parent) + 1, 0, action); parent.actions.splice(index, 1); } else { const temp = parent.actions[index + 1]; if (temp.name === "if" || temp.name === "if not") { temp.actions.unshift(action); parent.actions.splice(index, 1); } else { parent.actions.splice(index, 1); parent.actions.splice(index + 1, 0, action); } } callback(); }); $item.querySelector(".delete-action").addEventListener("click", async e => { this.ws.audio.playSound([ "ui", "click" ]); if (e.shiftKey || await this.ws.gui.dialog.confirm("Delete Action", "Are you sure you want to delete this action?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>", null, true)) { const parent = findParentAction(action, script); parent.actions.splice(parent.actions.indexOf(action), 1); callback(); } }); }; const duplicates = () => { const keys = new Set; const overflow = new Set; this.ws.store.control_scripts.forEach(script => { script.keys.forEach(key => { if (keys.has(key)) overflow.add(key); else keys.add(key); }); }); document.querySelectorAll(".control-keys div[data-key]").forEach($key => { $key.classList.toggle("duplicate", overflow.has($key.dataset.key)); }); }; const buildScriptInterface = ($script, script) => { $script.innerHTML = `\n\t\t\t\t\t<div class="control-container">\n\t\t\t\t\t\t<div class="control-container-title">When these keys are pressed</div>\n\t\t\t\t\t\t<div class="control-keys"></div>\n\t\t\t\t\t\t<div class="control-container-title margin-top">Complete these actions</div>\n\t\t\t\t\t\t<div class="control-actions"></div>\n\t\t\t\t\t</div>\n\t\t\t\t`; const $keys = $script.querySelector(".control-keys"); for (const key of script.keys) { const $key = document.createElement("div"); $key.dataset.key = key; $key.innerHTML = `\n\t\t\t\t\t\t<span class="key-elem-title">${key === " " ? "space" : key}</span>\n\t\t\t\t\t\t<span class="fas fa-trash-can remove"></span>\n\t\t\t\t\t`; $keys.appendChild($key); $key.querySelector(".remove").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); script.keys.splice(script.keys.indexOf(key), 1); buildScriptInterface($script, script); duplicates(); }); } const $addKey = document.createElement("div"); $addKey.className = "add"; $addKey.innerHTML = `<span class="fas fa-plus"></span>`; $keys.appendChild($addKey); $addKey.addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); document.querySelectorAll(".key-select").forEach($el => $el.remove()); const $keySelect = document.createElement("div"); $keySelect.className = "key-select animate-loading-dots"; $keySelect.textContent = "Press a key"; $keys.insertBefore($keySelect, $addKey); const remove = () => { $keySelect.remove(); _classPrivateFieldSet(_keypressListener, this, null); }; $keySelect.addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); remove(); }); _classPrivateFieldSet(_keypressListener, this, (key, final, event) => { if (key === "escape") remove(); else if (final) { if (!(0, _controlKeys.validateShortcut)(key)) { remove(); this.ws.gui.dialog.toast("Invalid Key", "The key you pressed is not a valid shortcut key.", "error"); return; } if (!script.keys.includes(key)) script.keys.push(key); remove(); buildScriptInterface($script, script); duplicates(); } else $keySelect.textContent = key || "Press a key"; }); }); const $actions = $script.querySelector(".control-actions"); for (const action of script.actions) createActionItem($actions, action, script, () => { this.controls(); }); const $bottom = document.createElement("div"); $bottom.className = "control-bottom-container"; $bottom.innerHTML = `\n\t\t\t\t\t<div class="add-action-button"></div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<button class="add-action-button control-delete" style="--background: 211, 51, 51;">Delete</button>\n\t\t\t\t\t</div>\n\t\t\t\t`; $actions.appendChild($bottom); $bottom.querySelector(".control-delete").addEventListener("click", async e => { this.ws.audio.playSound([ "ui", "click" ]); if (e.shiftKey || await this.ws.gui.dialog.confirm("Delete Control Script", "Are you sure you want to delete this control script? This action cannot be undone?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>", null, true)) { this.ws.store.control_scripts.splice(this.ws.store.control_scripts.indexOf(script), 1); this.controls(); } }); const resetAddAction = () => { const $addAction = $bottom.querySelector(".add-action-button"); $addAction.innerHTML = `<button class="add-action-button new-button"><span class="fa fa-plus"></span> Add Action</button>`; $addAction.querySelector(".new-button").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); $addAction.innerHTML = `\n\t\t\t\t\t\t\t<select style="height: 35px;"></select>\n\t\t\t\t\t\t\t<button class="add-action-button cancel-button" style="margin-left: 10px;">Cancel</button>\n\t\t\t\t\t\t\t<button class="add-action-button create-button" style="margin-left: 10px;">Create</button>\n\t\t\t\t\t\t`; const $select = $addAction.querySelector("select"); $select.innerHTML += `<option value="if">If Condition</option>`; $select.innerHTML += `<option value="if not">If Not Condition</option>`; Object.entries(_events.events).forEach(([key, event]) => { if ("title" in event) $select.innerHTML += `<option value="${key}">${event.title}</option>`; else $select.innerHTML += `<option value="${key}">${key}</option>`; }); $addAction.querySelector(".cancel-button").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); resetAddAction(); }); $addAction.querySelector(".create-button").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); if ($select.value === "if" || $select.value === "if not" || $select.value in _events.events) { const action = { name: $select.value, params: {} }; if ($select.value === "if" || $select.value === "if not") { action.condition = { name: Object.keys(_conditions.conditions)[0] }; action.actions = []; } script.actions.push(action); buildScriptInterface($script, script); } }); }); }; resetAddAction(); }; const $content = document.querySelector("#settings-container > .settings > .settings-right > .controls"); $content.querySelectorAll(".control-script-item").forEach(script => script.remove()); for (const script of this.ws.store.control_scripts) { const $script = document.createElement("div"); $script.className = "settings-section control-script-item"; $content.appendChild($script); buildScriptInterface($script, script); } duplicates(); } } zen() { this.deselect(); document.querySelector("#settings-zen-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .zen").classList.remove("hidden"); } app() { this.deselect(); document.querySelector("#settings-app-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .app").classList.remove("hidden"); } queue() { this.deselect(); document.querySelector("#settings-queue-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .queue").classList.remove("hidden"); } accessibility() { this.deselect(); document.querySelector("#settings-accessibility-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .accessibility").classList.remove("hidden"); } AI() { this.deselect(); document.querySelector("#settings-AI-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .AI").classList.remove("hidden"); } autoReporting() { this.deselect(); document.querySelector("#settings-auto-reporting-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .auto-reporting").classList.remove("hidden"); } gadgets() { this.deselect(); document.querySelector("#settings-gadgets-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .gadgets").classList.remove("hidden"); } whitelist(type) { this.deselect(); document.querySelector(`#settings-whitelist-${type}s-button`).classList.add("selected"); document.querySelector(`#settings-container > .settings > .settings-right > .whitelist.${type}s`).classList.remove("hidden"); { const $whitelist = document.querySelector(`#settings-whitelist-${type}s-expiry`); $whitelist.value = this.ws.store.settings.expiry.whitelist[`${type}s`]; $whitelist.addEventListener("change", e => this.ws.store.settings.expiry.whitelist[`${type}s`] = e.target.value); const $input = document.querySelector(`#settings-whitelist-${type}s-input`); const add = () => { const value = $input.value.trim(); if (value) { $input.value = ""; this.ws.store.whitelist[`${type}s`].set(value, [ Date.now(), this.ws.util.expiryToDate(this.ws.store.settings.expiry.whitelist[`${type}s`]).valueOf() ]); this.ws.store.statistics.items_whitelisted.total++; this.ws.store.statistics.items_whitelisted[`${type}s`]++; this.ws.gui.renderQueue(); this.whitelist(type); } }; if (type === "tag") if (this.wikipediaTags) { const tags = this.wikipediaTags.map(tag => tag.name).sort(); for (const tag of tags) { const $option = document.createElement("option"); $option.value = tag; $option.textContent = tag; $input.appendChild($option); } $input.setAttribute("list", $input.id + "-datalist"); const $datalist = document.createElement("datalist"); $datalist.id = $input.id + "-datalist"; $input.parentElement.appendChild($datalist); for (const tag of tags) { const $option = document.createElement("option"); $option.value = tag; $datalist.appendChild($option); } } document.querySelector(`#settings-whitelist-${type}s-add-button`).addEventListener("click", add); $input.addEventListener("keydown", e => { if (e.key === "Enter") { add(); e.preventDefault(); } }); } { const $container = document.querySelector(`#settings-whitelist-${type}s-list`); $container.innerHTML = ""; const link = value => { switch (type) { case "user": return this.ws.page(`Special:Contributions/${value}`); case "page": return this.ws.page(value); case "tag": return this.ws.page(`Special:Tags/${value}`); } }; const sorted = [ ...this.ws.store.whitelist[`${type}s`] ].sort((a, b) => b[1][1] - a[1][1]); for (const [value, time] of sorted) { const $item = document.createElement("div"); const date = new Date(time[0]); const expires = time[1] === Infinity ? "Never" : `${new Date(time[1]).toLocaleDateString()} ${new Date(time[1]).toLocaleTimeString()}`; $item.innerHTML = `\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${link(value)}">${value}</a>\n\t\t\t\t\t\t<span>Added: ${date.toLocaleDateString()} ${date.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now() > time[1] ? "expired" : ""}">\n\t\t\t\t\t\t\t${Date.now() > time[1] ? "Expired" : "Expires"}: ${expires}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from whitelisted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`; $item.querySelector(".remove-button").addEventListener("click", () => { this.ws.store.whitelist[`${type}s`].delete(value); this.ws.gui.renderQueue(); this.whitelist(type); }); $container.appendChild($item); } if (sorted.length === 0) $container.innerHTML = `<div class="empty">No whitelisted ${type}s.</div>`; } } highlight(type) { this.deselect(); document.querySelector(`#settings-highlight-${type}s-button`).classList.add("selected"); document.querySelector(`#settings-container > .settings > .settings-right > .highlight.${type}s`).classList.remove("hidden"); { const $whitelist = document.querySelector(`#settings-highlight-${type}s-expiry`); $whitelist.value = this.ws.store.settings.expiry.highlight[`${type}s`]; $whitelist.addEventListener("change", e => this.ws.store.settings.expiry.highlight[`${type}s`] = e.target.value); const $input = document.querySelector(`#settings-highlight-${type}s-input`); const add = () => { const value = $input.value.trim(); if (value) { $input.value = ""; this.ws.store.highlight[`${type}s`].set(value, [ Date.now(), this.ws.util.expiryToDate(this.ws.store.settings.expiry.highlight[`${type}s`]).valueOf() ]); this.ws.store.statistics.items_highlighted.total++; this.ws.store.statistics.items_highlighted[`${type}s`]++; this.ws.gui.renderQueue(); this.highlight(type); } }; if (type === "tag") if (this.wikipediaTags) { const tags = this.wikipediaTags.map(tag => tag.name).sort(); for (const tag of tags) { const $option = document.createElement("option"); $option.value = tag; $option.textContent = tag; $input.appendChild($option); } $input.setAttribute("list", $input.id + "-datalist"); const $datalist = document.createElement("datalist"); $datalist.id = $input.id + "-datalist"; $input.parentElement.appendChild($datalist); for (const tag of tags) { const $option = document.createElement("option"); $option.value = tag; $datalist.appendChild($option); } } document.querySelector(`#settings-highlight-${type}s-add-button`).addEventListener("click", add); $input.addEventListener("keydown", e => { if (e.key === "Enter") { add(); e.preventDefault(); } }); } { const $container = document.querySelector(`#settings-highlight-${type}s-list`); $container.innerHTML = ""; const link = value => { switch (type) { case "user": return this.ws.page(`Special:Contributions/${value}`); case "page": return this.ws.page(value); case "tag": return this.ws.page(`Special:Tags/${value}`); } }; const sorted = [ ...this.ws.store.highlight[`${type}s`] ].sort((a, b) => b[1][1] - a[1][1]); for (const [value, time] of sorted) { const $item = document.createElement("div"); const date = new Date(time[0]); const expires = time[1] === Infinity ? "Never" : `${new Date(time[1]).toLocaleDateString()} ${new Date(time[1]).toLocaleTimeString()}`; $item.innerHTML = `\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${link(value)}">${value}</a>\n\t\t\t\t\t\t<span>Added: ${date.toLocaleDateString()} ${date.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now() > time[1] ? "expired" : ""}">\n\t\t\t\t\t\t\t${Date.now() > time[1] ? "Expired" : "Expires"}: ${expires}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from highlighted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`; $item.querySelector(".remove-button").addEventListener("click", () => { this.ws.store.highlight[`${type}s`].delete(value); this.ws.gui.renderQueue(); this.highlight(type); }); $container.appendChild($item); } if (sorted.length === 0) $container.innerHTML = `<div class="empty">No highlighted ${type}s.</div>`; } } statistics() { this.deselect(); document.querySelector("#settings-statistics-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .statistics").classList.remove("hidden"); { const $reset = document.querySelector("#reset-statistics-button"); $reset.addEventListener("click", async () => { if (await this.ws.gui.dialog.confirm("Reset statistics", "Are you sure you want to reset all statistics? This action cannot be undone.", undefined, true)) { this.ws.store.statistics = {}; this.ws.storage.load(this.ws.store); this.ws.time.load = performance.now(); this.statistics(); } }); } const stats = this.ws.store.statistics; { const $edits = document.querySelector("#stats-total-reviewed"); $edits.textContent = (stats.edits_reviewed.total || 0).toLocaleString(); const $thanks = document.querySelector("#stats-thanks-percentage"); $thanks.textContent = (stats.edits_reviewed.thanked / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $recent = document.querySelector("#stats-recent-changes-reviewed"); $recent.textContent = (stats.recent_changes_reviewed.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-recent-changes-percentage"); $percentage.textContent = (stats.recent_changes_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $pending = document.querySelector("#stats-pending-changes-reviewed"); $pending.textContent = (stats.pending_changes_reviewed.total || 0).toLocaleString(); const $accepted = document.querySelector("#stats-pending-changes-accepted"); $accepted.textContent = (stats.pending_changes_reviewed.accepted || 0).toLocaleString(); const $acceptedPercentage = document.querySelector("#stats-pending-changes-accepted-percentage"); $acceptedPercentage.textContent = (stats.pending_changes_reviewed.accepted / stats.pending_changes_reviewed.total * 100 || 0).toFixed(2); const $rejected = document.querySelector("#stats-pending-changes-rejected"); $rejected.textContent = (stats.pending_changes_reviewed.rejected || 0).toLocaleString(); const $rejectedPercentage = document.querySelector("#stats-pending-changes-rejected-percentage"); $rejectedPercentage.textContent = (stats.pending_changes_reviewed.rejected / stats.pending_changes_reviewed.total * 100 || 0).toFixed(2); const $percentage = document.querySelector("#stats-pending-changes-percentage"); $percentage.textContent = (stats.pending_changes_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $users = document.querySelector("#stats-user-creations-reviewed"); $users.textContent = (stats.users_reviewed.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-user-creations-percentage"); $percentage.textContent = (stats.users_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $watchlist = document.querySelector("#stats-watchlist-changes-reviewed"); $watchlist.textContent = (stats.watchlist_changes_reviewed.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-watchlist-changes-percentage"); $percentage.textContent = (stats.watchlist_changes_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $abuselog = document.querySelector("#stats-abuselog-changes-reviewed"); $abuselog.textContent = (stats.abuselogs_reviewed.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-abuselog-changes-percentage"); $percentage.textContent = (stats.abuselogs_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $reverts = document.querySelector("#stats-reverts-made"); $reverts.textContent = (stats.reverts_made.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-reverts-percentage"); $percentage.textContent = (stats.reverts_made.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); const $goodfaith = document.querySelector("#stats-goodfaith-reverts-percentage"); $goodfaith.textContent = (stats.reverts_made.good_faith / stats.reverts_made.total * 100 || 0).toFixed(2); const $recent = document.querySelector("#stats-recent-reverts-percentage"); $recent.textContent = (stats.reverts_made.from_recent_changes / stats.reverts_made.total * 100 || 0).toFixed(2); const $pending = document.querySelector("#stats-pending-reverts-percentage"); $pending.textContent = (stats.reverts_made.from_pending_changes / stats.reverts_made.total * 100 || 0).toFixed(2); const $watchlist = document.querySelector("#stats-watchlist-reverts-percentage"); $watchlist.textContent = (stats.reverts_made.from_watchlist / stats.reverts_made.total * 100 || 0).toFixed(2); const $abuselog = document.querySelector("#stats-abuselog-reverts-percentage"); $abuselog.textContent = (stats.reverts_made.from_abuselogs / stats.reverts_made.total * 100 || 0).toFixed(2); const $other = document.querySelector("#stats-other-reverts-percentage"); $other.textContent = (stats.reverts_made.from_loaded_edits / stats.reverts_made.total * 100 || 0).toFixed(2); } { const $welcomed = document.querySelector("#stats-users-welcomed"); $welcomed.textContent = (stats.users_welcomed.total || 0).toLocaleString(); const $message = document.querySelector("#stats-users-welcomed-message"); if (stats.edits_reviewed.total === stats.users_welcomed.total) $message.textContent = `You welcome every user whose edit you review! (${stats.users_welcomed.total.toLocaleString()})`; else { if (stats.users_welcomed.total === 0) $message.innerHTML = `For every Infinity edits you review, you still won&rsquo;t welcome a new user.`; else $message.textContent = `For every ${(stats.edits_reviewed.total / stats.users_welcomed.total || 0).toFixed(3)} edits you review, you welcome a new user.`; } } { const $warnings = document.querySelector("#stats-warnings"); $warnings.textContent = (stats.warnings_issued.total || 0).toLocaleString(); const $level1 = document.querySelector("#stats-warning-1-percentage"); $level1.textContent = (stats.warnings_issued.level_1 / stats.warnings_issued.total * 100 || 0).toFixed(2); const $level2 = document.querySelector("#stats-warning-2-percentage"); $level2.textContent = (stats.warnings_issued.level_2 / stats.warnings_issued.total * 100 || 0).toFixed(2); const $level3 = document.querySelector("#stats-warning-3-percentage"); $level3.textContent = (stats.warnings_issued.level_3 / stats.warnings_issued.total * 100 || 0).toFixed(2); const $level4 = document.querySelector("#stats-warning-4-percentage"); $level4.textContent = (stats.warnings_issued.level_4 / stats.warnings_issued.total * 100 || 0).toFixed(2); const $level4im = document.querySelector("#stats-warning-4im-percentage"); $level4im.textContent = (stats.warnings_issued.level_4im / stats.warnings_issued.total * 100 || 0).toFixed(2); } { const $reports = document.querySelector("#stats-reports"); $reports.textContent = (stats.reports_filed.total || 0).toLocaleString(); const $AIV = document.querySelector("#stats-AIV-reports-percentage"); $AIV.textContent = (stats.reports_filed.AIV / stats.reports_filed.total * 100 || 0).toFixed(2); const $UAA = document.querySelector("#stats-UAA-reports-percentage"); $UAA.textContent = (stats.reports_filed.UAA / stats.reports_filed.total * 100 || 0).toFixed(2); const $block = document.querySelector("#stats-global-block-reports-percentage"); $block.textContent = (stats.reports_filed.global_block / stats.reports_filed.total * 100 || 0).toFixed(2); const $lock = document.querySelector("#stats-global-lock-reports-percentage"); $lock.textContent = (stats.reports_filed.global_lock / stats.reports_filed.total * 100 || 0).toFixed(2); const $RFPP = document.querySelector("#stats-RFPP-reports-percentage"); $RFPP.textContent = (stats.reports_filed.RFPP / stats.reports_filed.total * 100 || 0).toFixed(2); } { const $watched = document.querySelector("#stats-pages-watched"); $watched.textContent = (stats.watchlist.watched || 0).toLocaleString(); const $unwatched = document.querySelector("#stats-pages-unwatched"); $unwatched.textContent = (stats.watchlist.unwatched || 0).toLocaleString(); } { const $whitelisted = document.querySelector("#stats-items-whitelisted"); $whitelisted.textContent = (stats.items_whitelisted.total || 0).toLocaleString(); const $users = document.querySelector("#stats-users-whitelisted"); $users.textContent = (stats.items_whitelisted.users || 0).toLocaleString(); const $usersPercentage = document.querySelector("#stats-users-whitelisted-percentage"); $usersPercentage.textContent = (stats.items_whitelisted.users / stats.items_whitelisted.total * 100 || 0).toFixed(2); const $pages = document.querySelector("#stats-pages-whitelisted"); $pages.textContent = (stats.items_whitelisted.pages || 0).toLocaleString(); const $pagesPercentage = document.querySelector("#stats-pages-whitelisted-percentage"); $pagesPercentage.textContent = (stats.items_whitelisted.pages / stats.items_whitelisted.total * 100 || 0).toFixed(2); const $tags = document.querySelector("#stats-tags-whitelisted"); $tags.textContent = (stats.items_whitelisted.tags || 0).toLocaleString(); const $tagsPercentage = document.querySelector("#stats-tags-whitelisted-percentage"); $tagsPercentage.textContent = (stats.items_whitelisted.tags / stats.items_whitelisted.total * 100 || 0).toFixed(2); } { const $highlighted = document.querySelector("#stats-items-highlighted"); $highlighted.textContent = (stats.items_highlighted.total || 0).toLocaleString(); const $users = document.querySelector("#stats-users-highlighted"); $users.textContent = (stats.items_highlighted.users || 0).toLocaleString(); const $usersPercentage = document.querySelector("#stats-users-highlighted-percentage"); $usersPercentage.textContent = (stats.items_highlighted.users / stats.items_highlighted.total * 100 || 0).toFixed(2); const $pages = document.querySelector("#stats-pages-highlighted"); $pages.textContent = (stats.items_highlighted.pages || 0).toLocaleString(); const $pagesPercentage = document.querySelector("#stats-pages-highlighted-percentage"); $pagesPercentage.textContent = (stats.items_highlighted.pages / stats.items_highlighted.total * 100 || 0).toFixed(2); const $tags = document.querySelector("#stats-tags-highlighted"); $tags.textContent = (stats.items_highlighted.tags || 0).toLocaleString(); const $tagsPercentage = document.querySelector("#stats-tags-highlighted-percentage"); $tagsPercentage.textContent = (stats.items_highlighted.tags / stats.items_highlighted.total * 100 || 0).toFixed(2); } { const time = stats.session_time + (performance.now() - this.ws.time.load); const $time = document.querySelector("#stats-session-time"); $time.textContent = formatTime(time); const $reports = document.querySelector("#stats-reports-per-day"); $reports.textContent = (stats.reports_filed.total / (time / 864e5 || 1) || 0).toFixed(2); const $reverts = document.querySelector("#stats-reverts-per-hour"); $reverts.textContent = (stats.reverts_made.total / (time / 36e5 || 1) || 0).toFixed(2); const $reviews = document.querySelector("#stats-reviews-per-minute"); $reviews.textContent = (stats.edits_reviewed.total / (time / 6e4 || 1) || 0).toFixed(2); } } save() { this.deselect(); document.querySelector("#settings-save-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .save").classList.remove("hidden"); document.querySelector("#settings-save-status").classList.add("hidden"); } changelog() { this.deselect(); document.querySelector("#settings-changelog-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .changelog").classList.remove("hidden"); const $changelog = document.querySelector("#settings-container > .settings > .settings-right > .changelog > div > .changelog-content"); $changelog.innerHTML = "<em class='animate-loading-dots'>Loading changelog</em>"; _wikishield.WikiShield.config.changelog.HTML.then(html => $changelog.innerHTML = html); } about() { this.deselect(); document.querySelector("#settings-about-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .about").classList.remove("hidden"); document.querySelector("#settings-about-version").textContent = _wikishield.WikiShield.config.version; document.querySelectorAll("#settings-container > .settings > .settings-right > .about > .randomize").forEach($el => { for (let i = $el.children.length; i >= 0; i--) $el.appendChild($el.children[Math.random() * i | 0]); }); } } exports.Settings = Settings; /***/ }, /***/ 7698(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.BuildPalette = BuildPalette; function BuildPalette(steps, ...colors) { const paper = document.createElement("canvas"); paper.width = steps; paper.height = 1; const pen = paper.getContext("2d"); const gradient = pen.createLinearGradient(0, 0, paper.width, 0); const step = 1 / (colors.length - 1); colors.forEach((color, index) => { gradient.addColorStop(step * index, color); }); pen.fillStyle = gradient; pen.fillRect(0, 0, paper.width, paper.height); const data = pen.getImageData(0, 0, paper.width, 1).data; return Array.from({ length: steps }, (_, i) => { const offset = i * 4; return `rgb(${data[offset]}, ${data[offset + 1]}, ${data[offset + 2]})`; }); } /***/ }, /***/ 3241(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.expiryRegex = exports.Utility = void 0; var _scriptEsm = __webpack_require__(4551); function _wrapRegExp() { _wrapRegExp = function(e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap; function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), _setPrototypeOf(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function(r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o]; else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length; ) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function(r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function(t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function(e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function() { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } const expiryRegex = exports.expiryRegex = _wrapRegExp(/(infinity|^(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)W)?(([0-9]+)D)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?)$/, { years: 3, months: 5, weeks: 7, days: 9, hours: 11, minutes: 13, seconds: 15 }); function hasApproxSubstring(needle, haystack, k) { const n = needle.length; const m = haystack.length; if (n === 0) return true; if (m === 0) return n <= k; let prev = new Array(m + 1).fill(0); let curr = new Array(m + 1).fill(0); for (let j = 0; j <= m; j++) prev[j] = 0; for (let i = 1; i <= n; i++) { curr[0] = i; let rowMin = curr[0]; for (let j = 1; j <= m; j++) { const cost = needle[i - 1] === haystack[j - 1] ? 0 : 1; const del = prev[j] + 1; const ins = curr[j - 1] + 1; const sub = prev[j - 1] + cost; const d = Math.min(del, ins, sub); curr[j] = d; if (d < rowMin) rowMin = d; if (i === n && d <= k) return true; } if (rowMin > k) return false; [prev, curr] = [ curr, prev ]; } return false; } class Utility { constructor(ws) { this.ws = ws; } escapeRegex(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } escape(text) { const div = document.createElement("div"); div.textContent = text; return div.innerHTML; } utcString(date) { if (date === Infinity) return "indefinite"; const pad = this.padString; return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1, 2)}-${pad(date.getUTCDate(), 2)}T${pad(date.getUTCHours(), 2)}:${pad(date.getUTCMinutes(), 2)}:${pad(date.getUTCSeconds(), 2)}`; } padString(str, len) { str = str.toString(); while (str.length < len) { str = `0${str}`; } return str; } getMonth(n) { const monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; return monthNames[n]; } monthSectionName() { return `${this.getMonth((new Date).getUTCMonth())} ${(new Date).getUTCFullYear()}`; } escape(str) { return (str || "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;"); } textify(str) { const div = document.createElement("div"); div.innerHTML = str; return div.textContent || div.innerText || ""; } pageLink(title, usePhpString = false, encode = true) { return usePhpString ? `https://${this.ws.server}/w/index.php${title}` : `https://${this.ws.server}/wiki/${encode ? encodeURIComponent(title) : title}`; } truncate(text, length) { return (0, _scriptEsm.truncate)(text, length); } formatBytes(bytes) { const sizes = [ "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB" ]; if (bytes === 0) return "0 B"; const i = Math.floor(Math.log(bytes) / Math.log(1024)); return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + " " + sizes[i]; } getChangeColor(delta) { if (delta === 0) return "#888"; // Gray for no change if (delta > 0) { if (delta >= 1e3) return "#00b894"; if (delta >= 500) return "#00d4a1"; if (delta >= 100) return "#26de81"; return "#55efc4"; } else { const absDelta = Math.abs(delta); if (absDelta >= 1e3) return "#d63031"; if (absDelta >= 500) return "#e74c3c"; if (absDelta >= 100) return "#ff6b6b"; return "#ff8787"; } } getChangeString(delta) { return delta > 0 ? "+" + delta : delta === 0 ? "0" : `&ndash;${Math.abs(delta).toString()}`; } formatNotificationTime(date, now = new Date) { const seconds = Math.floor((now - date) / 1e3); if (seconds <= 0) return "Now"; else if (seconds < 60) return `${seconds}s ago`; else if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`; else if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`; else if (seconds < 2592e3) return `${Math.floor(seconds / 86400)}d ago`; else if (seconds < 31536e3) return `${Math.floor(seconds / 2592e3)}mo ago`; else return `${Math.floor(seconds / 31536e3)}y ago`; } formatDuration(date, now = new Date) { const seconds = Math.floor((now - date) / 1e3); if (seconds <= 0) return "0s"; else if (seconds < 60) return `${seconds}s`; else if (seconds < 3600) return `${Math.floor(seconds / 60)}m`; else if (seconds < 86400) return `${Math.floor(seconds / 3600)}h`; else if (seconds < 2592e3) return `${Math.floor(seconds / 86400)}d`; else if (seconds < 31536e3) return `${Math.floor(seconds / 2592e3)}mo`; else return `${Math.floor(seconds / 31536e3)}y`; } match(needle, haystack) { if (this.ws.store.settings.username_highlighting.fuzzy) { return hasApproxSubstring(needle, haystack, 2); } else { return haystack.toLowerCase().includes(needle.toLowerCase()); } } isIPv4Address(address) { const byte = "(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|0?[0-9]{1,2})"; const regex = new RegExp(`^(${byte}\\.){3}${byte}$`); return regex.test(address); } isIPv6Address(address) { const regex = new RegExp("^(?::(?::|(?::[0-9A-Fa-f]{1,4}){1,7})|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,6}::|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){7})$"); if (regex.test(address)) return true; return new RegExp("^[0-9A-Fa-f]{1,4}(?:::?[0-9A-Fa-f]{1,4}){1,6}$").test(address) && /::/.test(address) && !/::.*::/.test(address); } isIPAddress(address) { return this.isIPv4Address(address) || this.isIPv6Address(address); } isTempAccount(username) { return /^~[0-9]{4,}(-[0-9A-Fa-f]{5})*(-[0-9A-Fa-f]{1,5})$/.test(username); } expiryToDate(string) { if (string === "infinity") return Infinity; const now = new Date; const match = expiryRegex.exec(string); if (!match) return now; return new Date(now.getFullYear() + (parseInt(match.groups.years) || 0), now.getMonth() + (parseInt(match.groups.months) || 0), now.getDate() + (parseInt(match.groups.weeks) || 0) * 7 + (parseInt(match.groups.days) || 0), now.getHours() + (parseInt(match.groups.hours) || 0), now.getMinutes() + (parseInt(match.groups.minutes) || 0), now.getSeconds() + (parseInt(match.groups.seconds) || 0)); } getPageSections(content) { // split into [ { title, level, content }, ... ] const lines = content.split("\n"); const sections = []; let currentSection = { title: "", heading: "", level: 0, content: "" }; for (const line of lines) { const match = /^(=+)\s*(.*?)\s*\1\s*$/.exec(line); if (match) { if (currentSection.title !== "") sections.push(currentSection); currentSection = { title: match[2], heading: match[0], level: match[1].length, content: "" }; } else { if (currentSection.content !== "") currentSection.content += "\n"; currentSection.content += line; } } if (currentSection.content !== "" || currentSection.title !== "") sections.push(currentSection); return sections; } } exports.Utility = Utility; /***/ }, /***/ 5564(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.sortDependencies = sortDependencies; function sortDependencies(items) { const map = new Map(items.map(item => [ item.id, item ])); const visited = new Set; const stack = new Set; const result = []; const visit = (id, path) => { if (visited.has(id)) return; else if (stack.has(id)) { const start = path.indexOf(id); const cycle = path.slice(start).concat(id).join(" -> "); throw new Error(`Cyclic dependency detected: ${cycle}`); } const node = map.get(id); if (!node) throw new Error(`Unknown dependency: ${id}`); stack.add(id); path.push(id); const dependencies = node.dependencies || []; for (const dependency of dependencies) visit(dependency, path); path.pop(); visited.add(id); stack.delete(id); result.push(node); }; for (const item of items) if (!visited.has(item.id)) visit(item.id, []); return result; } /***/ }, /***/ 2069(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Text = void 0; var _Text; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class Case {} _defineProperty(Case, "Lower", Symbol("lower case")); _defineProperty(Case, "Upper", Symbol("UPPER CASE")); _defineProperty(Case, "Title", Symbol("Title Case")); _defineProperty(Case, "Sentence", Symbol("Sentence case")); _defineProperty(Case, "Camel", Symbol("camelCase")); _defineProperty(Case, "Pascal", Symbol("PascalCase")); _defineProperty(Case, "Snake", Symbol("snake_Case")); _defineProperty(Case, "Split", Symbol("split,case")); var _inSentenceCase = new WeakMap; var _single = new WeakMap; var _plural = new WeakMap; var _Text_brand = new WeakSet; class Text { static pluralize(word, n, plural) { return new Text(word).plural(plural).get(n); } constructor(text, currentCase = Case.Sentence) { _classPrivateMethodInitSpec(this, _Text_brand); _classPrivateFieldInitSpec(this, _inSentenceCase, false); _classPrivateFieldInitSpec(this, _single, void 0); _classPrivateFieldInitSpec(this, _plural, void 0); const fromCase = _fromCase.call(Text, text, currentCase); _classPrivateFieldSet(_inSentenceCase, this, fromCase.inSentenceCase); _classPrivateFieldSet(_single, this, fromCase.words); _classPrivateFieldSet(_plural, this, _assertClassBrand(_Text_brand, this, _getPlural).call(this)); } plural() { _classPrivateFieldSet(_plural, this, _assertClassBrand(_Text_brand, this, _getPlural).apply(this, arguments)); return this; } case(type = Case.Sentence) { const format = text => { switch (type) { case Case.Lower: return text.map(word => word.toLowerCase()).join(" "); case Case.Upper: return text.map(word => word.toUpperCase()).join(" "); case Case.Title: return text.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" "); case Case.Sentence: if (_classPrivateFieldGet(_inSentenceCase, this)) return text.join(" "); let punctuation = true; return text.map(word => { let rtn = punctuation ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word.toLowerCase(); punctuation = /[.!?]$/.test(word); return rtn; }).join(" "); case Case.Camel: return text.map((word, i) => i === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(""); case Case.Pascal: return text.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(""); case Case.Snake: return text.map(word => word.toLowerCase()).join("_"); case Case.Split: return text; default: throw new TypeError("Invalid case type, must be a Case value"); } }; const [single, plural] = [ format(_classPrivateFieldGet(_single, this)), format(_classPrivateFieldGet(_plural, this)) ]; return Object.freeze({ get(n = 1) { const text = Number.isNaN(Number(n)) || n === 1 || n === 1n || n === "1" ? single : plural; return text.replace(/(?<!\\)%n/g, n); } }); } get(n = 1) { return this.case().get(n); } } exports.Text = Text; _Text = Text; // convert from case to array of words function _fromCase(text, type) { const temp = (text => { switch (type) { case Case.Lower: case Case.Upper: case Case.Title: case Case.Sentence: return text.split(/\s+/); case Case.Camel: case Case.Pascal: return text.split(/(?=[A-Z])/); case Case.Snake: return text.split(/_/g); case Case.Split: throw new TypeError("Split case is only used for output, not input"); default: throw new TypeError("Invalid case type, must be a Case value"); } })(text.toString().trim()); if (type === Case.Sentence) return { inSentenceCase: true, words: temp.map(word => word.trim()).filter(word => word.length > 0) }; return { inSentenceCase: false, words: temp.map(word => word.trim().toLowerCase()).filter(word => word.length > 0) }; } function _getPlural(plural) { if (plural !== null && plural !== void 0 ? plural : true === true) { const temp = [ ..._classPrivateFieldGet(_single, this) ]; const end = temp.length - 1; temp[end] = (single => { let temp; // s, sh, ch, x, z, consonant + o -> -es temp = single.replace(/(?<=sh?|ch|x|z|[^aeiou]o)$/i, "es"); if (temp !== single) return temp; // consonant + y -> -ies temp = single.replace(/(?<=[^aeiou])y$/i, "ies"); if (temp !== single) return temp; // f, fe -> -ves temp = single.replace(/fe?$/i, "ves"); if (temp !== single) return temp; return `${single}s`; })(_classPrivateFieldGet(_single, this)[end]); return temp; } else if (plural === false) return [ ..._classPrivateFieldGet(_single, this) ]; else if (plural instanceof _Text) return plural.case(Case.Split).get(); else throw new TypeError("Invalid plural argument, must be boolean or Text instance"); } _defineProperty(Text, "Case", Case); }, /***/ 8878(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MediaWikiAPI = void 0; var _scriptEsm = __webpack_require__(1289); var _scriptEsm2 = __webpack_require__(4551); var _scriptEsm3 = __webpack_require__(2852); var _scriptEsm4 = __webpack_require__(6873); var _ores = __webpack_require__(505); var _servers = __webpack_require__(8582); function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } const Logger = console; const __tags__ = new Set(_servers.__servers__.filter(s => s.tag).map(s => s.host)); const __pendingChanges__ = new Set(_servers.__servers__.filter(s => s.pending_changes).map(s => s.host)); class MediaWikiAPI { static get pendingChangesServers() { return Array.from(__pendingChanges__); } static hasPendingChanges(server) { return __pendingChanges__.has(server); } static chunk(array, size = 50) { const chunks = []; const len = array.length; for (let i = 0; i < len; i += size) chunks.push(array.slice(i, i + size)); return chunks; } static paramify(param) { if (!Array.isArray(param)) param = [ param ]; return [ ...new Set(param) ]; } static join(param) { return param.join("|").replace(/\|\|+/g, "|"); } static getUsername(oauth, server) { return oauth.fetch(`https://${server}/w/api.php`, { action: "query", meta: "userinfo", uiprop: "name", format: "json", formatversion: 2 }, undefined, "POST", true).then(data => { var _data$query; return (data === null || data === void 0 || (_data$query = data.query) === null || _data$query === void 0 || (_data$query = _data$query.userinfo) === null || _data$query === void 0 ? void 0 : _data$query.name) || null; }); } constructor(glob, oauth, server, username) { var _MediaWikiAPI$cache, _MediaWikiAPI$cache$s; this.glob = glob; this.oauth = oauth; this.server = server; this.username = username; this.tokens = {}; (_MediaWikiAPI$cache$s = (_MediaWikiAPI$cache = MediaWikiAPI.cache)[server]) !== null && _MediaWikiAPI$cache$s !== void 0 ? _MediaWikiAPI$cache$s : _MediaWikiAPI$cache[server] = { parse: new _scriptEsm4.Trie({ size: 1e3 }), pending: new _scriptEsm3.Memory({ size: 2500, timeout: 60 * 60 * 1e3 }), abuse: new _scriptEsm3.Memory({ size: 2500, timeout: 15 * 60 * 1e3 }), ores: new _scriptEsm3.Memory({ size: 1e4, timeout: 15 * 60 * 1e3 }), diff: new _scriptEsm3.Memory({ size: 500, timeout: 5 * 60 * 1e3 }) }; } close() { this.stream.disconnect(); } get cache() { return MediaWikiAPI.cache[this.server]; } build(opts = {}, serverOverride = null) { return { tags: __tags__.has(serverOverride !== null && serverOverride !== void 0 ? serverOverride : this.server) ? "WikiShield script" : "", assertuser: this.username, discussiontoolsautosubscribe: "no", ...opts }; } user(username) { return `[[Special:Contribs/${username}|${username}]] ([[User talk:${username}|talk]])`; } revision(revid) { return `[[Special:Diff/${revid}|${revid}]]`; } centralAuthUser(username) { return `[[Special:CentralAuth/${username}|${username}]]`; } summary(base, custom) { const watermark = " ([[:en:WP:WikiShield|WS]])"; // tehehe const message = `${base}${custom ? `: ${custom}` : ""}`; return `${(0, _scriptEsm2.truncate)(message, 500 - watermark.length)}${watermark}`; } async post(params, bypass = false, serverOverride = null) { try { const data = await this.oauth.fetch(`https://${serverOverride || this.server}/w/api.php`, this.build({ ...params, format: "json", formatversion: 2 }, serverOverride), undefined, "POST", bypass, serverOverride); if (data.error) { if (data.error.code === "alreadyrolled" || data.error.code === "editconflict") return "editconflict"; else if (data.error.code === "missingcontent" && params.action === "compare") // uh oh, it got revdel'd or oversighted return { compare: { body: "" } }; else throw new Error(`API Error: ${data.error.code} - ${data.error.info}`); } return data; } catch (err) { Logger.error("Error in API POST request:", err, JSON.stringify(params)); throw err; } } async continuous(params, cancel, bypass, serverOverride) { try { let cont = null; const responses = []; do { const data = await this.post({ ...params, ...cont || {} }, bypass, serverOverride); responses.push(data); cont = data.continue || null; if (typeof cancel === "function" && await cancel(data, responses) === true) cont = false; } while (cont); return { stopped: cont !== null, responses }; } catch (err) { Logger.error("Error in API continuous request:", err, JSON.stringify(params)); return { stopped: true, responses: [] }; } } async getToken(type = "csrf", bypass, serverOverride) { const id = `${serverOverride !== null && serverOverride !== void 0 ? serverOverride : this.server}:${type}`; if (this.tokens[id] === undefined) { try { return this.tokens[id] = this.post({ action: "query", meta: "tokens", type }, bypass, serverOverride).then(data => { var _data$query2; return (data === null || data === void 0 || (_data$query2 = data.query) === null || _data$query2 === void 0 || (_data$query2 = _data$query2.tokens) === null || _data$query2 === void 0 ? void 0 : _data$query2[`${type}token`]) || null; }); } catch (err) { Logger.error("Error fetching token:", err); throw err; } } else return this.tokens[id]; } async postWithToken(params, type = "csrf", bypass, serverOverride) { try { return await this.post({ ...params, token: await this.getToken(type, bypass, serverOverride) }, bypass, serverOverride); } catch (err) { Logger.error("Post with token error:", err); throw err; } } async account(bypass, serverOverride) { try { var _await$this$post; return ((_await$this$post = await this.post({ action: "query", meta: "userinfo", uiprop: "*" }, bypass, serverOverride)) === null || _await$this$post === void 0 || (_await$this$post = _await$this$post.query) === null || _await$this$post === void 0 ? void 0 : _await$this$post.userinfo) || {}; } catch (err) { var _Logger$error; return (_Logger$error = void Logger.error("Error fetching account info:", err)) !== null && _Logger$error !== void 0 ? _Logger$error : {}; } // removed by dead control flow } async getGlobalUserInfo(username, bypass, serverOverride) { try { var _response$query; const response = await this.post({ action: "query", meta: "globaluserinfo", guiuser: username, guiprop: "groups|rights" }, bypass, serverOverride); return ((_response$query = response.query) === null || _response$query === void 0 ? void 0 : _response$query.globaluserinfo) || {}; } catch (err) { var _Logger$error2; return (_Logger$error2 = void Logger.error("Error fetching global user info:", err)) !== null && _Logger$error2 !== void 0 ? _Logger$error2 : {}; } } async markWatchlistSeen(page, id, bypass, serverOverride) { try { await this.postWithToken({ action: "setnotificationtimestamp", titles: page, newerthanrevid: id }, "csrf", bypass, serverOverride); } catch (err) { var _Logger$error3; return (_Logger$error3 = void Logger.error("Error marking watchlist item as seen:", err)) !== null && _Logger$error3 !== void 0 ? _Logger$error3 : { valid: false, reason: err.message }; } } async append(title, section, content, summary, check = null, bypass, serverOverride) { try { if (check !== null) { const text = (await this.getPagesContent([ title ], bypass, serverOverride))[title] || ""; return { needsCheck: true, text }; } const result = await this.postWithToken({ action: "edit", title, ...(section !== null && section !== void 0 ? section : null) === null ? {} : { section }, appendtext: `\n${content}`, summary }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error4; return (_Logger$error4 = void Logger.error("Error appending to section:", err)) !== null && _Logger$error4 !== void 0 ? _Logger$error4 : { valid: false, reason: err.message }; } } async editSection(title, index, section, content, summary, check = null, bypass, serverOverride) { try { if (check !== null) { const text = (await this.getPagesContent([ title ], bypass, serverOverride))[title] || ""; return { needsCheck: true, text }; } const result = await this.postWithToken({ action: "edit", title, section: index, sectiontitle: section, text: content, summary }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error5; return (_Logger$error5 = void Logger.error("Error editing section:", err)) !== null && _Logger$error5 !== void 0 ? _Logger$error5 : { valid: false, reason: err.message }; } } async acceptPendingEdit(id, summary, bypass, serverOverride) { try { await this.postWithToken({ action: "review", revid: id, comment: summary }, "csrf", bypass, serverOverride); return { valid: true }; } catch (err) { return { valid: false, reason: "Edit could not be accepted." }; } } async rejectPendingEdit(id, prior, title, summary, bypass, serverOverride) { try { const stable = (await this.getRevisionsContent([ prior ], bypass, serverOverride))[prior] || ""; const result = await this.postWithToken({ action: "edit", title, text: stable, summary, baserevid: id }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { return { valid: false, reason: "Edit could not be rejected." }; } } async rollbackEdit(title, user, summary, bypass, serverOverride) { try { var _result$rollback; const result = await this.postWithToken({ action: "rollback", title, user, summary }, "rollback", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; else if (result === "onlyauthor") return { valid: false, reason: "Cannot rollback edits as the no other user has edited the page." }; else if (!((_result$rollback = result.rollback) !== null && _result$rollback !== void 0 && _result$rollback.revid)) return { valid: false, reason: "Edit conflict." }; const data = await this.getRevision(title, result.rollback.revid, bypass, serverOverride); if (data.user !== this.username) return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error6; return (_Logger$error6 = void Logger.error("Error rolling back edit:", err)) !== null && _Logger$error6 !== void 0 ? _Logger$error6 : { valid: false, reason: err.message }; } } async undoEdit(title, revid, summary, bypass, serverOverride) { try { var _result$edit; const result = await this.postWithToken({ action: "edit", title, undo: revid, summary }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; else if (!((_result$edit = result.edit) !== null && _result$edit !== void 0 && _result$edit.newrevid)) return { valid: false, reason: "Edit conflict." }; const data = await this.getRevision(title, result.edit.newrevid, bypass, serverOverride); if (data.user !== this.username) return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error7; return (_Logger$error7 = void Logger.error("Error undoing edit:", err)) !== null && _Logger$error7 !== void 0 ? _Logger$error7 : { valid: false, reason: err.message }; } } async restoreEdit(title, revid, summary, bypass, serverOverride) { try { var _result$edit2; const start = (0, _scriptEsm.convertToUTCString)(new Date); const content = (await this.getRevisionsContent([ revid ], bypass, serverOverride))[revid] || ""; const result = await this.postWithToken({ action: "edit", title, text: content, summary, starttimestamp: start }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; else if (!((_result$edit2 = result.edit) !== null && _result$edit2 !== void 0 && _result$edit2.newrevid)) return { valid: false, reason: "Edit conflict." }; const data = await this.getRevision(title, result.edit.newrevid, bypass, serverOverride); if (data.user !== this.username) return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error8; return (_Logger$error8 = void Logger.error("Error restoring edit:", err)) !== null && _Logger$error8 !== void 0 ? _Logger$error8 : { valid: false, reason: err.message }; } } async thankRevision(revid, bypass, serverOverride) { try { await this.postWithToken({ action: "thank", rev: revid }, "csrf", bypass, serverOverride); return { valid: true }; } catch (err) { var _Logger$error9; return (_Logger$error9 = void Logger.error("Error thanking revision:", err)) !== null && _Logger$error9 !== void 0 ? _Logger$error9 : { valid: false, reason: err.message }; } } async watchPage(title, expiry, bypass, serverOverride) { try { await this.postWithToken({ action: "watch", title, expiry }, "watch", bypass, serverOverride); return { valid: true }; } catch (err) { var _Logger$error0; return (_Logger$error0 = void Logger.error("Error watching page:", err)) !== null && _Logger$error0 !== void 0 ? _Logger$error0 : { valid: false, reason: err.message }; } } async unwatchPage(title, bypass, serverOverride) { try { await this.postWithToken({ action: "watch", title, unwatch: true }, "watch", bypass, serverOverride); return { valid: true }; } catch (err) { var _Logger$error1; return (_Logger$error1 = void Logger.error("Error unwatching page:", err)) !== null && _Logger$error1 !== void 0 ? _Logger$error1 : { valid: false, reason: err.message }; } } async parse(wt, title, preview = false, bypass, serverOverride) { title !== null && title !== void 0 ? title : title = undefined; const cacheKey = [ title, wt ].filter(item => item !== undefined); if (this.cache.parse.has(...cacheKey)) return this.cache.parse.get(...cacheKey); try { var _await$this$post2; const text = ((_await$this$post2 = await this.post({ action: "parse", prop: "text", preview, text: wt, title, contentmodel: "wikitext" }, bypass, serverOverride)) === null || _await$this$post2 === void 0 || (_await$this$post2 = _await$this$post2.parse) === null || _await$this$post2 === void 0 ? void 0 : _await$this$post2.text) || ""; this.cache.parse.set(...cacheKey, text); return text; } catch (err) { var _Logger$error10; return (_Logger$error10 = void Logger.error("Error parsing wikitext:", err)) !== null && _Logger$error10 !== void 0 ? _Logger$error10 : ""; } } async getTags(bypass, serverOverride) { try { return (await this.continuous({ action: "query", list: "tags", tglimit: "max" }, undefined, bypass, serverOverride)).responses.flatMap(r => { var _r$query; return ((_r$query = r.query) === null || _r$query === void 0 ? void 0 : _r$query.tags) || []; }); } catch (err) { var _Logger$error11; return (_Logger$error11 = void Logger.error("Error fetching revisions between IDs:", err)) !== null && _Logger$error11 !== void 0 ? _Logger$error11 : []; } } async getPagesContent(titles, bypass, serverOverride) { titles = MediaWikiAPI.paramify(titles); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(titles, 50).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "content", rvslots: "*", titles: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const pages = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query = promise.value.query) === null || _promise$value$query === void 0 ? void 0 : _promise$value$query.pages) || []) { var _promise$value$query, _page$revisions; pages[page.title] = ((_page$revisions = page.revisions) === null || _page$revisions === void 0 || (_page$revisions = _page$revisions[0]) === null || _page$revisions === void 0 || (_page$revisions = _page$revisions.slots) === null || _page$revisions === void 0 || (_page$revisions = _page$revisions.main) === null || _page$revisions === void 0 ? void 0 : _page$revisions.content) || ""; } } return pages; } catch (err) { var _Logger$error12; return (_Logger$error12 = void Logger.error("Error fetching pages content:", err)) !== null && _Logger$error12 !== void 0 ? _Logger$error12 : {}; } } async getRevisionsContent(revids, bypass, serverOverride) { revids = MediaWikiAPI.paramify(revids); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(revids, 500).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "ids|content", rvslots: "*", revids: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const revisions = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query2 = promise.value.query) === null || _promise$value$query2 === void 0 ? void 0 : _promise$value$query2.pages) || []) { var _promise$value$query2; for (const rev of page.revisions || []) { var _rev$slots; revisions[rev.revid] = ((_rev$slots = rev.slots) === null || _rev$slots === void 0 || (_rev$slots = _rev$slots.main) === null || _rev$slots === void 0 ? void 0 : _rev$slots.content) || ""; } } } return revisions; } catch (err) { var _Logger$error13; return (_Logger$error13 = void Logger.error("Error fetching revisions content:", err)) !== null && _Logger$error13 !== void 0 ? _Logger$error13 : {}; } } async getLatestIds(titles, bypass, serverOverride) { titles = MediaWikiAPI.paramify(titles); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(titles, 50).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "ids", titles: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const pages = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query3 = promise.value.query) === null || _promise$value$query3 === void 0 ? void 0 : _promise$value$query3.pages) || []) { var _promise$value$query3, _page$revisions2; pages[page.title] = ((_page$revisions2 = page.revisions) === null || _page$revisions2 === void 0 || (_page$revisions2 = _page$revisions2[0]) === null || _page$revisions2 === void 0 ? void 0 : _page$revisions2.revid) || null; } } return pages; } catch (err) { var _Logger$error14; return (_Logger$error14 = void Logger.error("Error fetching latest IDs:", err)) !== null && _Logger$error14 !== void 0 ? _Logger$error14 : {}; } } async getRevisionsBetween(title, from, to, bypass, serverOverride) { try { return (await this.continuous({ action: "query", prop: "revisions", titles: title, rvstartid: to, rvendid: from, rvprop: "title|ids|flags|user|timestamp|comment|parsedcomment|size|tags", rvlimit: "max" }, undefined, bypass, serverOverride)).responses.flatMap(r => { var _r$query2; return ((_r$query2 = r.query) === null || _r$query2 === void 0 || (_r$query2 = _r$query2.pages) === null || _r$query2 === void 0 || (_r$query2 = _r$query2[0]) === null || _r$query2 === void 0 ? void 0 : _r$query2.revisions) || []; }); } catch (err) { var _Logger$error15; return (_Logger$error15 = void Logger.error("Error fetching revisions between IDs:", err)) !== null && _Logger$error15 !== void 0 ? _Logger$error15 : []; } } async getEditCounts(usernames, bypass, serverOverride) { usernames = MediaWikiAPI.paramify(usernames); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(usernames, 500).map(async chunk => await this.post({ action: "query", list: "users", usprop: "editcount", ususers: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const users = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const user of ((_promise$value$query4 = promise.value.query) === null || _promise$value$query4 === void 0 ? void 0 : _promise$value$query4.users) || []) { var _promise$value$query4; users[user.name] = user.editcount; } } return users; } catch (err) { var _Logger$error16; return (_Logger$error16 = void Logger.error("Error fetching edit counts:", err)) !== null && _Logger$error16 !== void 0 ? _Logger$error16 : {}; } } async areUsersBlocked(usernames, bypass, serverOverride) { usernames = MediaWikiAPI.paramify(usernames); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(usernames, 500).map(async chunk => await this.post({ action: "query", list: "blocks", bkusers: MediaWikiAPI.join(chunk), bkprop: "id|user|by|reason|expiry|flags" }, bypass, serverOverride))); const users = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const block of ((_promise$value$query5 = promise.value.query) === null || _promise$value$query5 === void 0 ? void 0 : _promise$value$query5.blocks) || []) { var _promise$value$query5; users[block.user] = block; } } return users; } catch (err) { var _Logger$error17; return (_Logger$error17 = void Logger.error("Error fetching blocked users:", err)) !== null && _Logger$error17 !== void 0 ? _Logger$error17 : {}; } } async isUserGloballyLocked(username, bypass, serverOverride) { try { var _response$query2; const response = await this.post({ action: "query", meta: "globaluserinfo", guiuser: username }, bypass, serverOverride); return ((_response$query2 = response.query) === null || _response$query2 === void 0 || (_response$query2 = _response$query2.globaluserinfo) === null || _response$query2 === void 0 ? void 0 : _response$query2.locked) === true; } catch (err) { var _Logger$error18; return (_Logger$error18 = void Logger.error("Error checking if user is globally locked:", err)) !== null && _Logger$error18 !== void 0 ? _Logger$error18 : false; } } async getContributions(username, limit = 10, bypass, serverOverride) { try { var _await$this$post$quer; return ((_await$this$post$quer = (await this.post({ action: "query", list: "usercontribs", ucuser: username, uclimit: limit, ucprop: "ids|title|timestamp|comment|parsedcomment|flags|tags|sizediff|flags" }, bypass, serverOverride)).query) === null || _await$this$post$quer === void 0 ? void 0 : _await$this$post$quer.usercontribs) || []; } catch (err) { var _Logger$error19; return (_Logger$error19 = void Logger.error("Error fetching contributions:", err)) !== null && _Logger$error19 !== void 0 ? _Logger$error19 : []; } } async getBlocks(username, bypass, serverOverride) { try { return (await this.continuous({ action: "query", list: "logevents", letype: "block", letitle: `User:${username}`, leaction: "block/block", lelimit: "max", leprop: "id|timestamp|details|user|comment|parsedcomment" }, undefined, bypass, serverOverride)).responses.flatMap(r => { var _r$query3; return ((_r$query3 = r.query) === null || _r$query3 === void 0 ? void 0 : _r$query3.logevents) || []; }); } catch (err) { var _Logger$error20; return (_Logger$error20 = void Logger.error("Error fetching blocks:", err)) !== null && _Logger$error20 !== void 0 ? _Logger$error20 : []; } } async pagesExist(titles, bypass, serverOverride) { titles = MediaWikiAPI.paramify(titles); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(titles, 50).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "content", rvslots: "*", titles: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const pages = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query6 = promise.value.query) === null || _promise$value$query6 === void 0 ? void 0 : _promise$value$query6.pages) || []) { var _promise$value$query6, _page$revisions3; pages[page.title] = page.missing ? undefined : (_page$revisions3 = page.revisions) === null || _page$revisions3 === void 0 || (_page$revisions3 = _page$revisions3[0].slots) === null || _page$revisions3 === void 0 || (_page$revisions3 = _page$revisions3.main) === null || _page$revisions3 === void 0 ? void 0 : _page$revisions3.content; } } return pages; } catch (err) { var _Logger$error21; return (_Logger$error21 = void Logger.error("Error checking page existence:", err)) !== null && _Logger$error21 !== void 0 ? _Logger$error21 : []; } } async getPagesDetails(titles, bypass, serverOverride) { titles = MediaWikiAPI.paramify(titles); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(titles, 50).map(async chunk => await this.continuous({ action: "query", prop: "info|categories|templates", titles: MediaWikiAPI.join(chunk), inprop: "protection|watched", cllimit: "max", tllimit: "max", tlnamespace: "10" }, undefined, bypass, serverOverride))); const pages = {}; for (const result of promises) { if (result.status !== "fulfilled") continue; for (const page of result.value.responses.flatMap(response => { var _response$query3; return ((_response$query3 = response.query) === null || _response$query3 === void 0 ? void 0 : _response$query3.pages) || []; })) { var _page$title, _pages$_page$title, _pages$page$title, _page$categories; (_pages$_page$title = pages[_page$title = page.title]) !== null && _pages$_page$title !== void 0 ? _pages$_page$title : pages[_page$title] = { protection: null, watched: false, categories: [], metadata: [] }; let highest = ((_pages$page$title = pages[page.title]) === null || _pages$page$title === void 0 || (_pages$page$title = _pages$page$title.protection) === null || _pages$page$title === void 0 ? void 0 : _pages$page$title.level) || null; for (const prot of page.protection || []) { if (prot.type !== "edit") continue; if (prot.level === "sysop" || highest === "sysop") highest = "sysop"; else if (prot.level === "autoconfirmed" || highest === "autoconfirmed") highest = "autoconfirmed"; else if (prot.level === "extendedconfirmed" || highest === "extendedconfirmed") highest = "extendedconfirmed"; } const metadata = []; for (const template of page.templates || []) { const title = template.title.replace(/^Template:/i, ""); if (title.match(/^use\s/i)) metadata.push(title); } pages[page.title] = { protection: highest === null ? { protected: false } : { protected: true, level: highest }, watched: page.watched === true || pages[page.title].watched, categories: pages[page.title].categories.concat(((_page$categories = page.categories) === null || _page$categories === void 0 ? void 0 : _page$categories.map(cat => cat.title)) || []), metadata: pages[page.title].metadata.concat(metadata) }; } } return pages; } catch (err) { var _Logger$error22; return (_Logger$error22 = void Logger.error("Error fetching page details:", err)) !== null && _Logger$error22 !== void 0 ? _Logger$error22 : {}; } } async getHistory(title, limit = 10, bypass, serverOverride) { try { var _await$this$post$quer2; const page = (_await$this$post$quer2 = (await this.post({ action: "query", prop: "revisions", titles: title, rvlimit: limit + 1, // +1 bc we need sizediff rvprop: "ids|user|timestamp|comment|parsedcomment|flags|tags|size|flags" }, bypass, serverOverride)).query) === null || _await$this$post$quer2 === void 0 || (_await$this$post$quer2 = _await$this$post$quer2.pages) === null || _await$this$post$quer2 === void 0 ? void 0 : _await$this$post$quer2[0]; if (!(page !== null && page !== void 0 && page.revisions)) return []; const len = page.revisions.length; const count = Math.min(limit, len || 0); for (let i = 0; i < count; i++) { const rev = page.revisions[i]; rev.ns = page.ns; rev.pageid = page.pageid; rev.title = page.title; if (i + 1 < len) rev.sizediff = rev.size - page.revisions[i + 1].size; else rev.sizediff = rev.size; } return page.revisions.slice(0, count); } catch (err) { var _Logger$error23; return (_Logger$error23 = void Logger.error("Error fetching page history:", err)) !== null && _Logger$error23 !== void 0 ? _Logger$error23 : []; } } async countPageReverts(title, username, bypass, serverOverride) { const check = tag => tag === "mw-undo" || tag === "mw-rollback" || tag === "mw-manual-revert"; try { const data = await this.continuous({ action: "query", prop: "revisions", titles: title, rvdir: "newer", rvstart: (0, _scriptEsm.convertToUTCString)(new Date(Date.now() - 864e5)), // 1 day rvprop: "tags", rvuser: username, rvlimit: "max" }, undefined, bypass, serverOverride); let count = 0; for (const response of data.responses) { var _response$query4; count += ((_response$query4 = response.query) === null || _response$query4 === void 0 || (_response$query4 = _response$query4.pages) === null || _response$query4 === void 0 || (_response$query4 = _response$query4[0]) === null || _response$query4 === void 0 || (_response$query4 = _response$query4.revisions) === null || _response$query4 === void 0 ? void 0 : _response$query4.filter(rev => rev.tags.some(check)).length) || 0; } return count; } catch (err) { var _Logger$error24; return (_Logger$error24 = void Logger.error("Error counting page reverts:", err)) !== null && _Logger$error24 !== void 0 ? _Logger$error24 : 0; } } async getORES(revids, bias, bypass, serverOverride) { revids = MediaWikiAPI.paramify(revids); try { const ores = {}; revids = revids.filter(id => { var _ores$id; const cached = this.cache.ores.get(id); if (cached) return (_ores$id = void (ores[id] = cached)) !== null && _ores$id !== void 0 ? _ores$id : false; return true; }); const chunks = MediaWikiAPI.chunk(revids, 50); const promises = await Promise.allSettled(chunks.map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "ids|oresscores", rvslots: "*", revids: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query7 = promise.value.query) === null || _promise$value$query7 === void 0 ? void 0 : _promise$value$query7.pages) || []) { var _promise$value$query7; for (const rev of page.revisions || []) ores[rev.revid] = rev.oresscores || {}; } } return _ores.ORES.extract(ores, bias); } catch (err) { var _Logger$error25; return (_Logger$error25 = void Logger.error("Error fetching ORES scores:", err)) !== null && _Logger$error25 !== void 0 ? _Logger$error25 : {}; } } async extractORES(ores, bias = .5) { return _ores.ORES.extract(ores, bias); } async getDiff(from, to, format = "table", bypass, serverOverride) { from !== null && from !== void 0 ? from : from = false; const cacheKey = `${format}@${from}-${to}`; if (this.cache.diff.has(cacheKey)) return this.cache.diff.get(cacheKey); try { var _await$this$post$comp; const params = { action: "compare", prop: "diff", difftype: format, torev: to }; if (from == false) { params.fromslots = "main"; params["fromtext-main"] = ""; } else params.fromrev = from; const diff = ((_await$this$post$comp = (await this.post(params, bypass, serverOverride)).compare) === null || _await$this$post$comp === void 0 ? void 0 : _await$this$post$comp.body) || ""; this.cache.diff.set(cacheKey, diff); return diff; } catch (err) { var _Logger$error26; return (_Logger$error26 = void Logger.error("Error fetching diff:", err)) !== null && _Logger$error26 !== void 0 ? _Logger$error26 : ""; } } async getWikitextDiff(from, to, format = "table", bypass, serverOverride) { from !== null && from !== void 0 ? from : from = false; try { var _await$this$post$comp2; return ((_await$this$post$comp2 = (await this.post({ action: "compare", prop: "diff", difftype: format, fromslots: "main", "fromtext-main": from === false ? "" : from, toslots: "main", "totext-main": to }, bypass, serverOverride)).compare) === null || _await$this$post$comp2 === void 0 ? void 0 : _await$this$post$comp2.body) || ""; } catch (err) { var _Logger$error27; return (_Logger$error27 = void Logger.error("Error fetching wikitext diff:", err)) !== null && _Logger$error27 !== void 0 ? _Logger$error27 : ""; } } async getSizeDiff(from, to, bypass, serverOverride) { try { var _this$post$query; const revisions = await ((_this$post$query = this.post({ action: "query", prop: "revisions", rvprop: "size", revids: `${from}|${to}` }, bypass, serverOverride).query) === null || _this$post$query === void 0 || (_this$post$query = _this$post$query.pages) === null || _this$post$query === void 0 || (_this$post$query = _this$post$query[0]) === null || _this$post$query === void 0 ? void 0 : _this$post$query.revisions) || []; if (revisions.length === 0) return 0; else if (revisions.length === 1) return revisions[0].size; return revisions[1].size - revisions[0].size; } catch (err) { var _Logger$error28; return (_Logger$error28 = void Logger.error("Error fetching size diff:", err)) !== null && _Logger$error28 !== void 0 ? _Logger$error28 : 0; } } async getRevision(title, revid, bypass, serverOverride) { try { var _await$this$post$quer3, _page$revisions4, _page$revisions$; const page = (_await$this$post$quer3 = (await this.post({ action: "query", prop: "revisions", titles: title, rvprop: "ids|user|comment|parsedcomment|timestamp|size|tags|flags", rvslots: "*", rvstartid: revid, rvlimit: 2 }, bypass, serverOverride)).query) === null || _await$this$post$quer3 === void 0 || (_await$this$post$quer3 = _await$this$post$quer3.pages) === null || _await$this$post$quer3 === void 0 ? void 0 : _await$this$post$quer3[0]; if (!(page !== null && page !== void 0 && (_page$revisions4 = page.revisions) !== null && _page$revisions4 !== void 0 && _page$revisions4.length)) return {}; const rev = page.revisions[0]; return { revid: rev.revid, parentid: rev.parentid, user: rev.user, parsedcomment: rev.parsedcomment, comment: rev.comment, timestamp: rev.timestamp, size: rev.size, oldlen: ((_page$revisions$ = page.revisions[1]) === null || _page$revisions$ === void 0 ? void 0 : _page$revisions$.size) || 0, minor: rev.minor || false, tags: rev.tags || [] }; } catch (err) { var _Logger$error29; return (_Logger$error29 = void Logger.error("Error fetching revision:", err)) !== null && _Logger$error29 !== void 0 ? _Logger$error29 : {}; } } async getRevisions(revids, bypass, serverOverride) { revids = MediaWikiAPI.paramify(revids); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(revids, 500).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "ids|user|comment|parsedcomment|timestamp|size|tags|flags|oresscores", rvslots: "*", revids: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const revisions = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query8 = promise.value.query) === null || _promise$value$query8 === void 0 ? void 0 : _promise$value$query8.pages) || []) { var _promise$value$query8; for (const rev of page.revisions || []) revisions[rev.revid] = rev; } } return revisions; } catch (err) { var _Logger$error30; return (_Logger$error30 = void Logger.error("Error fetching revisions:", err)) !== null && _Logger$error30 !== void 0 ? _Logger$error30 : {}; } } async getConsecutiveEdits(page, revid, username, bypass, serverOverride) { try { var _last, _prior; const data = await this.continuous({ action: "query", prop: "revisions", titles: page, rvprop: "ids|timestamp|user|size|parsedcomment", rvlimit: "max", rvstartid: revid }, data => { var _data$query3; return (_data$query3 = data.query) === null || _data$query3 === void 0 || (_data$query3 = _data$query3.pages) === null || _data$query3 === void 0 || (_data$query3 = _data$query3[0]) === null || _data$query3 === void 0 ? void 0 : _data$query3.revisions.some(rev => rev.user !== username); }, bypass, serverOverride); const revisions = data.responses.flatMap(response => { var _response$query5; return ((_response$query5 = response.query) === null || _response$query5 === void 0 || (_response$query5 = _response$query5.pages) === null || _response$query5 === void 0 || (_response$query5 = _response$query5[0]) === null || _response$query5 === void 0 ? void 0 : _response$query5.revisions) || []; }); let last, prior; const first = revisions[0]; if ((first === null || first === void 0 ? void 0 : first.user) !== username) return { count: 0, sizediff: 0, timestamp: { new: null, old: null }, diff: null, edits: [] }; const result = { count: 0, sizediff: 0, timestamp: { new: null, old: null }, diff: null, edits: [] }; const len = revisions.length; for (let i = 0; i < len; i++) { const rev = revisions[i]; prior = rev; if (rev.user !== username) break; result.edits.push(rev); last = rev; result.count++; if (i + 1 < len) result.sizediff += rev.size - revisions[i + 1].size || 0; else result.sizediff += rev.size || 0; } result.timestamp.new = (first === null || first === void 0 ? void 0 : first.timestamp) || null; result.timestamp.old = ((_last = last) === null || _last === void 0 ? void 0 : _last.timestamp) || null; if (data.stopped) result.diff = await this.getDiff(((_prior = prior) === null || _prior === void 0 ? void 0 : _prior.revid) || null, first.revid, "table", bypass, serverOverride); else result.diff = await this.getDiff(null, first.revid, "table", bypass, serverOverride); return result; } catch (err) { Logger.error("Get consecutive edits error:", err); return { count: 0, sizediff: 0, timestamp: { new: null, old: null }, diff: null }; } } async parseUsers(usernames, simple, bypass, serverOverride) { usernames = MediaWikiAPI.paramify(usernames); const result = Array.from({ length: usernames.length }, () => ({ user: {} })); try { const promises = []; promises.push(this.getEditCounts(usernames, bypass, serverOverride).then(data => { usernames.forEach((name, i) => result[i].user.edits = data[name] || 0); }), this.areUsersBlocked(usernames, bypass, serverOverride).then(data => { usernames.forEach((name, i) => result[i].user.blocked = data[name] || null); }), this.pagesExist(usernames.map(name => `User talk:${name}`), bypass, serverOverride).then(data => { usernames.forEach((name, i) => result[i].user.talk = data[`User talk:${name}`]); })); if (!simple) promises.push((async () => { await Promise.all(usernames.map(async (name, i) => { [result[i].user.contributions, result[i].user.blocks] = await Promise.all([ this.getContributions(name, undefined, bypass, serverOverride), this.getBlocks(name, bypass, serverOverride) ]); })); })()); await Promise.all(promises); return result; } catch (err) { var _Logger$error31; return (_Logger$error31 = void Logger.error("Parse user error:", err)) !== null && _Logger$error31 !== void 0 ? _Logger$error31 : result; } } async parseEdits(items, simple, oresBias, bypass, serverOverride) { items = MediaWikiAPI.paramify(items); const users = MediaWikiAPI.paramify(items.map(item => item.item.user)); const revids = MediaWikiAPI.paramify(items.map(item => item.item.revid)); const titles = MediaWikiAPI.paramify(items.map(item => item.item.title)); const result = items.map(({item, prior}) => ({ item, prior, data: { user: {}, page: {}, edit: {} } })); try { const promises = []; promises.push(this.parseUsers(users, simple, bypass, serverOverride).then(data => { items.forEach((item, i) => { const userIndex = users.indexOf(item.item.user); result[i].data.user = data[userIndex].user; }); }), this.getPagesDetails(titles, bypass, serverOverride).then(data => { items.forEach((item, i) => { var _data$item$item$title, _data$item$item$title2, _data$item$item$title3, _data$item$item$title4; result[i].data.page.protection = ((_data$item$item$title = data[item.item.title]) === null || _data$item$item$title === void 0 ? void 0 : _data$item$item$title.protection) || { protected: false }; result[i].data.page.watched = ((_data$item$item$title2 = data[item.item.title]) === null || _data$item$item$title2 === void 0 ? void 0 : _data$item$item$title2.watched) || false; result[i].data.page.categories = ((_data$item$item$title3 = data[item.item.title]) === null || _data$item$item$title3 === void 0 ? void 0 : _data$item$item$title3.categories) || []; result[i].data.page.metadata = ((_data$item$item$title4 = data[item.item.title]) === null || _data$item$item$title4 === void 0 ? void 0 : _data$item$item$title4.metadata) || []; }); }), this.getORES(revids, oresBias, bypass, serverOverride).then(data => { items.forEach((item, i) => { result[i].data.edit.ores = data[item.item.revid] || 0; }); })); if (!simple) promises.push((async () => { await Promise.all(items.map(async (item, i) => { [result[i].data.page.consecutive, result[i].data.page.reverts, result[i].data.page.history, result[i].data.edit.diff] = await Promise.all([ this.getConsecutiveEdits(item.item.title, item.item.revid, item.item.user, bypass, serverOverride), this.countPageReverts(item.item.title, this.username, bypass, serverOverride), this.getHistory(item.item.title, undefined, bypass, serverOverride), this.getDiff(item.prior || null, item.item.revid, "table", bypass, serverOverride) ]); })); })()); await Promise.all(promises); return result; } catch (err) { var _Logger$error32; return (_Logger$error32 = void Logger.error("Parse edit error:", err)) !== null && _Logger$error32 !== void 0 ? _Logger$error32 : result; } } async parseAbuselogs(items, simple, bypass, serverOverride) { items = MediaWikiAPI.paramify(items); const users = MediaWikiAPI.paramify(items.map(item => item.user)); const titles = MediaWikiAPI.paramify(items.map(item => item.title)); const result = items.map(item => ({ item, data: { user: {}, page: {}, edit: {} } })); try { const promises = []; promises.push((async () => { await Promise.all(items.map(async (item, i) => { [result[i].data.parsedcomment] = await Promise.all([ this.parse(item.comment, undefined, false, bypass, serverOverride) ]); })); })(), this.parseUsers(users, simple, bypass, serverOverride).then(data => { items.forEach((item, i) => { const userIndex = users.indexOf(item.user); result[i].data.user = data[userIndex].user; }); }), this.getPagesDetails(titles, bypass, serverOverride).then(data => { items.forEach((item, i) => { var _data$item$title, _data$item$title2, _data$item$title3, _data$item$title4; result[i].data.page.protection = ((_data$item$title = data[item.title]) === null || _data$item$title === void 0 ? void 0 : _data$item$title.protection) || { protected: false }; result[i].data.page.watched = ((_data$item$title2 = data[item.title]) === null || _data$item$title2 === void 0 ? void 0 : _data$item$title2.watched) || false; result[i].data.page.categories = ((_data$item$title3 = data[item.title]) === null || _data$item$title3 === void 0 ? void 0 : _data$item$title3.categories) || []; result[i].data.page.metadata = ((_data$item$title4 = data[item.title]) === null || _data$item$title4 === void 0 ? void 0 : _data$item$title4.metadata) || []; }); })); if (!simple) promises.push((async () => { await Promise.all(items.map(async (item, i) => { [result[i].data.page.reverts, result[i].data.page.history, result[i].data.edit.diff] = await Promise.all([ this.countPageReverts(item.title, this.username, bypass, serverOverride), this.getHistory(item.title, undefined, bypass, serverOverride), !item.diff ? Promise.resolve(null) : this.getWikitextDiff(item.diff.old, item.diff.new, "table", bypass, serverOverride) ]); })); })()); await Promise.all(promises); return result; } catch (err) { var _Logger$error33; return (_Logger$error33 = void Logger.error("Parse abuselog error:", err)) !== null && _Logger$error33 !== void 0 ? _Logger$error33 : result; } } async getAbuseLogRevid(logid, bypass, serverOverride) { try { var _await$this$post$quer4, _data$find; const data = ((_await$this$post$quer4 = (await this.post({ action: "query", list: "abuselog", afllogids: logid, aflprop: "ids|revid" }, bypass, serverOverride)).query) === null || _await$this$post$quer4 === void 0 ? void 0 : _await$this$post$quer4.abuselog) || []; return ((_data$find = data.find(entry => entry.id === logid)) === null || _data$find === void 0 ? void 0 : _data$find.revid) || null; } catch (err) { var _Logger$error34; return (_Logger$error34 = void Logger.error("Error fetching abuse log revids:", err)) !== null && _Logger$error34 !== void 0 ? _Logger$error34 : {}; } } async feeds(recent = null, pending = null, users = null, watchlist = null, abuselog = null) { [recent, pending, users, watchlist, abuselog] = [ recent, pending, users, watchlist, abuselog ].map(feed => typeof feed === "object" ? feed : {}); try { const options = { action: "query", list: [] }; if (recent !== null) { options.list.push("recentchanges"); options.rctype = "edit"; options.rcprop = "title|ids|sizes|flags|user|timestamp|comment|parsedcomment|tags|oresscores"; options.rcshow = "!bot"; options.rcnamespace = recent.ns || "*"; if (recent.since) options.rcstart = recent.since; options.rcdir = recent.since ? "newer" : "older"; options.rclimit = "max"; } if (pending !== null && __pendingChanges__.has(this.server)) { options.list.push("oldreviewedpages"); options.ornamespace = pending.ns || "*"; options.orlimit = "max"; } if (users !== null) { options.list.push("logevents"); options.letype = "newusers"; options.wlprop = "ids|title|type|user|timestamp|comment|details|parsedcomment"; if (users.since) options.lestart = users.since; options.ledir = users.since ? "newer" : "older"; options.lelimit = "max"; } if (watchlist !== null) { options.list.push("watchlist"); options.wltype = "edit"; options.wlprop = "title|ids|sizes|flags|user|timestamp|comment|tags|oresscores|parsedcomment"; options.wlexcludeuser = this.username; options.wlnamespace = watchlist.ns || "*"; if (watchlist.since) options.wlstart = watchlist.since; options.wldir = watchlist.since ? "newer" : "older"; options.wllimit = "max"; } if (abuselog !== null) { options.list.push("abuselog"); options.aflnamespace = abuselog.ns || "*"; if (abuselog.since) options.aflstart = abuselog.since; options.afldir = abuselog.since ? "newer" : "older"; options.aflprop = "ids|user|title|action|result|timestamp|hidden|revid|filter|details"; options.afllimit = "max"; } options.list = MediaWikiAPI.join(options.list); const data = { recent: [], pending: [], users: [], watchlist: [], abuselog: [] }; (await this.continuous(options)).responses.forEach(response => { const query = response.query || {}; if (query.recentchanges) data.recent = data.recent.concat(query.recentchanges); if (query.oldreviewedpages) data.pending = data.pending.concat(query.oldreviewedpages).slice(0, 100); // pending changes feed can be very large, so we limit it to 100 entries if (query.logevents) data.users = data.users.concat(query.logevents.filter(entry => !entry.temp)); if (query.watchlist) data.watchlist = data.watchlist.concat(query.watchlist); if (query.abuselog) data.abuselog = data.abuselog.concat(query.abuselog); }); if (data.pending.length > 0) { const stability = new Map; const temp = {}; await Promise.allSettled(data.pending.map(async item => { var _await$stability$get, _rev$query, _page$revisions5; if (!this.cache.pending.has(item.revid)) this.cache.pending.set(item.revid, await this.post({ action: "query", prop: "revisions", titles: item.title, rvstartid: item.revid, rvlimit: 1, rvprop: "ids|flags|user|timestamp|comment|parsedcomment|size|tags" })); const rev = this.cache.pending.get(item.revid); if (!stability.has(item.title)) stability.set(item.title, this.post({ action: "query", list: "logevents", letype: "stable", leprop: "ids|title|type|user|timestamp|comment|details|parsedcomment", letitle: item.title, lelimit: 1 })); item.stability = ((_await$stability$get = await stability.get(item.title)) === null || _await$stability$get === void 0 || (_await$stability$get = _await$stability$get.query) === null || _await$stability$get === void 0 || (_await$stability$get = _await$stability$get.logevents) === null || _await$stability$get === void 0 ? void 0 : _await$stability$get[0]) || {}; const page = (_rev$query = rev.query) === null || _rev$query === void 0 || (_rev$query = _rev$query.pages) === null || _rev$query === void 0 ? void 0 : _rev$query[0]; temp[item.title] = { title: item.title, sizediff: item.diff_size, ...(_page$revisions5 = page.revisions) === null || _page$revisions5 === void 0 ? void 0 : _page$revisions5[0], pending: item }; })); data.pending = Object.values(temp); if (pending.full === true) { const full = {}; await Promise.allSettled(data.pending.map(async item => { const between = await this.getRevisionsBetween(item.title, item.pending.stable_revid, item.revid); if (between.length < 2) return; const stable = between.pop(); full[item.title] = { count: between.length, users: between.reduce((acc, rev) => { if (rev.user in acc) acc[rev.user]++; else acc[rev.user] = 1; return acc; }, {}), edits: between, revid: item.revid, prior: stable.revid, sizediff: item.size - stable.size, timestamp: { new: item.timestamp, old: between[between.length - 1].timestamp }, pending: item.pending }; })); data.pending = full; } } if (data.abuselog.length > 0) { const logsById = {}; data.abuselog.forEach(log => { if (log.action !== "edit") return; const id = `${log.user}|${log.title}|${log.timestamp}`; if (id in logsById) logsById[id].push(log); else logsById[id] = [ log ]; }); const temp = []; await Promise.allSettled(Object.entries(logsById).map(async ([, log]) => { var _revision$revid, _publicEntry$details$, _publicEntry$details, _publicEntry$details$2, _publicEntry$details2; const last = log[log.length - 1]; const result = new Set(log.flatMap(e => e.result.split(","))); const revision = log.find(e => e.revid !== "" && e.revid !== undefined); const publicEntry = log.find(e => Object.keys(e.details).length); temp.push({ id: last.id, revision: revision !== undefined, private: !publicEntry, result, action: last.action, revid: (_revision$revid = revision === null || revision === void 0 ? void 0 : revision.revid) !== null && _revision$revid !== void 0 ? _revision$revid : null, diff: publicEntry.details ? { new: publicEntry.details.new_wikitext, old: publicEntry.details.old_wikitext, size: publicEntry.details.edit_delta } : null, timestamp: last.timestamp, comment: (_publicEntry$details$ = publicEntry === null || publicEntry === void 0 || (_publicEntry$details = publicEntry.details) === null || _publicEntry$details === void 0 ? void 0 : _publicEntry$details.summary) !== null && _publicEntry$details$ !== void 0 ? _publicEntry$details$ : null, user: last.user, editcount: (_publicEntry$details$2 = publicEntry === null || publicEntry === void 0 || (_publicEntry$details2 = publicEntry.details) === null || _publicEntry$details2 === void 0 ? void 0 : _publicEntry$details2.user_editcount) !== null && _publicEntry$details$2 !== void 0 ? _publicEntry$details$2 : null, ns: last.ns, title: last.title, entries: log }); })); data.abuselog = temp; } return data; } catch (err) { Logger.error("Feeds error:", err); return { recent: [], pending: pending.full ? {} : [], users: [], watchlist: [], abuselog: [] }; } } } exports.MediaWikiAPI = MediaWikiAPI; _defineProperty(MediaWikiAPI, "cache", {}); /***/ }, /***/ 2486(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.build = build; var _index = _interopRequireDefault(__webpack_require__(5540)); var _style = _interopRequireDefault(__webpack_require__(4279)); var _style2 = _interopRequireDefault(__webpack_require__(2459)); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } async function build() { document.head.querySelectorAll("link[rel=stylesheet]").forEach(link => link.remove()); // Clear existing stylesheets const parser = new DOMParser; const doc = parser.parseFromString(_index.default, "text/html"); document.title = doc.title; doc.head.querySelectorAll("link[rel=stylesheet]").forEach(link => { document.head.appendChild(Object.assign(document.createElement("link"), { rel: "stylesheet", href: link.href })); }); const styles = [ _style.default, _style2.default ].filter(Boolean).forEach(css => { const $style = document.createElement("style"); $style.textContent = css; document.head.appendChild($style); }); document.body.innerHTML = doc.body.innerHTML; // load body after CSS so everything is styled on load await new Promise(requestAnimationFrame); // wait for next frame to ensure everything is rendered } /***/ }, /***/ 4112(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MediaWikiOAuth2 = void 0; function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _start = new WeakMap; var _count = new WeakMap; class Throttle { constructor(delay) { _classPrivateFieldInitSpec(this, _start, void 0); _classPrivateFieldInitSpec(this, _count, 0); _classPrivateFieldSet(_start, this, Date.now()); this.delay = delay; this.last = 0; } get count() { return _classPrivateFieldGet(_count, this); } per(divisor = 1) { return Math.floor(_classPrivateFieldGet(_count, this) / ((Date.now() - _classPrivateFieldGet(_start, this)) / divisor)) || 0; } call(fn, bypass = false) { var _this$count, _this$count2; _classPrivateFieldSet(_count, this, (_this$count = _classPrivateFieldGet(_count, this), _this$count2 = _this$count++, _this$count)), _this$count2; const now = Date.now(); const wait = Math.max(0, this.last + this.delay - now); this.last = now + wait; if (bypass || wait === 0) return fn(); else return new Promise(resolve => setTimeout(async () => resolve(await fn()), wait)); } } class MediaWikiOAuth2 { constructor(userAgent) { this.userAgent = userAgent; this.throttle = new Throttle(0); this.api = new mw.Api; } getOrigin(url) { const origin = `${location.protocol}//${location.host}`; try { const apiUrl = new URL(url); const apiOrigin = `${apiUrl.protocol}//${apiUrl.host}`; if (apiOrigin === origin) return undefined; } catch (_unused) {} return origin; } async fetch(url, params = {}, signal = null, method = "POST", bypass) { return await this.throttle.call(async () => { const origin = this.getOrigin(url); if (origin) url += (url.includes("?") ? "&" : "?") + `origin=${encodeURIComponent(origin)}`; return await this.api.ajax({ ...params, origin }, { url, method, ...origin ? { xhrFields: { withCredentials: true } } : {} }).catch(error => { console.error(`[WikiSHield] Failed to parse OAuth2 response (rpm: ${this.throttle.per(6e4)}):`, error); throw error; }); }, bypass); } } exports.MediaWikiOAuth2 = MediaWikiOAuth2; /***/ }, /***/ 505(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ORES = void 0; class ORES { static extract(data, bias = .5) { const models = [ { key: "goodfaith", field: "false", bias }, { key: "damaging", field: "true", bias: 1 - bias } ]; const result = {}; for (const [revid, scores] of Object.entries(data)) { const values = []; for (const model of models) { var _score$probability$mo, _score$probability; const score = scores[model.key]; if (!score) continue; let value = (_score$probability$mo = (_score$probability = score.probability) === null || _score$probability === void 0 ? void 0 : _score$probability[model.field]) !== null && _score$probability$mo !== void 0 ? _score$probability$mo : score[model.field]; if (value === undefined && score.prediction !== undefined) value = +score.prediction; if (value !== undefined && !isNaN(value)) values.push(value * (model.bias || 0)); } result[revid] = values.length === 0 ? NaN : values.reduce((a, b) => a + b, 0) / values.length; } return result; } } exports.ORES = ORES; /***/ }, /***/ 8582(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.__servers__ = void 0; const __servers__ = exports.__servers__ = [ { name: "English", host: "en.wikipedia.org", language_code: "en", tag: true, pending_changes: true }, { name: "seperator" }, { name: "Test", host: "test2.wikipedia.org", language_code: "en", tag: false, pending_changes: true } ]; /***/ }, /***/ 2535(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.API = void 0; var _scriptEsm = __webpack_require__(4551); var _api = __webpack_require__(8878); var _oauth = __webpack_require__(4112); function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } const serversWithPendingChanges = new Set([]); let API = exports.API = void 0; if (window.isElectron) { var _ws, _server, _account; exports.API = API = (_ws = new WeakMap, _server = new WeakMap, _account = new WeakMap, class API { static chunk(array, size = 50) { const chunks = []; const len = array.length; for (let i = 0; i < len; i += size) chunks.push(array.slice(i, i + size)); return chunks; } static paramify(param) { if (!Array.isArray(param)) param = [ param ]; return [ ...new Set(param) ].filter(p => typeof p === "string" && p.trim()); } get username() { return _classPrivateFieldGet(_account, this); } get hasPendingChanges() { return serversWithPendingChanges.has(_classPrivateFieldGet(_server, this)); } constructor(ws, server, username, pendingChangesServers) { _classPrivateFieldInitSpec(this, _ws, null); _classPrivateFieldInitSpec(this, _server, null); _classPrivateFieldInitSpec(this, _account, null); _classPrivateFieldSet(_ws, this, ws); _classPrivateFieldSet(_server, this, server); _classPrivateFieldSet(_account, this, username); for (const pcServer of pendingChangesServers) serversWithPendingChanges.add(pcServer); } build(opts = {}) { return { assertuser: _classPrivateFieldGet(_account, this), discussiontoolsautosubscribe: "no", ...opts }; } summary(base, custom) { const watermark = " ([[:en:WP:WikiShield|WS]])"; const message = `${base}${custom ? `: ${custom}` : ""}`; return `${(0, _scriptEsm.truncate)(message, 500 - watermark.length)}${watermark}`; } user(username) { return `[[Special:Contribs/${username}|${username}]] ([[User talk:${username}|talk]])`; } revision(revid) { return `[[Special:Diff/${revid}|${revid}]]`; } centralAuthUser(username) { return `[[Special:CentralAuth/${username}|${username}]]`; } async post(params, bypass, serverOverride) { try { return await electron.mwapi("post", params, bypass, serverOverride); } catch (error) { var _error$message; if (error === "assertnameduserfailed" || (_error$message = error.message) !== null && _error$message !== void 0 && _error$message.includes("assertnameduserfailed")) return _classPrivateFieldGet(_ws, this).disable("Invalid account", "Your account was logged out or changed."); throw error; } } async continuous(params, cancel, bypass, serverOverride) { try { let continueObject = null; const responses = []; do { const data = await this.post({ ...params, ...continueObject || {} }, bypass, serverOverride); responses.push(data); continueObject = data.continue || null; if (typeof cancel === "function") if (await cancel(data, responses) === true) { continueObject = true; break; } } while (continueObject); return { stopped: continueObject !== null, responses }; } catch (error) { console.error("Continuous error:", error); return { stopped: true, responses: [] }; } } async getToken(type = "csrf", bypass, serverOverride) { return await electron.mwapi("getToken", type, bypass, serverOverride); } async postWithToken(params, type = "csrf", bypass, serverOverride) { return await electron.mwapi("postWithToken", params, type, bypass, serverOverride); } async account(bypass, serverOverride) { return await electron.mwapi("account", bypass, serverOverride); } async getGlobalUserInfo(username, bypass, serverOverride) { return await electron.mwapi("getGlobalUserInfo", username, bypass, serverOverride); } async markWatchlistSeen(page, id, bypass, serverOverride) { return await electron.mwapi("markWatchlistSeen", page, id, bypass, serverOverride); } async append(title, section, content, summary, check, bypass, serverOverride) { if (typeof check === "function") { const result = await electron.mwapi("append", title, section, content, summary, true, bypass, serverOverride); if (result.needsCheck) { const validity = await check(result.text); if (!validity.valid) return { valid: false, reason: validity.reason || "Append check failed." }; return await electron.mwapi("append", title, section, content, summary, undefined, bypass, serverOverride); } return result; } return await electron.mwapi("append", title, section, content, summary, undefined, bypass, serverOverride); } async editSection(title, index, section, content, summary, check, bypass, serverOverride) { if (typeof check === "function") { const result = await electron.mwapi("editSection", title, index, section, content, summary, true, bypass, serverOverride); if (result.needsCheck) { const validity = await check(result.text); if (!validity.valid) return { valid: false, reason: validity.reason || "Edit section check failed." }; return await electron.mwapi("editSection", title, index, section, content, summary, undefined, bypass, serverOverride); } return result; } return await electron.mwapi("editSection", title, index, section, content, summary, undefined, bypass, serverOverride); } async acceptPendingEdit(id, summary, bypass, serverOverride) { return await electron.mwapi("acceptPendingEdit", id, summary, bypass, serverOverride); } async rejectPendingEdit(id, prior, title, summary, bypass, serverOverride) { return await electron.mwapi("rejectPendingEdit", id, prior, title, summary, bypass, serverOverride); } async rollbackEdit(title, user, summary, bypass, serverOverride) { return await electron.mwapi("rollbackEdit", title, user, summary, bypass, serverOverride); } async undoEdit(title, revid, summary, bypass, serverOverride) { return await electron.mwapi("undoEdit", title, revid, summary, bypass, serverOverride); } async restoreEdit(title, revid, summary, bypass, serverOverride) { return await electron.mwapi("restoreEdit", title, revid, summary, bypass, serverOverride); } async thankRevision(revid, bypass, serverOverride) { return await electron.mwapi("thankRevision", revid, bypass, serverOverride); } async watchPage(title, expiry, bypass, serverOverride) { return await electron.mwapi("watchPage", title, expiry, bypass, serverOverride); } async unwatchPage(title, bypass, serverOverride) { return await electron.mwapi("unwatchPage", title, bypass, serverOverride); } async parse(wt, title, preview = false, bypass, serverOverride) { return await electron.mwapi("parse", wt, title, preview, bypass, serverOverride); } async getTags(bypass, serverOverride) { return await electron.mwapi("getTags", bypass, serverOverride); } async getPagesContent(titles, bypass, serverOverride) { return await electron.mwapi("getPagesContent", titles, bypass, serverOverride); } async getRevisionContent(revids, bypass, serverOverride) { return await electron.mwapi("getRevisionContent", revids, bypass, serverOverride); } async getLatestIds(titles, bypass, serverOverride) { return await electron.mwapi("getLatestIds", titles, bypass, serverOverride); } async getEditCounts(usernames, bypass, serverOverride) { return await electron.mwapi("getEditCounts", usernames, bypass, serverOverride); } async areUsersBlocked(usernames, bypass, serverOverride) { return await electron.mwapi("areUsersBlocked", usernames, bypass, serverOverride); } async isUserGloballyLocked(username, bypass, serverOverride) { return await electron.mwapi("isUserGloballyLocked", username, bypass, serverOverride); } async getContributions(username, limit, bypass, serverOverride) { return await electron.mwapi("getContributions", username, limit, bypass, serverOverride); } async getBlocks(username, bypass, serverOverride) { return await electron.mwapi("getBlocks", username, bypass, serverOverride); } async pagesExist(titles, bypass, serverOverride) { return await electron.mwapi("pagesExist", titles, bypass, serverOverride); } async getPagesDetails(titles, bypass, serverOverride) { return await electron.mwapi("getPagesDetails", titles, bypass, serverOverride); } async countPageReverts(title, username, bypass, serverOverride) { return await electron.mwapi("countPageReverts", title, username, bypass, serverOverride); } async getHistory(title, limit, bypass, serverOverride) { return await electron.mwapi("getHistory", title, limit, bypass, serverOverride); } async getORES(revids, bias, bypass, serverOverride) { return await electron.mwapi("getORES", revids, bias, bypass, serverOverride); } async extractORES(ores, bias) { return await electron.mwapi("extractORES", ores, bias); } async getDiff(from, to, format, bypass, serverOverride) { return await electron.mwapi("getDiff", from, to, format, bypass, serverOverride); } async getRevision(title, revid, bypass, serverOverride) { return await electron.mwapi("getRevision", title, revid, bypass, serverOverride); } async getRevisionsBetween(title, from, to, bypass, serverOverride) { return await electron.mwapi("getRevisionsBetween", title, from, to, bypass, serverOverride); } async parseUsers(usernames, simple, bypass, serverOverride) { return await electron.mwapi("parseUsers", usernames, simple, bypass, serverOverride); } async parseEdits(items, simple, oresBias, bypass, serverOverride) { return await electron.mwapi("parseEdits", items, simple, oresBias, bypass, serverOverride); } async parseAbuselogs(items, simple, bypass, serverOverride) { return await electron.mwapi("parseAbuselogs", items, simple, bypass, serverOverride); } async getConsecutiveEdits(page, revid, username, bypass, serverOverride) { return await electron.mwapi("getConsecutiveEdits", page, revid, username, bypass, serverOverride); } async getAbuseLogRevid(logids, bypass, serverOverride) { return await electron.mwapi("getAbuseLogRevid", logids, bypass, serverOverride); } async feeds(recent, pending, users, watchlist, abuselog) { return await electron.mwapi("feeds", recent, pending, users, watchlist, abuselog); } }); } else { var _ws2; exports.API = API = (_ws2 = new WeakMap, class API extends _api.MediaWikiAPI { get hasPendingChanges() { return serversWithPendingChanges.has(this.server); } constructor(ws, server, username, pendingChangesServers) { super(ws, new _oauth.MediaWikiOAuth2(`WikiShield (${server}; ${username})`), server, username); _classPrivateFieldInitSpec(this, _ws2, null); _classPrivateFieldSet(_ws2, this, ws); this.server = server; this.username = username; for (const pcServer of pendingChangesServers) serversWithPendingChanges.add(pcServer); } } /***/); } }, /***/ 691(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Killswitch = void 0; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _api = new WeakMap; var _interval = new WeakMap; var _events = new WeakMap; var _Killswitch_brand = new WeakSet; class Killswitch { constructor(ws) { _classPrivateMethodInitSpec(this, _Killswitch_brand); _classPrivateFieldInitSpec(this, _api, null); _classPrivateFieldInitSpec(this, _interval, null); _classPrivateFieldInitSpec(this, _events, { okay: [], unsafe: [], update: [], "force-update": [], kill: [] }); _classPrivateFieldSet(_api, this, ws.api); } on(event, callback, options = {}) { if (_classPrivateFieldGet(_events, this)[event]) _classPrivateFieldGet(_events, this)[event].push({ callback, options }); return this; } async check() { try { var _await$_classPrivateF, _await$_classPrivateF2, _JSON$parse, _data$reload$soft, _data$reload, _data$reload$hard, _data$reload2; const content = (_await$_classPrivateF = (_await$_classPrivateF2 = await _classPrivateFieldGet(_api, this).getPagesContent([ _page._ ], true, "en.wikipedia.org")) === null || _await$_classPrivateF2 === void 0 ? void 0 : _await$_classPrivateF2[_page._]) !== null && _await$_classPrivateF !== void 0 ? _await$_classPrivateF : ""; const data = (_JSON$parse = JSON.parse(content)) === null || _JSON$parse === void 0 ? void 0 : _JSON$parse.WikiShield; if (!data) throw new Error("No killswitch found"); if (data.disabled) return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "kill"); const soft = (_data$reload$soft = (_data$reload = data.reload) === null || _data$reload === void 0 ? void 0 : _data$reload.soft) !== null && _data$reload$soft !== void 0 ? _data$reload$soft : 0; const hard = (_data$reload$hard = (_data$reload2 = data.reload) === null || _data$reload2 === void 0 ? void 0 : _data$reload2.hard) !== null && _data$reload$hard !== void 0 ? _data$reload$hard : 0; if (hard > _hard._) return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "force-update"); else if (soft > _soft._) { _soft._ = soft; return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "update"); } return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "okay"); } catch (error) { return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "unsafe"); } } monitor(interval = 10 * 1e3) { if (_classPrivateFieldGet(_interval, this)) clearInterval(_classPrivateFieldGet(_interval, this)); _classPrivateFieldSet(_interval, this, setInterval(() => this.check(), +interval)); return this; } } exports.Killswitch = Killswitch; function _emit(event) { if (_classPrivateFieldGet(_events, this)[event]) for (const listener of _classPrivateFieldGet(_events, this)[event]) try { listener.callback(); } catch (_unused) {} finally { var _listener$options; if (((_listener$options = listener.options) === null || _listener$options === void 0 ? void 0 : _listener$options.once) === true) _classPrivateFieldGet(_events, this)[event] = _classPrivateFieldGet(_events, this)[event].filter(l => l !== listener); } return this; } var _page = { _: "User:LuniZunie/JSON/Killswitch.json" }; var _soft = { _: 11 }; var _hard = { _: 1 }; /***/ } /******/ }; /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ if (!(moduleId in __webpack_modules__)) { /******/ delete __webpack_module_cache__[moduleId]; /******/ var e = new Error("Cannot find module '" + moduleId + "'"); /******/ e.code = "MODULE_NOT_FOUND"; /******/ throw e; /******/ } /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ var __webpack_exports__ = {}; /*!******************************************!*\ !*** ./src/wikishield/web-port/index.js ***! \******************************************/ var _script = __webpack_require__(8816); var _build = __webpack_require__(2486); // <nowiki> { var _mw$util$addPortletLi, _history$state; "use strict"; function start() { (0, _build.build)().then(_script.run).catch(error => { console.error("Error during build:", error); alert("An error occurred while starting WikiShield. Please check the console for details."); }); } (_mw$util$addPortletLi = mw.util.addPortletLink("p-personal", mw.util.getUrl("Wikipedia:WikiShield/run"), "Run WikiShield", "pt-wikishield", "WikiShield", undefined, "#pt-notifications")) === null || _mw$util$addPortletLi === void 0 || _mw$util$addPortletLi.addEventListener("click", event => { event.preventDefault(); history.pushState({ page: "WikiShield" }, "", location.href); start(); }); addEventListener("popstate", event => { var _event$state; if (((_event$state = event.state) === null || _event$state === void 0 ? void 0 : _event$state.page) === "WikiShield") start(); }); switch ((_history$state = history.state) === null || _history$state === void 0 ? void 0 : _history$state.page) { case "WikiShield": { history.replaceState(null, "", location.href); } break; case "WikiShield-reload": { history.replaceState({ page: "WikiShield" }, "", location.href); start(); } break; } if (mw.config.get("wgRelevantPageName") === "Wikipedia:WikiShield/run" && mw.config.get("wgAction") === "view") { history.pushState({ page: "WikiShield" }, "", location.href); start(); } } // </nowiki> /******/})(); //# sourceMappingURL=wikishield.js.map qmwo6yagdahto93d8m8fctnd04go8c2 613756 613754 2026-05-25T17:07:49Z LuniZunie 25284 missing character 613756 javascript text/javascript /******/ (function() { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = { /***/ 4279(module) { module.exports = "@import url('https://fonts.googleapis.com/css2?family=Varela+Round&display=swap');\r\n\r\n:root {\r\n\t--max-z-index: 2147483647;\r\n\r\n --body-color: rgba(241, 245, 255, 1);\r\n --body-background: rgba(20, 20, 30, 1);\r\n\r\n font-family: 'Inter', sans-serif;\r\n \tfont-optical-sizing: auto;\r\n -webkit-font-smoothing: antialiased;\r\n\t-moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n* {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n::-webkit-scrollbar {\r\n\twidth: 10px;\r\n\theight: 10px;\r\n}\r\n\r\n::-webkit-scrollbar-track {\r\n\tbackground: transparent;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n\tborder: 2px solid transparent;\r\n border-radius: 10px;\r\n\r\n\t/* Theme dependent */\r\n\tbackground: rgba(255, 255, 255, .1);\r\n\tbackground-clip: content-box;\r\n\r\n\t&:hover {\r\n\t\tborder: 2px solid transparent;\r\n\t\tborder-radius: 10px;\r\n\r\n\t\t/* Theme dependent */\r\n\t\tbackground: rgba(255, 255, 255, .2);\r\n\t\tbackground-clip: content-box;\r\n\t}\r\n}\r\n\r\nhtml, body {\r\n width: 100%;\r\n\theight: 100%;\r\n\r\n\toverflow: hidden;\r\n\r\n /* Theme dependent */\r\n background: linear-gradient(135deg,\r\n\t\trgba(20, 30, 48, 1),\r\n\t\trgba(36, 59, 85, 1)\r\n\t);\r\n}\r\n\r\n@keyframes loading-dots {\r\n\t0%, 100% {\r\n\t\tcontent: '';\r\n\t}\r\n\t25% {\r\n\t\tcontent: '.';\r\n\t}\r\n\t50% {\r\n\t\tcontent: '..';\r\n\t}\r\n\t75% {\r\n\t\tcontent: '...';\r\n\t}\r\n}\r\n\r\n.animate-loading-dots::after {\r\n\tcontent: '';\r\n\r\n\tdisplay: inline-block;\r\n\r\n\tanimation: loading-dots 1.5s steps(3, start) infinite;\r\n}\r\n\r\n.auto-scroll {\r\n white-space: nowrap;\r\n overflow: auto hidden;\r\n\r\n scrollbar-width: none;\r\n -ms-overflow-style: none;\r\n\r\n\t&::-webkit-scrollbar { display: none; }\r\n\r\n & > .auto-scroll-item {\r\n display: inline-block;\r\n\r\n\t\t&:not(:last-child) {\r\n\t\t\tmargin-right: 20px;\r\n\t\t}\r\n }\r\n &:not(:has(> .auto-scroll-item)) {\r\n opacity: 0;\r\n }\r\n}"; /***/ }, /***/ 5540(module) { module.exports = '<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <meta http-equiv="Content-Security-Policy">\n\n <title>WikiShield</title>\n\n <link rel="stylesheet" href="https://fonts.cdnfonts.com/css/open-dyslexic">\n <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.0/css/all.min.css">\n\n <link rel="stylesheet" href="../common/style.css">\n <link rel="stylesheet" href="style.css">\n\n <script type="module" src="script.js"><\/script>\n </head>\n <body>\n <div id="loading">\n <img class="icon" src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n </div>\n <div id="initial" class="hidden">\n\t\t\t<canvas id="dots-canvas"></canvas>\n\t\t\t<div id="welcome-container" class="shimmer shimmer-border">\n\t\t\t\t<div class="shield-container">\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="shield-icon">\n\t\t\t\t\t\t<img src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<h1>Welcome to <span id="wikishield-sikiwhield">WikiShield</span></h1>\n\t\t\t\t<div class="about-links">\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="about-link">About</a>\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia talk:WikiShield" target="_blank" class="about-link">Discuss</a>\n\t\t\t\t\t<span class="about-link">v<span class="VERSION"></span></span>\n\t\t\t\t</div>\n\t\t\t\t<div id="rollback-needed" class="hidden">\n\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<p>You can apply for rollback rights <a rel="noopener" class="request-link" href="https://www.wikidata.org/wiki/Q7765871" target="_blank">here</a>.</p>\n\t\t\t\t</div>\n\t\t\t\t<button type="button" id="start-button">\n\t\t\t\t\tStart WikiShield <i class="fas fa-arrow-right"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n <div id="app" class="hidden">\n <div id="container">\n <div id="queue">\n <div id="queue-top">\n <div id="queue-top-left" class="queue-button-cluster" data-zen-show="alerts,messages">\n <span class="fa fa-bell" id="alerts-icon" data-tooltip="Alerts" data-zen-show="alerts">\n <span id="alerts-count" class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n <span class="fa fa-inbox" id="messages-icon" data-tooltip="Messages" data-zen-show="messages">\n <span id="messages-count" class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="DEFCON">\n <div class="dot"></div>\n <span><span class="DEFCON-RPM">0</span> RPM</span>\n </div>\n <div id="queue-top-right" class="queue-button-cluster">\n <span class="fa fa-envelope" id="email-button" data-tooltip="Email Emergency, ArbCom, or Oversight" data-multiple-hrefs="email" href></span>\n <span class="fa fa-gear" id="settings-icon" data-tooltip="Settings"></span>\n </div>\n </div>\n <div id="queue-tabs">\n <div id="queue-tab-recent" class="queue-tab selected" data-tooltip="Recent edits">\n <span class="fas fa-stopwatch">\n <span class="icon-count hidden gray" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-pending" class="queue-tab" data-tooltip="Pending edits">\n <span class="fas fa-flag">\n <span class="icon-count hidden orange" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-users" class="queue-tab" data-tooltip="User creation logs">\n <span class="fas fa-user">\n <span class="icon-count hidden green" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-watchlist" class="queue-tab" data-tooltip="Watchlist edits">\n <span class="fas fa-book-bookmark">\n <span class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-abuselog" class="queue-tab" data-tooltip="Abuse logs">\n <span class="fas fa-filter-circle-xmark">\n <span class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n </div>\n </div>\n <div id="queue-items" class="queue-list">\n <div class="queue-empty">\n No edits in queue.\n </div>\n </div>\n <div class="width-adjust" id="queue-width-adjust"></div>\n <div id="clear-queue">\n <span class="fa fa-trash"></span>\n </div>\n </div>\n <div id="alerts-panel" class="notification-panel">\n <div id="alerts-header" class="notification-header">\n <span>Alerts</span>\n <span id="mark-all-alerts-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="alerts-list" class="notification-list"></div>\n </div>\n <div id="messages-panel" class="notification-panel">\n <div id="messages-header" class="notification-header">\n <span>Messages</span>\n <span id="mark-all-messages-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="messages-list" class="notification-list"></div>\n </div>\n <div id="right-container">\n <div id="right-content">\n <div id="main-container">\n <div id="edit-details">\n <div class="central">Nothing selected</div>\n </div>\n <div id="previous-item-button" class="nav-item-button">\n <i class="fas fa-chevron-left"></i>\n </div>\n <div id="next-item-button" class="nav-item-button">\n <i class="fas fa-chevron-right"></i>\n </div>\n <div id="ai-analysis-container" class="hidden shimmer shimmer-border">\n <div class="header">\n <i class="fas fa-robot"></i>\n <span class="title">AI Analysis</span>\n <span class="assessment"></span>\n <span class="confidence"></span>\n </div>\n <div class="explanation"></div>\n <div class="issues"></div>\n </div>\n <div id="diff-scroll-up" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-up"></i>\n </div>\n <div id="diff-container"></div>\n <div id="diff-scroll-down" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-down"></i>\n </div>\n <div id="pending-changes-container" class="hidden">\n <div class="accept">Accept</div>\n <div class="reject">Reject</div>\n </div>\n <div id="progress-bar-container"></div>\n <div id="bottom-tools" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-item" data-menu="revert" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-undo"></i>\n <span>Revert</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="warn" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-exclamation-triangle"></i>\n <span>Warn</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="user" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-user"></i>\n <span>User</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="page" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-file-lines"></i>\n <span>Page</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="edit" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-pen-to-square"></i>\n <span>Edit</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n </div>\n <div id="copy-link" data-tooltip="Copy link" data-queue-type="edit,logevent,abuselog">\n <div>\n <i class="fas fa-link"></i>\n </div>\n </div>\n </div>\n <div id="right-details">\n <div id="right-top">\n <div class="tabs">\n <div id="latest-edits-tab" class="tab hidden selected" data-tooltip="Latest edit">\n <i class="fas fa-user"></i>\n </div>\n <div id="consecutive-edits-tab" class="tab hidden" data-tooltip="Consecutive edits">\n <i class="fas fa-users"></i>\n </div>\n </div>\n\n <div class="icons"></div>\n </div>\n\n <div id="user-contributions" class="section" data-queue-type="edit,logevent,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-user-contributions" class="fas fa-rotate"></i> Contributions</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View all contributions</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div id="page-history" class="section" data-queue-type="edit,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-page-history" class="fas fa-rotate"></i> Page History</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View full page history</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div class="width-adjust" id="details-width-adjust"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="bottom-tool-menu" id="revert-menu"></div>\n <div class="bottom-tool-menu" id="warn-menu"></div>\n <div class="bottom-tool-menu" id="user-menu">\n <div id="user-open-user-page" class="menu-option">\n <i class="fas fa-user-circle"></i>\n <span>Open user page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-open-user-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open user talk</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-contribs" class="menu-option">\n <i class="fas fa-list"></i>\n <span>View contributions</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-filter-log" class="menu-option">\n <i class="fas fa-filter"></i>\n <span>View filter log</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="user-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist user</span>\n </div>\n <div id="user-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist user</span>\n </div>\n <div id="user-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight user</span>\n </div>\n <div id="user-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight user</span>\n </div>\n <div class="menu-divider"></div>\n <div id="user-welcome" class="menu-option submenu-trigger">\n <i class="fas fa-paper-plane"></i>\n <span>Welcome</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-aiv" class="menu-option submenu-trigger">\n <i class="fas fa-flag"></i>\n <span>Report (AIV)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-uaa" class="menu-option submenu-trigger">\n <i class="fas fa-user-slash"></i>\n <span>Report (UAA)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-request-global-block" class="menu-option submenu-trigger">\n <i class="fas fa-ban"></i>\n <span>Request global block</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-request-global-lock" class="menu-option submenu-trigger">\n <i class="fas fa-lock"></i>\n <span>Request global lock</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>Message user</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="page-menu">\n <div id="page-open-page" class="menu-option">\n <i class="fas fa-file"></i>\n <span>Open page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-open-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open talk page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-view-history" class="menu-option">\n <i class="fas fa-clock-rotate-left"></i>\n <span>View page history</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="page-watch" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>Watch page</span>\n </div>\n <div id="page-unwatch" class="menu-option">\n <i class="fas fa-eye-slash"></i>\n <span>Unwatch page</span>\n </div>\n <div id="page-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist page</span>\n </div>\n <div id="page-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist page</span>\n </div>\n <div id="page-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight page</span>\n </div>\n <div id="page-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight page</span>\n </div>\n <div class="menu-divider"></div>\n <div id="page-request-protection" class="menu-option submenu-trigger">\n <i class="fas fa-shield-halved"></i>\n <span>Request protection</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="page-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>New talk page topic</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="edit-menu">\n <div id="edit-view-revision" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>View revision</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="edit-view-diff" class="menu-option">\n <i class="fas fa-code-compare"></i>\n <span>View diff</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="edit-thank-user" class="menu-option">\n <i class="fas fa-heart"></i>\n <span>Thank user</span>\n </div>\n <div id="edit-rollback" class="menu-option submenu-trigger">\n <i class="fas fa-rotate-left"></i>\n <span>Rollback</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-rollback-goodfaith" class="menu-option submenu-trigger">\n <i class="fas fa-handshake"></i>\n <span>Rollback (good faith)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-undo" class="menu-option submenu-trigger">\n <i class="fas fa-arrow-rotate-left"></i>\n <span>Undo</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n\n <div id="settings-container">\n <div class="settings">\n <div class="settings-left">\n <div class="settings-category">\n <div class="settings-category-header">\n <span>CORE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-general-button">\n <span><i class="fas fa-gear"></i>General</span>\n </div>\n <div class="settings-left-menu-item" id="settings-audio-button">\n <span><i class="fas fa-volume-high"></i>Audio</span>\n </div>\n <div class="settings-left-menu-item" id="settings-controls-button">\n <span><i class="fas fa-keyboard"></i>Controls</span>\n </div>\n <div class="settings-left-menu-item" id="settings-zen-button">\n <span><i class="fas fa-spa"></i>Zen Mode</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>APPEARANCE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-app-button">\n <span><i class="fas fa-palette"></i>App</span>\n </div>\n <div class="settings-left-menu-item" id="settings-queue-button">\n <span><i class="fas fa-list"></i>Queue</span>\n </div>\n <div class="settings-left-menu-item" id="settings-accessibility-button">\n <span><i class="fas fa-universal-access"></i>Accessibility</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>TOOLS</span>\n </div>\n <div class="settings-left-menu-item" id="settings-auto-reporting-button">\n <span><i class="fas fa-flag"></i>Auto Reporting</span>\n </div>\n <div class="settings-left-menu-item" id="settings-gadgets-button">\n <span><i class="fas fa-toolbox"></i>Gadgets</span>\n </div>\n <div class="settings-left-menu-item" id="settings-AI-button">\n <span><i class="fas fa-robot"></i>AI Analysis</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WHITELIST</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-whitelist-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>HIGHLIGHT</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-highlight-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>DATA</span>\n </div>\n <div class="settings-left-menu-item" id="settings-statistics-button">\n <span><i class="fas fa-chart-area"></i>Statistics</span>\n </div>\n <div class="settings-left-menu-item" id="settings-save-button">\n <span><i class="fas fa-floppy-disk"></i>Save</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WIKISHIELD</span>\n </div>\n <div class="settings-left-menu-item" id="settings-changelog-button">\n <span><i class="fas fa-file-alt"></i>Changelog</span>\n </div>\n <div class="settings-left-menu-item" id="settings-about-button">\n <span><i class="fas fa-info"></i>About</span>\n </div>\n </div>\n </div>\n <div class="settings-right">\n <div class="general hidden">\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum edit count</div>\n <div class="settings-section-desc">Edits from users with more than this number of total edits will not be shown unless that user is highlighted.</div>\n <numeric-input id="settings-maximum-edit-count" step="5" min="0" value="50"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum queue size</div>\n <div class="settings-section-desc">Maximum number of edits to keep in the queue for review. Higher values may impact performance.</div>\n <numeric-input id="settings-maximum-queue-size" step="10" min="0" value="100"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Minimum ORES score</div>\n <div class="settings-section-desc">Minimum ORES score required for an edit to appear in the recent changes queue.</div>\n <numeric-input id="settings-minimum-ores-score" step="0.05" min="0" max="1" value="0"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">ORES bias</div>\n <div class="settings-section-desc">\n Select how ORES scores are calculated for edits in the recent changes queue. "Badfaith" is how likely an edit is to be made in bad faith, "Damaging" is how likely an edit is to be damaging.\n </div>\n <div id="settings-ores-bias" class="settings-slider">\n <div class="settings-slider-labels">\n <div class="settings-slider-label-left active">Badfaith<span class="percent">50%</span></div>\n <div class="settings-slider-label-right active">Damaging<span class="percent">50%</span></div>\n </div>\n <div class="settings-slider-track">\n <div class="settings-slider-thumb"></div>\n </div>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Watchlist expiry</div>\n <div class="settings-section-desc">Amount of time to leave warned user\'s talk pages on your watchlist.</div>\n <duration-input id="settings-watchlist-expiry"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Namespaces to monitor</div>\n <div class="settings-section-desc">Select which namespaces WikiShield should monitor for recent changes and pending changes.</div>\n <div id="settings-namespaces-container" class="checkbox-container">\n \x3c!-- Namespace checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="audio hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">ORES</span>\n <span>ORES Alerts</span>\n </div>\n <div class="settings-section compact inline" id="sound-alert-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Sound alerts for high ORES scores</div>\n <div class="settings-section-desc">Play a sound when an edit above the threshold is added to the queue</div>\n </div>\n <toggle-input id="settings-ORES-alert-toggle" value="false"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="sound-alert-ores-score">\n <div class="settings-section-content">\n <div class="settings-section-title">ORES score threshold</div>\n <div class="settings-section-desc">Play a sound alert when an edit with an ORES score above this value is added</div>\n </div>\n <numeric-input id="settings-ORES-alert-threshold" step="0.05" min="0" max="1" value="0.9"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Volume</div>\n <volume-control\n id="settings-master-volume"\n title="Master Volume"\n description="Controls the overall volume of all sounds"\n value="1"\n ></volume-control>\n <div id="settings-sounds-container" class="settings-section">\n \x3c!-- Individual sound settings will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="controls hidden">\n <div class="settings-section">\n <div class="settings-section-title">Keyboard shortcuts</div>\n <div class="settings-section-desc">Customize keyboard shortcuts for various actions in WikiShield.</div>\n <div class="settings-section compact inline" id="repeat-control-scripts">\n <div class="settings-section-content">\n <div class="settings-section-title">Repeat control scripts</div>\n <div class="settings-section-desc">Allow control scripts to be triggered repeatedly when holding down keys</div>\n </div>\n <toggle-input id="repeat-control-scripts-toggle" value="true"></toggle-input>\n </div>\n <button type="button" id="settings-new-control-script" class="add-action-button new-control-script"><span class="fa fa-plus"></span> Add new action</button>\n </div>\n </div>\n <div class="zen hidden">\n <div class="settings-section">\n <div class="settings-section-title">Zen Mode</div>\n <div class="settings-section-desc">Your distraction-free editing experience.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Zen Mode</div>\n <div class="settings-section-desc">Reduce on-screen distractions while reviewing edits.</div>\n </div>\n <toggle-input id="settings-zen-mode" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Customize Zen Mode</div>\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Sound</div>\n <div class="settings-section-desc">Play sound in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-sound" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Music</div>\n <div class="settings-section-desc">Play background music in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-music" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Alerts</div>\n <div class="settings-section-desc">Show alerts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-alerts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Messages</div>\n <div class="settings-section-desc">Show messages in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-messages" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Toasts</div>\n <div class="settings-section-desc">Show toasts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-toasts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Badges</div>\n <div class="settings-section-desc">Show badges in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-badges" value="true"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="app hidden">\n <div class="settings-section" data-electron="false">\n <div class="settings-section-title">Launch behavior</div>\n <div class="settings-section-desc">Choose whether WikiShield should open inthe current tabor a new tab when launched.</div>\n <div id="settings-launch-behavior" class="settings-radio-group">\n <div class="settings-radio-option selected" data-value="current_tab">Open in current tab</div>\n <div class="settings-radio-option" data-value="new_tab">Open in new tab</div>\n </div>\n </div>\n \x3c!-- <div class="settings-section">\n <div class="settings-section-title">App theme</div>\n <div class="settings-section-desc">Choose between light mode, dark mode, or automatic switching based on system settings.</div>\n <div id="settings-app-theme" class="settings-radio-group">\n <div class="settings-radio-option" data-value="light">Light mode</div>\n <div class="settings-radio-option selected" data-value="auto">Auto</div>\n <div class="settings-radio-option" data-value="dark">Dark mode</div>\n </div>\n </div> --\x3e\n <div class="settings-section">\n <div class="settings-section-title">Startup animation</div>\n <div class="settings-section-desc">Enable or disable the startup animation when launching WikiShield.</div>\n <div id="settings-startup-performance" class="settings-radio-group">\n <div class="settings-radio-option" data-value="always_off">Always off</div>\n <div class="settings-radio-option selected" data-value="adaptive">Adaptive (recommended)</div>\n <div class="settings-radio-option" data-value="always_on">Always on</div>\n </div>\n </div>\n </div>\n <div class="queue hidden">\n <div class="settings-section">\n <div class="settings-section-title">Queues</div>\n <div class="settings-section-desc">Enable or disable different edit queues, and customize their order.</div>\n <draggable-order-list id="settings-queues">\n \x3c!-- Queue items will be populated here --\x3e\n </draggable-order-list>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Color palette</div>\n <div class="settings-section-desc">Select the color palette used for highlighting users and pages.</div>\n <div id="settings-palette-selector" class="palette-selector">\n\n </div>\n </div>\n </div>\n <div class="accessibility hidden">\n <div class="settings-section">\n <div class="settings-section-title">Accessibility Options</div>\n <div class="settings-section-desc">Customize accessibility features for better usability.</div>\n <div class="settings-compact-grid">\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">Colorblind Mode</div>\n <div class="settings-section-desc">Add indicators to help distinguish colors for colorblind users.</div>\n <toggle-input id="settings-colorblind-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Dyslexia Friendly Font</div>\n <div class="settings-section-desc">Use a font that is easier to read for users with dyslexia.</div>\n <toggle-input id="settings-dyslexia-font" value="false"></toggle-input>\n </div>\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">High Contrast Mode</div>\n <div class="settings-section-desc">Increase contrast for better visibility.</div>\n <toggle-input id="settings-high-contrast-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Reduce Motion</div>\n <div class="settings-section-desc">Minimize motion effects for users sensitive to motion.</div>\n <toggle-input id="settings-reduce-motion" value="false"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="auto-reporting hidden">\n <div class="settings-section">\n <div class="settings-section-title">Enable Auto Reporting</div>\n <div class="settings-section-desc">Automatically report edits that receive certain warnings.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Auto Reporting</div>\n <div class="settings-section-desc">When enabled, edits that trigger selected warnings will be automatically reported.</div>\n </div>\n <toggle-input id="settings-auto-reporting-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Auto Reporting Warnings</div>\n <div class="settings-section-desc">Select which warnings should trigger automatic reporting.</div>\n <div id="settings-auto-reporting-warnings-container" class="checkbox-container">\n \x3c!-- Warning checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="gadgets hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-title">Gadgets</div>\n <div class="settings-section-desc">Toggle various Wikishield features.</div>\n <div class="settings-section compact inline" id="auto-welcome-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Automatic welcoming of new users</div>\n <div class="settings-section-desc">Automatically welcome new users with empty talk pages when moving past their constructive edits</div>\n </div>\n <toggle-input id="settings-auto-welcome-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="wikipedia-popups-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Popups</div>\n <div class="settings-section-desc">When enabled, links will be opened in a new window. Otherwise, they will be opened in your default browser. (Not supported by Opera or Safari browsers)</div>\n </div>\n <toggle-input id="settings-wikipedia-popups-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="talk-page-thanks-for-temporary-users-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Send talk page thanks for temporary users</div>\n <div class="settings-section-desc">If enabled, when you thank a temporary user with an empty talk page, WikiShield will send them a welcoming thank you message in addition to the standard thank you message.</div>\n </div>\n <toggle-input id="settings-edit-summaries-toggle" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Username Highlighting</div>\n <div class="settings-section compact inline" id="username-highlighting-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable username highlighting</div>\n <div class="settings-section-desc">Highlights usernames in edit summaries, edit diffs, and user creation logs.</div>\n </div>\n <toggle-input id="settings-username-highlighting-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="username-highlighting-mode-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Toggle fuzzy matching mode</div>\n <div class="settings-section-desc">\n When enabled, highlights similar usernames. Not recommended for users with short usernames.<br/>\n <strong>NOTE:</strong> This may cause performance issues for those with long usernames, or users on weaker devices.\n </div>\n </div>\n <toggle-input id="settings-username-highlighting-fuzzy-toggle" value="false"></toggle-input>\n </div>\n </div>\n </div>\n <div class="AI hidden">\n <div class="settings-section">\n <div class="settings-section-title">AI Analysis</div>\n <div class="settings-section-desc">Configure AI-powered analysis features.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Ollama AI Analysis &lpar;<a href="https://ollama.com">ollama.com</a>&rpar;</div>\n <div class="settings-section-desc">Use local AI models with complete privacy.</div>\n </div>\n <toggle-input id="settings-AI-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">Tools</span>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Edit Analysis</div>\n <div class="settings-section-desc">Suggests actions to take on edits.</div>\n </div>\n <toggle-input id="settings-AI-edit-analysis-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Username Analysis</div>\n <div class="settings-section-desc">Flags potentially problematic usernames and prompts you to report them to UAA</div>\n </div>\n <toggle-input id="settings-AI-username-analysis-toggle" value="true"></toggle-input>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-server-url">\n <div class="settings-section-title">Server URL</div>\n <div class="settings-section-desc">The URL of your local Ollama server</div>\n <div class="text-input-container">\n <input title="Ollama URL" type="text" id="ollama-url-input" autoComplete="off">\n <button type="button" id="settings-ollama-test-connection">Test Connection</button>\n </div>\n <div class="settings-section compact connection-status-container">\n <p id="settings-ollama-connection-status"></p>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-model-select">\n <div class="settings-section-title">\n Model Selection\n <button type="button" id="settings-ollama-refresh-models">\n <span class="fa fa-sync"></span> Refresh Models\n </button>\n </div>\n <div class="settings-section-desc">Select which Ollama model to use for edit analysis</div>\n <div class="settings-section compact models-container">\n <p id="settings-ollama-models-status">Click "Refresh Models" to load available models</p>\n <div id="settings-ollama-models"></div>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-setup">\n <div class="settings-section-title">Setup required</div>\n <div class="settings-section-desc">\n <details>\n <summary><strong>Windows (Permanent)</strong></summary>\n <ol class="pad-list">\n <li>Press <code>Win + R</code>, type <code>sysdm.cpl</code>, and press Enter</li>\n <li>Go to the "Advanced" tab and click on "Environment Variables"</li>\n <li>Create a new variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_HOST</code> and the value to <code>http://127.0.0.11434</code>\n <ul class="pad-list">\n <li><strong>NOTE:</strong> You can change the port (11434) if that port is already in use, but make sure to update the "Server URL" setting in WikiShield accordingly</li>\n </ul>\n </li>\n <li>Click "OK" to save the variable</li>\n <li>Create another variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_ORIGINS</code> and the value to <code>https://*.wikipedia.org</code></li>\n <li>Click "OK" to save the variable, you can now close the Environment Variables and System Properties windows</li>\n <li>Restart Ollama</li>\n </ol>\n </details>\n\n <details>\n <summary><strong>Windows (Temporary)</strong></summary>\n <pre>\n$env:OLLAMA_HOST="http://127.0.0.11434"\n$env:OLLAMA_ORIGINS="https://*.wikipedia.org"\nollama serve</pre>\n </details>\n\n <details>\n <summary><strong>macOS / Linux</strong></summary>\n Add the following to <code>~/.bashrc</code> or <code>~/.zshrc</code>:\n <pre>\nexport OLLAMA_HOST="http://127.0.0.11434"\nexport OLLAMA_ORIGINS="https://*.wikipedia.org"</pre>\n Then run:\n <pre>source ~/.bashrc && ollama serve</pre>\n </details>\n </div>\n </div>\n </div>\n\n <div class="whitelist users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted users</div>\n <div class="settings-section-desc">Amount of time before a whitelisted user is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-users-expiry" label="Default expiry for whitelisted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Users</div>\n <div class="settings-section-desc">Manage your list of whitelisted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-users-input" placeholder="Add user to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-whitelist-users-list" class="settings-section list-container">\n \x3c!-- Whitelisted users will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted pages</div>\n <div class="settings-section-desc">Amount of time before a whitelisted page is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-pages-expiry" label="Default expiry for whitelisted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Pages</div>\n <div class="settings-section-desc">Manage your list of whitelisted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-pages-input" placeholder="Add page to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-whitelist-pages-list" class="settings-section list-container">\n \x3c!-- Whitelisted pages will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted tags</div>\n <div class="settings-section-desc">Amount of time before a whitelisted tag is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-tags-expiry" label="Default expiry for whitelisted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Tags</div>\n <div class="settings-section-desc">Manage your list of whitelisted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-tags-input" placeholder="Add tag to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-whitelist-tags-list" class="settings-section list-container">\n \x3c!-- Whitelisted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="highlight users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted users</div>\n <div class="settings-section-desc">Amount of time before a highlighted user is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-users-expiry" label="Default expiry for highlighted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Users</div>\n <div class="settings-section-desc">Manage your list of highlighted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-users-input" placeholder="Add user to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-highlight-users-list" class="settings-section list-container">\n \x3c!-- Highlighted users will be populated here --\x3e\n </div>\n </div>\n <div class="highlight pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted pages</div>\n <div class="settings-section-desc">Amount of time before a highlighted page is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-pages-expiry" label="Default expiry for highlighted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Pages</div>\n <div class="settings-section-desc">Manage your list of highlighted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-pages-input" placeholder="Add page to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-highlight-pages-list" class="settings-section list-container">\n \x3c!-- Highlighted pages will be populated here --\x3e\n </div>\n </div>\n <div class="highlight tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted tags</div>\n <div class="settings-section-desc">Amount of time before a highlighted tag is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-tags-expiry" label="Default expiry for highlighted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Tags</div>\n <div class="settings-section-desc">Manage your list of highlighted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-tags-input" placeholder="Add tag to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-highlight-tags-list" class="settings-section list-container">\n \x3c!-- Highlighted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="statistics hidden">\n <div class="settings-section">\n <div class="settings-section-title">\n Statistics Overview\n <button type="button" id="reset-statistics-button">Reset Statistics</button>\n </div>\n <div class="stats-grid">\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-total-reviewed" class="stat-value"></div>\n <div class="stat-label">Edits Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have thanked <span id="stats-thanks-percentage"></span>% of the edits you reviewed\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-recent-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Recent Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n Recent changes make up <span id="stats-recent-changes-percentage"></span>% of your reviewed edits\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pending-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Pending Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have accepted <span id="stats-pending-changes-accepted"></span> &lpar;\n <span id="stats-pending-changes-accepted-percentage"></span>%\n &rpar; pending changes\n </div>\n <div class="stat-sublabel">\n You have rejected <span id="stats-pending-changes-rejected"></span> &lpar;\n <span id="stats-pending-changes-rejected-percentage"></span>%\n &rpar; pending changes from entering the public eye\n </div>\n <div class="stat-sublabel">\n Out of all the edits you&rsquo;ve reviewed, <span id="stats-pending-changes-percentage"></span>% of them were pending review\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-user-creations-reviewed" class="stat-value"></div>\n <div class="stat-label">User Creations Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-user-creations-percentage"></span>% of your reviews came from user creations\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-watchlist-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Watchlist Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-watchlist-changes-percentage"></span>% of your reviews came from your watchlist\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-abuselog-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Abuse Log Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-abuselog-changes-percentage"></span>% of your reviews came from your abuse log\n </div>\n </div>\n </div>\n </div>\n\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reverts-made" class="stat-value"></div>\n <div class="stat-label">Reverts Made</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reverts-percentage"></span>% of edits that cross your path are reverted by you\n </div>\n <div class="stat-sublabel">\n You assumed good faith <span id="stats-goodfaith-reverts-percentage"></span>% of the time\n </div>\n <div class="stat-sublabel">\n <span id="stats-recent-reverts-percentage"></span>% of your reverts were from recent changes\n </div>\n <div class="stat-sublabel">\n <span id="stats-pending-reverts-percentage"></span>% of your reverts were pending\n </div>\n <div class="stat-sublabel">\n <span id="stats-watchlist-reverts-percentage"></span>% of your reverts were from your watchlist\n </div>\n <div class="stat-sublabel">\n <span id="stats-abuselog-reverts-percentage"></span>% of your reverts were from your abuse log\n </div>\n <div class="stat-sublabel">\n &hellip;and the last <span id="stats-other-reverts-percentage"></span>% weren&rsquo;t even in your queue!\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-users-welcomed" class="stat-value"></div>\n <div class="stat-label">Users Welcomed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-welcomed-message"></span>\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-warnings" class="stat-value"></div>\n <div class="stat-label">Warnings Issued</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-warning-1-percentage"></span>% were level 1\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-2-percentage"></span>% were level 2\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-3-percentage"></span>% were level 3\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4-percentage"></span>% were level 4\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4im-percentage"></span>% were level 4im\n </div>\n <div class="stat-sublabel">\n &hellip;and the rest we were too lazy to track =&rpar;\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reports" class="stat-value"></div>\n <div class="stat-label">Reports Filed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n AIV accounted for <span id="stats-AIV-reports-percentage"></span>% of your reports\n </div>\n <div class="stat-sublabel">\n another <span id="stats-UAA-reports-percentage"></span>% were for UAA\n </div>\n <div class="stat-sublabel">\n <span id="stats-global-block-reports-percentage"></span>% were for global block requests\n </div>\n <div class="stat-sublabel">\n while <span id="stats-global-lock-reports-percentage"></span>% were for global lock requests\n </div>\n <div class="stat-sublabel">\n finally, <span id="stats-RFPP-reports-percentage"></span>% were posted at RFPP\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pages-watched" class="stat-value"></div>\n <div class="stat-label">Pages Watched</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-pages-unwatched"></span> pages were annoying enough to be unwatched\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-whitelisted" class="stat-value"></div>\n <div class="stat-label">Items Whitelisted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-whitelisted"></span> &lpar;\n <span id="stats-users-whitelisted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-whitelisted"></span> &lpar;\n <span id="stats-pages-whitelisted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-whitelisted"></span> &lpar;\n <span id="stats-tags-whitelisted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-highlighted" class="stat-value"></div>\n <div class="stat-label">Items Highlighted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-highlighted"></span> &lpar;\n <span id="stats-users-highlighted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-highlighted"></span> &lpar;\n <span id="stats-pages-highlighted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-highlighted"></span> &lpar;\n <span id="stats-tags-highlighted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-session-time" class="stat-value"></div>\n <div class="stat-label">Session Time</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reports-per-day"></span> reports per day\n </div>\n <div class="stat-sublabel">\n <span id="stats-reverts-per-hour"></span> reverts per hour\n </div>\n <div class="stat-sublabel">\n <span id="stats-reviews-per-minute"></span> reviews per minute\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="save hidden">\n <div class="save settings-section">\n <div class="save-settings-header">\n <div class="settings-section-title">Save Settings</div>\n <div class="settings-section-desc">Manage how and where your WikiShield settings are stored.</div>\n </div>\n\n <div class="save-settings-content">\n <div class="save-settings-card data-management-card">\n <div class="card-header">\n <div class="card-icon">\n <i class="fa fa-database"></i>\n </div>\n <div class="card-header-content">\n <div class="card-title">Data Management</div>\n <div class="card-desc">Import, export, or reset your WikiShield settings. Settings are encoded as base64 for easy sharing.</div>\n </div>\n </div>\n\n <div class="card-body">\n <div class="action-buttons-grid">\n <button type="button" id="settings-export-button" class="action-card export-card">\n <div class="action-card-icon">\n <i class="fa fa-download"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Export Settings</div>\n <div class="action-card-desc">Save your configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-import-button" class="action-card import-card">\n <div class="action-card-icon">\n <i class="fa fa-upload"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Import Settings</div>\n <div class="action-card-desc">Load saved configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-reset-button" class="action-card reset-card">\n <div class="action-card-icon">\n <i class="fa fa-undo"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Reset Settings</div>\n <div class="action-card-desc">Restore to defaults</div>\n </div>\n </button>\n </div>\n\n <div id="settings-save-status" class="status-message hidden"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="changelog hidden">\n <div class="settings-section">\n <div class="changelog-content">\n\n </div>\n </div>\n </div>\n <div class="about hidden">\n <div class="settings-section">\n <div class="about-content">\n <div class="about-version">\n <span class="fa fa-shield-alt"></span>\n <span>WikiShield v<span id="settings-about-version"></span></span>\n </div>\n\n <div class="about-tagline">\n <p>A powerful, real-time patrolling tool for Wikipedia editors</p>\n </div>\n\n <div class="about-links">\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="link-card docs">\n <div class="link-card-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Documentation</div>\n <div class="link-card-desc">Learn how to use WikiShield</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://github.com/LuniZunie/WikiShield-App" target="_blank" class="link-card source">\n <div class="link-card-icon">\n <span class="fa fa-code-branch"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Source Code</div>\n <div class="link-card-desc">View on GitHub</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia_talk:WikiShield" target="_blank" class="link-card feedback">\n <div class="link-card-icon">\n <span class="fa fa-comments"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Feedback</div>\n <div class="link-card-desc">Share your thoughts</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n </div>\n\n <div class="about-footer">\n <div class="footer-divider"></div>\n <div class="about-credits">\n <div>\n <div class="credit-card" data-link="https://about.luni.me">\n <div class="credit-icon">\n <span class="fa fa-code"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">LuniZunie</div>\n <div class="credit-role auto-scroll">Lead Developer</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Ingenuity">\n <div class="credit-icon">\n <span class="fa fa-lightbulb"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Ingenuity</div>\n <div class="credit-role auto-scroll">Original Creator</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Monkeysmashingkeyboards">\n <div class="credit-icon">\n <span class="fa fa-database"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Monkeysmashingkeyboards</div>\n <div class="credit-role auto-scroll">Backend</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:pro-anti-air">\n <div class="credit-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Pro-anti-air</div>\n <div class="credit-role auto-scroll">Documentation</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Chaotic_Enby">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Chaotic Enby</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:HurricaneZeta">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">HurricaneZeta</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="copyright-card" data-link="https://sound-effects.bbcrewind.co.uk">\n <div class="copyright-title auto-scroll">Nature sounds</div>\n <div class="copyright-desc auto-scroll">bbc.co.uk &ndash; &copy; copyright 2026 BBC</div>\n </div>\n <div class="copyright-card" data-link="https://pixabay.com/sound-effects">\n <div class="copyright-title auto-scroll">Sound effects</div>\n <div class="copyright-desc auto-scroll">pixabay.com &ndash; CC0 License</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </body>\n</html>'; /***/ }, /***/ 2459(module) { module.exports = "@keyframes startup {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes particles {\n\t0%, 100% {\n\t\ttransform: translate(0, 0) rotate(0deg);\n\t}\n\t33% {\n\t\ttransform: translate(30px, -30px) rotate(120deg);\n\t}\n\t66% {\n\t\ttransform: translate(-20px, 20px) rotate(240deg);\n\t}\n}\n\n@keyframes container-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(30px) scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0) scale(1);\n\t}\n}\n\n@keyframes border-glow {\n\t0%, 100% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 40px rgba(102, 126, 234, .4),\n\t\t\t0 0 80px rgba(240, 147, 251, .3),\n\t\t\tinset 0 0 60px rgba(102, 126, 234, .15),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .2);\n\t}\n\t50% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 60px rgba(240, 147, 251, .6),\n\t\t\t0 0 120px rgba(102, 126, 234, .4),\n\t\t\tinset 0 0 80px rgba(240, 147, 251, .2),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .3);\n\t}\n}\n\n@keyframes shield-entrance {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: scale(0) rotate(-180deg);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: scale(1.15) rotate(10deg);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: scale(1) rotate(0deg);\n\t}\n}\n\n@keyframes shield-float {\n\t0%, 100% {\n\t\ttransform: translate(-50%, -50%) translateY(0px);\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) translateY(-10px);\n\t}\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: translate(-50%, -50%) scale(.8);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t\topacity: 0.8;\n\t}\n\t100% {\n\t\ttransform: translate(-50%, -50%) scale(1.5);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes sparkle {\n\t0%, 100% {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: scale(1.5);\n\t\topacity: 1;\n\t}\n}\n\n@keyframes title-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-20px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes links-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes warning-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes button-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(40px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes fade-in {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n@keyframes fade-out {\n\tfrom {\n\t\topacity: 1;\n\t}\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-in {\n\tfrom {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n}\n@keyframes scale-out {\n\tfrom {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n\tto {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-x {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n}\n\n@keyframes bottom-tool-menu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n@keyframes bottom-tool-submenu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateX(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n}\n\n@keyframes toast-alert-enter {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: translateX(100%) scale(.8);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: translateX(-10px) scale(1.05);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n}\n@keyframes toast-alert-leave {\n\t0% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n\t100% {\n\t\topacity: 0;\n\t\ttransform: translateX(150%) scale(.7);\n\t}\n}\n\n@keyframes music-toast-enter {\n from {\n opacity: 0;\n transform: translateX(150%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes music-toast-leave {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(150%);\n }\n}\n\n@keyframes tooltip-enter {\n from {\n\t\ttransform: scale(.8);\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes star-spin {\n 0% {\n transform: rotate(0deg) scale(1);\n }\n 50% {\n transform: rotate(180deg) scale(1.3);\n }\n 100% {\n transform: rotate(360deg) scale(1);\n }\n}\n\n@keyframes flash-highlight {\n 0%, 100% {\n filter: brightness(1);\n }\n 50% {\n filter: brightness(.5);\n }\n}\n\n@keyframes logo-loader {\n 0%, 100% {\n transform: scale(1);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 10px rgba(102, 126, 234, .4));\n }\n 50% {\n transform: scale(1.5);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 20px rgba(102, 126, 234, .6));\n }\n}\n\n@keyframes refresh-rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse-DEFCON {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.15);\n }\n 100% {\n transform: scale(1);\n }\n}\n\nbody {\n --transparency: 1;\n\n font-size: clamp(14px, 3vw, 16px);\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n background: rgba(20, 20, 30, 1);\n\n &.dyslexia-font {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n\n *:not(.fa):not(.fas):not(.far):not(.fal):not(.fab) {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n }\n }\n\n &.reduce-motion * {\n animation-duration: 0.001s !important;\n transition-duration: 0.001s !important;\n }\n\n & a {\n text-decoration: none;\n\n &:active {\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n }\n }\n\n & > #popup-blocker {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 1);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease;\n }\n\n & > #loading {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 2);\n\n opacity: 1;\n\n transition: opacity .5s ease;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n & > .icon {\n width: 100vmin;\n }\n }\n\n & > .icon {\n aspect-ratio: 1 / 1;\n width: 12.5vmin;\n\n animation: logo-loader 2s ease-in-out infinite;\n\n transition: width .5s cubic-bezier(0.6, -0.28, 0.735, 0.045);\n }\n }\n\n & > #initial {\n display: flex;\n align-items: center;\n\t justify-content: center;\n\n width: 100%;\n height: 100%;\n\n position: relative;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n display: none;\n }\n\n &:before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 0;\n background:\n radial-gradient(circle at 20% 50%, rgba(102, 126, 234, .08) 0%, transparent 50%),\n radial-gradient(circle at 80% 80%, rgba(118, 75, 162, .06) 0%, transparent 50%);\n pointer-events: none;\n }\n\n &:not(.hidden) {\n animation: startup 1.2s ease-out;\n\n & > #welcome-container {\n animation: container-fade-in 1.2s ease-out;\n\n & > .shield-container {\n animation: shield-entrance 1.5s ease 2s forwards;\n }\n\n & > h1 {\n animation: title-fade-in 0.8s ease-out 0.5s both;\n }\n\n & > .about-links {\n animation: link-slide-in 0.8s ease-out 0.7s both;\n }\n\n & > #rollback-needed {\n animation: warning-fade-in 1s ease-out 0.7s both;\n }\n\n & > button {\n animation: button-slide-in 2s ease-out 1s both;\n }\n }\n }\n\n & > #dots-canvas {\n width: 100%;\n height: 100%;\n\n position: absolute;\n z-index: 0;\n left: 0;\n top: 0;\n }\n\n & > #welcome-container {\n padding: 48px;\n\n border-radius: 16px;\n\n max-width: 480px;\n\n position: relative;\n z-index: 2;\n\n text-align: center;\n\n overflow: hidden;\n\n /* Theme dependent */\n border: 1px solid rgba(143, 163, 255, .15);\n box-shadow:\n 0 12px 40px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & * {\n position: relative;\n z-index: 1;\n }\n\n & > .shield-container {\n width: 100px;\n height: 100px;\n\n position: relative;\n\n margin: 0 auto 24px;\n\n opacity: 0;\n\n & > .glow-ring {\n width: 240px;\n height: 240px;\n\n position: absolute;\n left: 50%;\n top: 50%;\n\n border: 2px solid;\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: pulse 2.5s ease-in-out infinite;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n &:nth-child(2) {\n animation-delay: 0.4s;\n border-color: rgba(118, 75, 162, .25);\n }\n &:nth-child(3) {\n animation-delay: 0.8s;\n border-color: rgba(143, 163, 255, .2);\n }\n }\n\n & > .sparkle {\n width: 5px;\n height: 5px;\n\n position: absolute;\n\n border-radius: 50%;\n\n animation: sparkle 2s ease-in-out infinite;\n\n &:nth-child(4) {\n top: 15%;\n left: 25%;\n\n animation-delay: 0s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .6);\n box-shadow: 0 0 8px rgba(143, 163, 255, .6);\n }\n &:nth-child(5) {\n top: 25%;\n left: 18%;\n\n animation-delay: 0.4s;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .6);\n box-shadow: 0 0 8px rgba(102, 126, 234, .6);\n }\n &:nth-child(6) {\n bottom: 20%;\n\t left: 30%;\n\n animation-delay: 0.8s;\n\n /* Theme dependent */\n background: rgba(118, 75, 162, .5);\n box-shadow: 0 0 8px rgba(118, 75, 162, .5);\n }\n &:nth-child(7) {\n bottom: 25%;\n right: 25%;\n\n animation-delay: 1.2s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .5);\n box-shadow: 0 0 8px rgba(143, 163, 255, .5);\n }\n }\n\n & > .shield-icon {\n width: 100px;\n\n position: absolute;\n z-index: 2;\n left: 50%;\n top: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: shield-float 3s ease-in-out infinite;\n\n /* Theme dependent */\n filter: drop-shadow(0 0 8px rgba(102, 126, 234, .3));\n\n & > img {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 2.2em;\n font-weight: 700;\n line-height: 1.2;\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n }\n\n & > .subtitle {\n margin: 0 0 24px 0;\n\n font-size: 0.95em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 0.8);\n }\n\n & > .about-links {\n display: flex;\n justify-content: center;\n gap: 12px;\n flex-wrap: wrap;\n\n margin: 24px 0;\n\n & > .about-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n padding: 8px 14px;\n\n border: 1px solid;\n border-radius: 8px;\n\n font-size: 0.85em;\n font-weight: 500;\n text-decoration: none;\n\n transition: background .2s ease,\n transform .2s ease,\n color .2s ease,\n border-color .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 0.9);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .2);\n }\n }\n }\n\n & > #rollback-needed {\n margin: 20px 0;\n padding: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(247, 76, 60, .3);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n\t\t inset 0 1px 0 rgba(255, 255, 255, .05);\n background: rgba(247, 76, 60, .08);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n display: none;\n }\n\n & p {\n margin: 6px 0;\n\n font-weight: 400;\n font-size: 0.9em;\n\n /* Theme dependent */\n color: rgba(247, 76, 60, 0.95);\n }\n & a {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n & > button {\n cursor: pointer;\n\n width: 100%;\n\n padding: 12px 24px;\n\n border: 2px solid transparent;\n border-radius: 10px;\n\n position: relative;\n\n font-size: 1em;\n font-weight: 700;\n color: rgba(143, 163, 255, 1);\n letter-spacing: 0.5px;\n\n overflow: hidden;\n\n opacity: 1;\n\n transition: all .25s ease;\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.8), rgba(118, 75, 162, 0.8)) border-box;\n box-shadow:\n 0 0 10px rgba(102, 126, 234, .6),\n 0 0 20px rgba(118, 75, 162, .3),\n inset 0 0 10px rgba(102, 126, 234, .1);\n\n &.hidden {\n display: none;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(160, 180, 255, 1);\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 75, 162, 1)) border-box;\n box-shadow:\n 0 0 15px rgba(102, 126, 234, .8),\n 0 0 30px rgba(118, 75, 162, .5),\n inset 0 0 15px rgba(102, 126, 234, .2);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.7), rgba(118, 75, 162, 0.7)) border-box;\n box-shadow:\n 0 0 8px rgba(102, 126, 234, .5),\n 0 0 16px rgba(118, 75, 162, .3),\n inset 0 0 8px rgba(102, 126, 234, .1);\n }\n\n &::before {\n content: \"\";\n\n width: 100%;\n height: 100%;\n\n position: absolute;\n left: -100%;\n top: 0;\n\n transition: left .4s ease;\n\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1),\n transparent\n );\n }\n\n & > i {\n margin-right: 6px;\n font-size: 14px;\n transition: transform 0.3s ease;\n }\n\n &:hover > i {\n transform: translateX(2px);\n }\n }\n }\n }\n\n & > #app {\n width: 100%;\n height: 100%;\n\n line-height: 1.5;\n color: var(--body-color);\n\n overflow: hidden;\n\n background: var(--body-background);\n\n &.hidden {\n display: none;\n }\n\n & > #container {\n display: flex;\n width: 100%;\n height: 100%;\n\n margin: 0;\n\n overflow: hidden;\n\n & > #queue {\n width: 15vw;\n height: 100%;\n\n position: relative;\n\n border-right: 1px solid;\n\n /* Theme dependent */\n border-right-color: rgba(58, 61, 74, 1);\n\n & > #queue-top {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 69px;\n\n position: relative;\n z-index: 2;\n\n border-bottom: 2px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 8px;\n\n padding: 10px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-button-cluster {\n display: flex;\n align-items: center;\n gap: 20px;\n\n padding: 10px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n font-size: 1.2em;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .fa {\n position: relative;\n }\n\n & > span {\n cursor: pointer;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > #DEFCON {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n padding: 4px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .dot {\n flex: 0 0 auto;\n\n width: 10px;\n height: 10px;\n\n border-radius: 50%;\n\n animation: pulse-DEFCON 2s ease-in-out infinite;\n\n /* Theme dependent */\n background: rgba(100, 100, 100, 1);\n box-shadow: 0 0 0 4px rgba(100, 100, 100, .15);\n\n &.DEFCON-1 {\n background: rgba(255, 75, 75, 1);\n box-shadow: 0 0 0 4px rgba(255, 75, 75, .3);\n }\n &.DEFCON-2 {\n background: rgba(255, 165, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 165, 0, .3);\n }\n &.DEFCON-3 {\n background: rgba(255, 255, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 255, 0, .3);\n }\n &.DEFCON-4 {\n background: rgba(75, 255, 75, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 75, .3);\n }\n &.DEFCON-5 {\n background: rgba(75, 255, 255, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 255, .3);\n }\n }\n\n & > span {\n overflow: auto hidden;\n\n white-space: nowrap;\n font-size: 13px;\n font-weight: 500;\n }\n }\n }\n\n & > #queue-tabs {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-around;\n gap: 8px;\n\n position: relative;\n z-index: 2;\n\n border-radius: 0 0 12px 12px;\n padding: 10px 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: transparent;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-tab {\n cursor: pointer;\n\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n\n position: relative;\n\n border-radius: 50%;\n padding: 8px 14px;\n\n font-size: 1.4em;\n\n transition: transform .18s ease,\n color .18s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .85);\n\n &::after {\n content: \"\";\n\n height: 3px;\n\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n\n border-radius: 2px;\n\n transform: scaleX(0);\n\n transition: transform .22s cubic-bezier(.2, .9, .27, 1);\n\n /* Theme dependent */\n opacity: .95;\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, 1),\n rgba(118, 75, 162, 1)\n );\n }\n\n &:hover, &:focus-visible {\n transform: translateY(-2px);\n }\n\n &:not(.selected).mentions-me::after {\n animation: scale-x 1s ease-in-out infinite;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(244, 196, 32, 1),\n rgba(255, 107, 107, 1)\n );\n }\n\n &.selected {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n &::after {\n transform: scaleX(1);\n }\n }\n\n &.hidden {\n display: none;\n }\n\n & > .fas {\n position: relative;\n }\n }\n }\n\n & > .queue-list {\n height: calc(100% - 60px);\n\n position: relative;\n top: -60px;\n\n padding-top: 60px;\n padding-bottom: 10px;\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n right: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > #clear-queue {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-container {\n display: flex;\n flex-wrap: wrap;\n width: calc(100% - 15vw);\n\n & > #right-content {\n display: flex;\n width: 100%;\n height: 100%;\n\n & > #main-container {\n display: flex;\n flex-direction: column;\n gap: 0px;\n width: calc(100% - 15vw);\n height: 100%;\n\n padding-top: 69px;\n\n position: relative;\n\n & > #edit-details {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 4px;\n\n width: calc(100% - 20vmin);\n height: 69px;\n\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-top: none;\n border-radius: 8px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease;\n\n /* Theme dependent */\n background: rgba(30, 34, 45, 1);\n border-color: rgba(143, 163, 255, .2);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n inset 0 1px 0px rgba(255, 255, 255, .05);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .central {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n flex: 1;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: 1em;\n\n & > .page-title {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(119, 166, 215, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n\n & > a {\n color: inherit;\n\n white-space: nowrap;\n text-overflow: ellipsis;\n\n overflow: hidden;\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > a {\n color: inherit;\n }\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: calc(1rem + 4px);\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n\n & > .subheader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: .9em;\n\n & > .item-comment {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n &.none {\n opacity: .6;\n }\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n white-space: nowrap;\n\n overflow: auto hidden;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: .85rem;\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .nav-item-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 41px;\n height: 41px;\n\n position: absolute;\n top: 14px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: 0;\n }\n\n &#previous-item-button {\n left: calc(5vmin - calc(41px / 2));\n }\n &#next-item-button {\n right: calc(5vmin - calc(41px / 2));\n }\n\n & > i {\n font-size: 16px;\n }\n }\n\n & > #ai-analysis-container {\n flex-shrink: 0;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 12px;\n margin-bottom: 0;\n padding: 10px;\n\n overflow: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .2);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n align-items: center;\n gap: 6px;\n\n margin-bottom: 8px;\n\n & > .fa {\n font-size: 1.1em;\n }\n\n & > .title {\n font-size: .95em;\n letter-spacing: .3px;\n }\n\n & > .assessment {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .8em;\n font-weight: 700;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.review {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.suspicious {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.bad {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n &.error {\n /* Theme dependent */\n background: rgba(158, 158, 158, .25);\n }\n }\n\n & > .confidence {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .75em;\n font-weight: 600;\n }\n }\n\n & > .explanation {\n border-left: 3px solid;\n\n border-radius: 4px;\n margin-bottom: 6px;\n padding: 6px 8px;\n\n font-size: .8em;\n line-height: 1.3;\n\n /* Theme dependent */\n border-left-color: rgba(143, 163, 255, .4);\n }\n\n & > .issues {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n & > .issue {\n border-radius: 6px;\n padding: 4px 10px;\n\n font-size: .75em;\n font-weight: 600;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.medium {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.high {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.critical {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n }\n }\n }\n\n & > .notice {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 8px;\n\n border-left: 4px solid;\n border-radius: 4px;\n\n margin: 10px;\n padding: 8px 12px;\n\n font-size: .9em;\n\n &.edit-war {\n /* Theme dependent */\n color: rgba(120, 27, 20, 1);\n border-left-color: rgba(247, 50, 20, 1);\n background: rgba(255, 205, 199, 1);\n }\n\n &.outdated {\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-left-color: rgba(255, 193, 7, 1);\n background: rgba(255, 243, 205, 1);\n\n &.pending {\n /* Theme dependent */\n color: rgba(12, 84, 96, 1);\n border-left-color: rgba(23, 162, 184, 1);\n background: rgba(209, 236, 241, 1);\n }\n }\n\n & > .text {\n flex: 1;\n }\n\n & > .button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .85em;\n font-weight: 600;\n white-space: nowrap;\n text-decoration: none;\n\n transition: color .2s ease,\n border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-color: rgba(255, 193, 7, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .1);\n\n background: rgba(255, 235, 159, .45);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > i {\n font-size: 14px;\n\n transition: transform .3s ease;\n }\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n color: rgba(80, 60, 0, 1);\n border-color: rgba(255, 193, 7, .6);\n box-shadow: 0 4px 16px rgba(255, 193, 7, .25);\n\n background: rgba(255, 235, 159, .65);\n\n & > i {\n transform: translateX(3px);\n\n &.restore {\n transform: rotateZ(180deg);\n }\n }\n }\n }\n }\n\n & > .diff-scroll-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n opacity: 1;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > i {\n font-size: 16px;\n }\n\n &#diff-scroll-up {\n top: 77px;\n }\n &#diff-scroll-down {\n bottom: 8px;\n }\n }\n\n & > #diff-container {\n flex: 1;\n\n padding: 12px;\n\n scroll-behavior: smooth;\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(20, 22, 28, .3),\n transparent\n );\n\n & > .loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n & > .loading-spinner {\n margin-bottom: 24px;\n\n font-size: 56px;\n\n animation: logo-loader 2s ease-in-out infinite;\n }\n\n & > .loading-text {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n text-align: center;\n font-weight: 500;\n letter-spacing: .3px;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 1);\n }\n }\n\n & > table {\n width: 100%;\n\n border: 1px solid;\n border-collapse: separate;\n border-spacing: 0;\n\n border-radius: 14px;\n margin-bottom: 24px;\n\n overflow: hidden;\n\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: .8em;\n line-height: 1.6;\n vertical-align: baseline;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .1),\n inset 0 -1px 0px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(143, 163, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(35, 40, 52, .5),\n rgba(30, 35, 48, .4)\n );\n -webkit-backdrop-filter: blur(16px) saturate(110%);\n backdrop-filter: blur(16px) saturate(110%);\n\n & > tbody {\n .mw-diff-movedpara-left, .mw-diff-movedpara-right {\n text-decoration: none;\n }\n\n & > tr {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease;\n\n &:hover {\n & > td {\n /* Theme dependent */\n background: rgba(143, 163, 255, .12);\n }\n }\n\n &:not(.diff-addedline, .diff-deletedline) {\n & > td {\n /* Theme dependent */\n background: rgba(255, 255, 255, .02);\n }\n }\n\n .flash-highlight {\n animation: flash-highlight 1s ease-out infinite;\n }\n\n & > td {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease,\n color .25s ease;\n\n &:not(.diff-marker) {\n width: 50%;\n\n padding: 10px 14px;\n\n transition: background .25s ease;\n\n /* Theme dependent */\n color: rgba(200, 210, 230, 1);\n }\n\n &.diff-lineno {\n -webkit-user-select: none;\n user-select: none;\n\n border-bottom: 1px solid;\n\n padding: 10px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-align: center;\n letter-spacing: .6px;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .12),\n rgba(158, 115, 212, .08)\n );\n }\n\n &.diff-marker {\n -webkit-user-select: none;\n user-select: none;\n\n width: 40px;\n\n border-right: 1px solid;\n\n padding: 10px 8px;\n\n font-weight: 700;\n text-align: center;\n\n /* Theme dependent */\n border-right-color: rgba(143, 163, 255, .15);\n\n color: rgba(160, 170, 200, .9);\n\n background: linear-gradient(90deg,\n rgba(40, 45, 60, .3),\n rgba(35, 40, 52, .2)\n );\n\n &::before {\n content: attr(data-marker);\n }\n }\n\n &.diff-empty {\n /* Theme dependent */\n background: rgba(20, 25, 35, .3);\n }\n\n &:is(.diff-addedline, .diff-deletedline) {\n position: relative;\n\n border-left: 4px solid;\n\n transition: background .25s ease,\n border-left-color .25s ease,\n box-shadow .25s ease;\n\n &.diff-addedline {\n /* Theme dependent */\n border-left-color: rgba(76, 175, 80, .9);\n\n background: rgba(76, 175, 80, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(129, 199, 132, 1);\n background: rgba(129, 199, 132, .18);\n box-shadow: inset 0 0 12px rgba(76, 175, 80, .15);\n }\n }\n &.diff-deletedline {\n /* Theme dependent */\n border-left-color: rgba(244, 67, 54, .9);\n\n background: rgba(244, 67, 54, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(255, 112, 97, 1);\n background: rgba(255, 112, 97, .18);\n box-shadow: inset 0 0 12px rgba(244, 67, 54, .15);\n }\n }\n }\n\n & > div {\n & > :is(ins, del) {\n border-radius: 6px;\n padding: 2px 6px;\n\n font-weight: 600;\n text-decoration: none;\n\n transition: background .25s ease,\n transform .15s ease;\n }\n\n & > ins {\n /* Theme dependent */\n background: rgba(130, 169, 26, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(139, 195, 74, .6);\n\n transform: scale(1.08);\n }\n }\n & > del {\n /* Theme dependent */\n background: rgba(244, 67, 54, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 112, 97, .6);\n\n transform: scale(1.08);\n }\n }\n }\n\n a {\n text-decoration: none;\n\n /* Theme dependent */\n color: rgba(107, 163, 216, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n text-decoration: underline;\n }\n }\n }\n }\n }\n }\n }\n\n & > #pending-changes-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n\n position: fixed;\n left: 50%;\n bottom: 63px;\n z-index: 2;\n\n transform: translateX(-50%);\n\n &.hidden {\n display: none;\n }\n\n & > :is(.accept, .reject) {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n\n border-radius: 10px 10px 0 0;\n padding: 8px 12px;\n\n font-size: .95em;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease,\n border-color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.accept {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .14);\n box-shadow: 0 10px 26px rgba(46, 125, 50, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(46, 125, 50, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(46, 125, 50, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n &.reject {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .14);\n box-shadow: 0 10px 26px rgba(155, 40, 34, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(155, 40, 34, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(155, 40, 34, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n }\n }\n\n & > #progress-bar-container {\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-direction: column;\n\n position: absolute;\n top: 0px;\n bottom: 56px;\n right: 0px;\n\n padding: 0;\n\n overflow: hidden;\n\n & > .progress-bar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 180px;\n height: 32px;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 16px;\n margin-bottom: 10px;\n margin-right: 10px;\n\n overflow: hidden;\n\n font-size: .85em;\n font-weight: 400;\n\n opacity: 1;\n\n transition: width .3s ease,\n opacity .3s ease,\n border-color .3s ease,\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .1),\n rgba(158, 115, 212, .1)\n );\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.error {\n /* Theme dependent */\n border-color: rgba(239, 68, 68, .8);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .1),\n rgba(220, 38, 38, .1)\n );\n\n & > .progress-bar-overlay {\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .6),\n rgba(220, 38, 38, .6)\n );\n }\n }\n\n & > .progress-bar-overlay {\n width: 0;\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 16px;\n\n transition: width .4s cubic-bezier(.4, 0, .2, 1),\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .6),\n rgba(158, 115, 212, .6)\n );\n }\n\n & > .progress-bar-text {\n max-width: 100%;\n\n position: relative;\n\n padding: 0 12px;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .2);\n\n color: rgba(255, 255, 255, 1);\n }\n }\n }\n\n & > #bottom-tools {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n\n max-width: calc(100% - 20vmin);\n width: fit-content;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 8px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-radius: 16px;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .bottom-tool-item {\n position: relative;\n\n white-space: nowrap;\n\n transition: opacity .2s ease;\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n\n & > .bottom-tool-trigger {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease;\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.active {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n\n & > .bottom-tool-chevron {\n transform: rotate(180deg);\n }\n }\n\n & > .bottom-tool-chevron {\n font-size: .75em;\n\n transition: transform .2s ease;\n }\n }\n }\n\n & > .bottom-tool-action {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n }\n }\n\n & > #copy-link {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-details {\n width: 15vw;\n\n position: relative;\n\n border-left: 1px solid;\n\n /* Theme dependent */\n border-left-color: rgba(54, 62, 81, 1);\n\n & > #right-top {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n align-content: center;\n justify-content: center;\n\n width: 100%;\n height: 69px;\n\n border-bottom: 2px solid;\n border-left: 1px solid;\n border-bottom-left-radius: 8px;\n\n padding: 8px 15px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .tabs {\n display: flex;\n justify-content: center;\n width: 100%;\n\n & > .tab {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 2px solid;\n\n padding: 10px;\n\n opacity: .75;\n\n transition: background .35s cubic-bezier(.4, 0, .2, 1),\n opacity .35s cubic-bezier(.4, 0, .2, 1),\n box-shadow .35s cubic-bezier(.4, 0, .2, 1),\n border-color .35s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n &:hover, &:focus-visible {\n opacity: 1;\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 75, 162, .25)\n );\n }\n\n &.hidden {\n display: none;\n }\n\n &:first-child {\n border-radius: 10px 0 0 10px;\n }\n &:last-child {\n border-radius: 0 10px 10px 0;\n }\n }\n }\n\n & > .icons {\n display: flex;\n justify-content: center;\n width: 100%;\n\n font-size: 1.4em;\n\n & > .hidden {\n display: none;\n }\n }\n }\n\n & > .section {\n display: flex;\n flex-direction: column;\n height: calc(50% - calc(69px / 2) - 15px);\n\n margin: 10px 10px 0 10px;\n\n border: 1px solid;\n border-radius: 16px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n background: rgba(30, 35, 45, .8);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n\n padding: 14px 14px 12px;\n\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n background: rgba(30, 35, 45, .8);\n\n & > .title {\n font-weight: 600;\n font-size: .85em;\n text-transform: uppercase;\n letter-spacing: .07em;\n white-space: nowrap;\n\n & > i {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n\n margin-right: 4px;\n\n font-size: .9em;\n\n transition: transform .5s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n transform: rotate(180deg);\n }\n }\n }\n\n & > .pills {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n\n & > .pill {\n border: 1px solid;\n border-radius: 10px;\n padding: 4px 8px;\n\n font-size: .75em;\n font-weight: 500;\n\n white-space: nowrap;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(224, 228, 240, 1);\n background: rgba(140, 132, 255, .1);\n\n &.uw-1 {\n /* Theme dependent */\n border-color: rgba(107, 163, 216, .8);\n background: rgba(107, 163, 216, .1);\n color: rgba(107, 163, 216, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .8);\n background: rgba(143, 163, 255, .15);\n color: rgba(143, 163, 255, 1);\n }\n }\n &.uw-2 {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .8);\n background: rgba(255, 193, 7, .1);\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n color: rgba(255, 193, 7, 1);\n }\n }\n &.uw-3 {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, .8);\n background: rgba(255, 87, 34, .1);\n color: rgba(255, 87, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n background: rgba(255, 87, 34, .15);\n color: rgba(255, 87, 34, 1);\n }\n }\n &.uw-4 {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .8);\n background: rgba(244, 67, 54, .1);\n color: rgba(244, 67, 54, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, 1);\n background: rgba(244, 67, 54, .15);\n color: rgba(244, 67, 54, 1);\n }\n }\n &.uw-4im {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, .8);\n background: rgba(178, 34, 34, .1);\n color: rgba(178, 34, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, 1);\n background: rgba(178, 34, 34, .15);\n color: rgba(178, 34, 34, 1);\n }\n }\n\n &.ub {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, .8);\n background: rgba(255, 99, 132, .1);\n color: rgba(255, 99, 132, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, 1);\n background: rgba(255, 99, 132, .15);\n color: rgba(255, 99, 132, 1);\n }\n }\n }\n }\n }\n\n & > .queue-list {\n flex: 1;\n height: 100%;\n\n padding: 4px;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .3);\n }\n\n & > .footer {\n cursor: pointer;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n\n padding: 10px 14px;\n\n border-top: 1px solid;\n\n font-size: .85em;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(30, 35, 45, .8);\n border-top-color: rgba(143, 163, 255, .2);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n & > i {\n transform: translateX(3px);\n }\n }\n\n & > i {\n transition: transform .2s ease;\n }\n }\n }\n\n &:has(#user-contributions.hidden) {\n & > #page-history {\n height: calc(100% - 89px);\n }\n }\n &:has(#page-history.hidden) {\n & > #user-contributions {\n height: calc(100% - 89px);\n }\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n left: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > .height-adjust {\n touch-action: none;\n cursor: row-resize;\n\n height: 10px;\n width: 100%;\n\n position: absolute;\n left: 0;\n top: calc(50% - 5px);\n z-index: 3;\n }\n }\n }\n }\n }\n\n & > .bottom-tool-menu {\n display: none;\n max-width: calc(100vw - 40px);\n min-width: 200px;\n\n position: absolute;\n left: 0;\n bottom: calc(100% + 8px);\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n overflow-y: visible;\n\n animation: bottom-tool-menu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n }\n\n & > .menu-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border-radius: 8px;\n padding: 10px 12px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.hidden {\n display: none;\n }\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n\n & > i:first-child {\n opacity: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n opacity: 1;\n }\n }\n\n & > i:first-child {\n width: 18px;\n\n font-size: 1.1em;\n text-align: center;\n\n opacity: .8;\n\n transition: opacity .2s ease;\n }\n\n & > span {\n flex: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n margin-left: auto;\n\n font-size: .85em;\n\n opacity: .5;\n\n transition: opacity .2s ease;\n }\n\n & > .submenu {\n cursor: default;\n\n display: none;\n min-width: 240px;\n\n position: absolute;\n left: calc(100% + 4px);\n top: -6px;\n z-index: 4;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n color: var(--body-color);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n }\n\n & > .bottom-subcontent-title {\n border-bottom: 1px solid;\n\n margin-bottom: 12px;\n padding-bottom: 8px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n }\n\n & > .bottom-subcontent-input-title {\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > :is(select, input[type=\"text\"]) {\n width: 100%;\n\n font-size: .9em;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n\n & > .bottom-subcontent-button {\n --background: 123, 143, 245;\n\n display: block;\n width: 100%;\n\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n font-weight: 600;\n }\n }\n }\n\n &:is(#revert-menu, #warn-menu) {\n max-height: calc(100vh - 120px);\n\n overflow: hidden auto;\n\n & > .warning-menu {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 280px;\n\n position: relative;\n\n border-radius: 12px;\n padding: 8px;\n\n & > .warning-menu-no-items {\n text-align: center;\n padding: 20px;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n }\n\n & > .favorites-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 4px;\n\n & > .favorites-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .9);\n\n & > .icon {\n font-size: 1.1em;\n }\n }\n\n & > .favorites-container {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n }\n\n & > .favorites-separator {\n height: 1px;\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n }\n\n & > .favorites-section:not(:has(.warning-menu-item)) {\n display: none;\n\n & ~ .favorites-separator {\n display: none;\n }\n }\n\n & > .menu-option {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n color: rgba(224, 228, 240, 1);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .12);\n\n & > .icon {\n opacity: 1;\n transform: scale(1.1);\n }\n\n & > .submenu-arrow {\n opacity: 1;\n transform: translateX(2px);\n }\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .15);\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n opacity: .85;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > span:not(.icon):not(.submenu-arrow) {\n flex: 1;\n\n font-weight: 500;\n }\n\n & > .submenu-arrow {\n flex-shrink: 0;\n\n font-size: .8em;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n }\n }\n }\n\n & > .warning-submenu {\n display: none;\n max-width: calc(100vw - 60px);\n min-width: 420px;\n max-height: calc(100vh - 120px);\n\n position: absolute;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n overflow-y: auto;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(30, 33, 42, .98);\n -webkit-backdrop-filter: blur(25px);\n backdrop-filter: blur(25px);\n\n &.show {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n }\n\n .warning-menu-item {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n background: rgba(102, 126, 234, .12);\n }\n\n &.favorite-item {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n\n &.dragging {\n opacity: 0.5;\n transform: scale(0.95);\n }\n }\n\n & > .favorite-star {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border-radius: 4px;\n\n font-size: 1.2em;\n line-height: 1;\n\n transition: transform .2s cubic-bezier(.4, 0, .2, 1),\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .4);\n\n &:hover {\n transform: scale(1.2);\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .8);\n }\n\n &.favorited {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 152, 0, 1);\n }\n }\n\n &.spin {\n animation: star-spin 0.5s cubic-bezier(.4, 0, .2, 1);\n }\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > .warning-menu-title {\n flex: 1;\n\n font-size: .92em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 228, 240, 1);\n }\n\n & > .fa-circle-question {\n flex-shrink: 0;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .6);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .warning-menu-buttons {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n\n margin-left: 8px;\n }\n\n & > .warning-menu-buttons > .warning-menu-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 7px 14px;\n\n font-size: .82em;\n font-weight: 500;\n text-transform: capitalize;\n\n transition: border-color .2s ease,\n background .2s ease,\n color .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, .95);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .22);\n }\n\n &:active {\n transform: translateY(0);\n }\n\n &.warning-menu-no-warn-button {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .2);\n color: rgba(255, 193, 7, .95);\n background: rgba(255, 152, 0, .1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .4);\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 152, 0, .22);\n }\n }\n }\n }\n\n & > .levels-menu {\n display: none;\n min-width: 0px;\n\n position: fixed;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(28, 30, 38, .98);\n -webkit-backdrop-filter: blur(24px);\n backdrop-filter: blur(24px);\n\n &.show {\n display: flex;\n gap: 6px;\n }\n\n & > .levels-menu-item {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .95em;\n font-weight: 600;\n text-align: center;\n white-space: nowrap;\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n background: rgba(255, 255, 255, .05);\n border: 1px solid rgba(255, 255, 255, .1);\n\n &:hover {\n transform: translateY(-2px);\n background: rgba(255, 255, 255, .08);\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n\n &:active {\n transform: translateY(0);\n }\n }\n }\n\n .queue-list {\n overflow: hidden auto;\n\n &:is(#user-contributions-content, #page-history-content) {\n & > .queue-item {\n margin: 4px 0;\n }\n }\n\n & > .queue-empty {\n text-align: center;\n padding: 40px 20px;\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n }\n\n & > .historical-bar {\n height: 4px;\n width: 100%;\n\n position: relative;\n\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n\n & > .label {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n font-size: 1em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n\n & > .queue-item {\n cursor: pointer;\n\n display: flex;\n\n position: relative;\n\n border: 1px solid;\n border-radius: .75rem;\n\n margin: 4px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .4);\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n &:hover, &:focus-within {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 12px oklch(0 0 0 / 0.3);\n\n background: rgba(40, 43, 52, .6);\n }\n\n &.current {\n /* Theme dependent */\n border-color: linear-gradient(90deg,\n rgba(40, 43, 52, .4),\n rgba(40, 43, 82, .6)\n );\n box-shadow: 0 0 0 1px rgba(60, 63, 122, 1) inset;\n\n background: rgba(40, 43, 82, .6);\n\n & > .item-body {\n & > .item-tags {\n & > .tag {\n /* Theme dependent */\n color: rgba(145, 145, 165, 1);\n background: rgba(60, 63, 122, .4);\n border-color: rgba(60, 63, 122, .6);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .4);\n border-color: rgba(255, 193, 7, .6);\n }\n }\n }\n }\n }\n\n &.mentions-me {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 1) inset;\n\n background: rgba(40, 43, 52, .6);\n }\n\n & > .item-color {\n --ores-color: rgba(128, 128, 128, 1);\n\n flex-shrink: 0;\n width: 4px;\n\n position: relative;\n\n opacity: .85;\n\n /* Theme dependent */\n background: var(--ores-color);\n }\n\n & > .item-body {\n --ores-color: rgba(128, 128, 128, 1);\n --diff-color: rgba(128, 128, 128, 1);\n\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: .5rem;\n\n min-width: 0;\n\n padding: .75rem 1rem;\n\n & > .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: .75rem;\n\n & > .page-title {\n display: flex;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n font-size: clamp(.825rem, .85rem + .35vw, .95rem);\n font-weight: 600;\n\n word-wrap: break-word;\n word-break: break-word;\n\n line-height: 1.35;\n\n /* Theme dependent */\n color: rgba(205, 204, 202, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n }\n\n & > .timestamp {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 4px;\n\n min-width: 3ex;\n\n padding-top: 1px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n width: 100%;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 500;\n\n hyphens: auto;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n }\n\n & > .chips {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-grow: 1;\n gap: 4px;\n\n & > .ores-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--ores-color);\n background: color-mix(in srgb, var(--ores-color) 15%, transparent);\n }\n\n & > .diff-chips {\n display: flex;\n align-items: center;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: var(--diff-color);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .item-comment {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n overflow: hidden;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n font-style: italic;\n white-space: nowrap;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .item-tags {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .5rem;\n\n & > .tag {\n display: flex;\n align-items: center;\n gap: 2px;\n\n padding: 1px .5rem;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .7rem;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(135, 135, 135, 1);\n background: rgba(45, 44, 51, 1);\n border-color: rgba(38, 37, 35, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border-color: rgba(255, 193, 7, .4);\n }\n }\n }\n }\n\n & > .remove-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n\n position: absolute;\n right: 0px;\n bottom: 0px;\n\n border-top-left-radius: 8px;\n\n line-height: 1;\n\n transition: color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n background: rgba(255, 255, 255, 0);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 70, 0, 1);\n background: rgba(255, 70, 0, .15);\n }\n }\n }\n }\n\n .tooltip {\n min-width: 0;\n max-height: 80vh;\n\n position: fixed;\n left: 0;\n top: 0;\n z-index: calc(var(--max-z-index) - 3);\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 4px 6px;\n\n overflow-wrap: break-word;\n overflow: hidden auto;\n\n font-size: .95em;\n line-height: 1.45;\n word-wrap: break-word;\n white-space: normal;\n\n animation: tooltip-enter .1s ease-out forwards;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n box-shadow: 0 10px 30px rgba(6, 12, 24, .6),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n color: rgba(234, 240, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .03),\n rgba(255, 255, 255, .01)\n );\n -webkit-backdrop-filter: blur(14px) brightness(.7);\n backdrop-filter: blur(14px) brightness(.7);\n\n &:not(.buttons) {\n pointer-events: none;\n\n max-width: 460px;\n }\n\n &.buttons {\n display: flex;\n flex-direction: row;\n gap: 8px;\n\n z-index: calc(var(--max-z-index) - 2);\n\n white-space: nowrap;\n\n & > .button {\n cursor: pointer;\n\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 4px 8px;\n\n font-size: .95em;\n font-weight: 500;\n letter-spacing: .3px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .05);\n\n color: rgba(240, 245, 255, .92);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .08),\n rgba(255, 255, 255, .02)\n );\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .14),\n rgba(255, 255, 255, .06)\n );\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 1px 4px rgba(0, 0, 0, .3),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .tooltip-title {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-bottom: 1px solid;\n\n border-radius: 6px;\n margin-bottom: 12px;\n padding: 8px 10px;\n\n font-size: 1.04em;\n font-weight: 700;\n letter-spacing: .25px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .05);\n\n color: rgba(255, 255, 255, .92);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(0, 0, 0, .04)\n );\n -webkit-backdrop-filter: blur(6px);\n backdrop-filter: blur(6px);\n }\n\n & > .tooltip-item {\n display: flex;\n flex-direction: column;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 10px;\n margin: 10px 0;\n padding: 10px 12px;\n\n overflow: hidden;\n overflow-wrap: anywhere;\n\n word-wrap: break-word;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .075),\n rgba(0, 0, 0, .25)\n );\n\n &:is(.user-warnings, .user-blocks) {\n & > .tooltip-item-level {\n display: block;\n width: 100%;\n\n border-bottom: 1px solid;\n\n border-radius: 6px 6px 0 0;\n padding: 6px 10px;\n\n font-size: .95em;\n font-weight: 700;\n letter-spacing: .3px;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 120, .25);\n\n color: rgba(255, 255, 120, .95);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 120 .22),\n rgba(255, 255, 120, .08)\n );\n }\n\n & > .tooltip-item-details {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n\n & > :is(.tooltip-item-user, .tooltip-item-time) {\n font-size: .82em;\n font-weight: 400;\n\n opacity: .8;\n\n &.tooltip-item-user {\n /* Theme dependent */\n color: rgba(150, 210, 255, .9);\n }\n &.tooltip-item-time {\n /* Theme dependent */\n color: rgba(220, 225, 235, .9);\n\n & > span:not(:first-of-type) {\n margin-left: 1ex;\n }\n }\n }\n }\n }\n\n & > .tooltip-more {\n border-top: 1px solid;\n\n border-radius: 8px;\n margin-top: 14px;\n padding-top: 10px;\n\n font-size: .92em;\n font-style: italic;\n text-align: center;\n\n opacity: .95;\n\n /* Theme dependent */\n border-top-color: rgba(255, 255, 255, .04);\n\n color: rgba(240, 240, 255, .75);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .015),\n rgba(0, 0, 0, .03)\n );\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n }\n }\n }\n\n .confirmation-modal-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 6);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease-out;\n\n &.closing {\n animation: fade-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal {\n max-width: 500px;\n min-width: 400px;\n\n border: 1px solid;\n\n border-radius: 16px;\n\n word-wrap: break-word;\n\n animation: scale-in .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .7),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: rgba(41, 47, 60, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.closing {\n animation: scale-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal-header {\n border-bottom: 1px solid;\n\n padding: 20px 24px;\n\n /* Theme dependent */\n border-bottom-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-title {\n font-size: 1.2em;\n font-weight: 700;\n }\n }\n\n & > .confirmation-modal-body {\n max-height: 70vh;\n\n padding: 24px;\n\n line-height: 1.5;\n\n overflow: hidden auto;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n\n & > .confirmation-modal-username {\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(91, 154, 255, 1);\n }\n\n & > .confirmation-modal-input {\n width: 100%;\n\n border: 1px solid;\n border-radius: 4px;\n\n margin-top: 10px;\n padding: 8px;\n\n /* Theme dependent */\n color: white;\n border-color: rgba(255, 255, 255, .2);\n background: rgba(0, 0, 0, .3);\n }\n }\n\n & > .confirmation-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n\n border-top: 1px solid;\n\n padding: 16px 24px;\n\n /* Theme dependent */\n border-top-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-footer-right {\n display: flex;\n gap: 12px;\n }\n\n &.confirmation-modal-footer-vertical {\n flex-direction: column;\n align-items: stretch;\n\n & > .confirmation-modal-button {\n width: 100%;\n }\n }\n }\n\n .confirmation-modal-button {\n font-size: .95em;\n font-weight: 500;\n }\n }\n }\n\n .notification-panel {\n pointer-events: none;\n\n display: flex;\n flex-direction: column;\n width: 480px;\n max-height: 600px;\n\n position: absolute;\n left: 15px;\n top: 55px;\n z-index: calc(var(--max-z-index) - 9);\n\n border: 1px solid;\n border-radius: 18px;\n\n overflow: hidden;\n\n opacity: 0;\n\n transform: translateY(-20px) scale(.95);\n\n transition: opacity .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 20px 60px rgba(0, 0, 0, .8),\n 0 0 0 1px rgba(255, 255, 255, .08),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n\n background: rgba(25, 27, 36, .96);\n -webkit-backdrop-filter: blur(25px) brightness(0.95);\n backdrop-filter: blur(25px) brightness(0.95);\n\n a {\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(160, 195, 255, 1);\n }\n\n &:visited {\n /* Theme dependent */\n color: rgba(150, 185, 255, 1);\n }\n }\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n\n & > .notification-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border-bottom: 1px solid;\n\n padding: 18px 22px;\n\n font-size: 1.12em;\n font-weight: 700;\n letter-spacing: 0.3px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .08);\n\n color: rgba(245, 245, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(120, 145, 255, .12),\n rgba(140, 100, 200, .08)\n );\n\n & > .mark-all-read {\n cursor: pointer;\n\n font-size: 0.78em;\n font-weight: 500;\n letter-spacing: 0.2px;\n\n padding: 6px 12px;\n border-radius: 6px;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n background: rgba(120, 170, 255, .08);\n\n &:hover {\n /* Theme dependent */\n background: rgba(120, 170, 255, .15);\n color: rgba(160, 200, 255, 1);\n }\n\n &:active {\n opacity: .85;\n }\n }\n }\n\n & > .notification-list {\n max-height: 520px;\n\n overflow: hidden auto;\n\n padding: 8px;\n\n & > .notifications-empty {\n padding: 40px 20px;\n\n text-align: center;\n\n font-size: 0.95em;\n\n /* Theme dependent */\n color: rgba(120, 125, 145, 1);\n\n & strong {\n /* Theme dependent */\n color: rgba(150, 155, 175, 1);\n }\n }\n\n & > .notification {\n cursor: pointer;\n\n display: flex;\n align-items: flex-start;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 18px;\n margin-bottom: 8px;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(50, 55, 75, .4),\n rgba(40, 45, 65, .3)\n );\n\n &:hover {\n opacity: 1;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .3);\n box-shadow: 0 8px 24px rgba(120, 170, 255, .15),\n inset 0 1px 0 rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(80, 100, 160, .15),\n rgba(70, 85, 145, .1)\n );\n\n transform: translateY(-2px);\n }\n\n &.unread {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .5);\n box-shadow: 0 0 20px rgba(120, 170, 255, .2),\n inset 0 1px 0 rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(120, 170, 255, .1),\n rgba(100, 145, 255, .05)\n );\n }\n\n &.read {\n opacity: .72;\n\n border-color: rgba(255, 255, 255, .04);\n }\n\n & > .notification-icon {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n\n border-radius: 10px;\n\n overflow: hidden;\n\n background: rgba(60, 75, 120, .5);\n\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n & > .notification-content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 5px;\n\n & > .notification-header {\n margin: 0;\n\n font-size: .95rem;\n font-weight: 600;\n letter-spacing: 0.2px;\n\n /* Theme dependent */\n color: rgba(235, 240, 255, 1);\n }\n\n & > .notification-body {\n font-size: .82rem;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 180, 205, 1);\n }\n\n & > .notification-links {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n\n margin-top: 6px;\n\n & > a {\n border: none;\n\n padding: 4px 8px;\n border-radius: 5px;\n\n font-size: .8rem;\n font-weight: 500;\n text-decoration: none;\n\n background: rgba(120, 170, 255, .12);\n opacity: 1;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n color: rgba(140, 185, 255, 1);\n\n &:hover {\n opacity: 1;\n\n background: rgba(120, 170, 255, .22);\n\n /* Theme dependent */\n color: rgba(180, 210, 255, 1);\n }\n\n &:active {\n opacity: .85;\n\n transform: scale(0.98);\n }\n }\n }\n }\n\n & > .notification-right {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n gap: 10px;\n\n & > .notification-unread-indicator {\n cursor: pointer;\n\n width: 12px;\n height: 12px;\n\n border-radius: 50%;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n background: rgba(120, 170, 255, 1);\n box-shadow: 0 0 8px rgba(120, 170, 255, .5);\n\n &:hover, &:focus {\n transform: scale(1.35);\n\n /* Theme dependent */\n box-shadow: 0 0 16px rgba(120, 170, 255, .8);\n }\n }\n\n & > .notification-timestamp {\n font-size: .72rem;\n font-weight: 500;\n\n opacity: .8;\n\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(140, 150, 175, 1);\n }\n }\n }\n }\n }\n\n .icon-count {\n --color: 255, 255, 255;\n --background: 255, 255, 255;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n\n position: absolute;\n right: -11px;\n top: -11px;\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 50%;\n padding: 0 8px;\n\n font-family: sans-serif;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n\n transition: transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(var(--background), .3);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(var(--background), .15);\n\n color: rgba(--color, 1);\n text-shadow: 0 1px 0 rgba(0, 0, 0, .35);\n\n background: linear-gradient(135deg,\n rgba(var(--background), .7),\n rgba(var(--background), .5)\n );\n -webkit-backdrop-filter: blur(6px) brightness(0%);\n backdrop-filter: blur(6px) brightness(0%);\n\n &.red {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 255, 60, 60;\n }\n &.green {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 205, 80;\n }\n &.blue {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 120, 255;\n }\n &.yellow {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 215, 60;\n }\n &.orange {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 165, 60;\n }\n &:is(.gray, .grey) {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 150, 150, 150;\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n transform: scale(0);\n }\n }\n\n .toast-alert {\n display: flex;\n align-items: center;\n gap: 14px;\n max-width: 500px;\n min-width: 320px;\n\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: calc(var(--max-z-index) - 4);\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 20px;\n\n opacity: 0;\n\n transform: translateX(100%) scale(.8);\n\n animation: toast-alert-enter .5s cubic-bezier(.68, -.55, .265, 1.55);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 12px 40px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(25px) saturate(180%);\n backdrop-filter: blur(25px) saturate(180%);\n\n &.success {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(76, 175, 80, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .25)\n );\n }\n &.warning {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(255, 152, 0, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 152, 0, .25),\n rgba(245, 124, 0, .25)\n );\n }\n &.error {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(244, 67, 54, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .25)\n );\n }\n &.dev {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(156, 39, 176, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(156, 39, 176, .25),\n rgba(123, 31, 162, .25)\n );\n }\n\n &.show {\n opacity: 1;\n\n transform: translateX(0) scale(1);\n }\n\n &.hidden {\n animation: toast-alert-leave .4s cubic-bezier(.6, -.28, .735, .045) forwards;\n }\n\n & > .toast-icon {\n flex-shrink: 0;\n\n font-size: 1.8em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .3));\n }\n\n & > .toast-content {\n flex: 1;\n\n & > .toast-title {\n margin-bottom: 4px;\n\n font-size: 1.05em;\n font-weight: 700;\n letter-spacing: .3px;\n }\n\n & > .toast-message {\n font-size: .9em;\n line-height: 1.4;\n\n opacity: .95;\n }\n }\n\n & > .toast-close {\n cursor: pointer;\n\n flex-shrink: 0;\n\n border-radius: 6px;\n padding: 4px;\n\n font-size: 1.3em;\n\n background: transparent;\n opacity: .8;\n\n transition: opacity .2s ease,\n transform .2s ease,\n background .2s ease;\n\n &:hover {\n opacity: 1;\n\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n }\n }\n\n .minor-indicator {\n border: 1px solid;\n\n border-radius: 4px;\n margin-right: 4px;\n padding: 0 4px;\n\n font-size: .9em;\n font-weight: 700;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(153, 153, 153, 1);\n\n background: rgba(60, 64, 76, .9);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n .menu-divider {\n height: 1px;\n\n margin: 6px 8px;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n\n .profanity {\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n margin: 20px;\n padding: 20px;\n\n border-radius: 12px;\n border: 1px solid;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .8);\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .3);\n\n & > .profanity-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n\n padding-bottom: 16px;\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n\n & > .profanity-score {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n & > .score-label {\n font-size: .85em;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n }\n\n & > .score-value {\n font-size: 2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(255, 200, 100, 1);\n }\n }\n\n & > .profanity-risk {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 16px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n background: rgba(60, 64, 76, .6);\n\n &.risk-high {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n background: rgba(211, 47, 47, .2);\n border: 1px solid rgba(211, 47, 47, .4);\n }\n\n &.risk-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border: 1px solid rgba(255, 193, 7, .3);\n }\n\n &.risk-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n background: rgba(66, 165, 245, .15);\n border: 1px solid rgba(66, 165, 245, .3);\n }\n }\n }\n\n & > .profanity-matches-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .profanity-matches-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n & > .profanity-match {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n border-radius: 8px;\n padding: 12px 14px;\n border-left: 3px solid;\n\n transition: background .2s ease,\n border-color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n background: rgba(45, 50, 62, .7);\n border-left-color: rgba(255, 150, 150, .5);\n\n &:hover {\n transform: translateX(4px);\n\n /* Theme dependent */\n background: rgba(50, 56, 70, .85);\n border-left-color: rgba(255, 150, 150, .8);\n }\n\n & > .match-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: .95em;\n\n & > .match-text {\n font-family: 'Courier New', monospace;\n font-weight: 600;\n\n border-radius: 4px;\n padding: 4px 8px;\n\n /* Theme dependent */\n color: rgba(255, 180, 180, 1);\n background: rgba(211, 47, 47, .2);\n }\n\n & > .match-arrow {\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .match-name {\n font-family: 'Courier New', monospace;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n }\n\n & > .match-details {\n display: flex;\n gap: 16px;\n\n & > .match-stat {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n & > .stat-label {\n font-size: .75em;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .stat-value {\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n &.severity-critical {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n }\n &.severity-high {\n /* Theme dependent */\n color: rgba(255, 150, 100, 1);\n }\n\n &.severity-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n &.severity-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n }\n }\n }\n }\n\n & > .match-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n margin-top: 6px;\n padding: 10px 12px;\n border-radius: 6px;\n\n font-size: .85em;\n line-height: 1.5;\n\n /* Theme dependent */\n background: rgba(30, 33, 43, .6);\n border: 1px solid rgba(100, 150, 255, .2);\n\n & > .fa {\n margin-top: 2px;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(100, 150, 255, .8);\n }\n\n & > .note-text {\n flex: 1;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n }\n }\n }\n\n & > .profanity-no-matches {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n padding: 20px;\n\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(100, 200, 100, 1);\n }\n }\n\n & > #settings-container {\n z-index: calc(var(--max-z-index) - 7);\n\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n\n opacity: 0;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n\n & > .settings {\n transform: scale(1);\n }\n }\n\n & > .settings {\n display: flex;\n max-width: 1100px;\n width: 90vw;\n\n border: 1px solid;\n\n border-radius: 20px;\n\n overflow: hidden;\n\n transform: scale(.75);\n\n transition: transform .1s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(30, 33, 42, .95);\n -webkit-backdrop-filter: blur(30px);\n backdrop-filter: blur(30px);\n\n & > div {\n height: 80vh;\n\n &.settings-left {\n width: 250px;\n\n border-right: 1px solid;\n\n padding: 20px 0;\n\n overflow-y: auto;\n\n /* Theme dependent */\n border-right-color: rgba(255, 255, 255, .1);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(255, 255, 255, .05)\n );\n\n & > .settings-category {\n &:not(:last-child) {\n margin-bottom: 20px;\n }\n\n & > .settings-category-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n margin-bottom: 4px;\n padding: 12px 20px;\n\n font-size: .7em;\n font-weight: 800;\n letter-spacing: 1.5px;\n text-transform: uppercase;\n }\n\n & > .settings-left-menu-compact {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n padding: 0 12px;\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 10px;\n padding: 12px;\n\n font-size: 1.2em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:first-child {\n margin-left: 12px;\n }\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n }\n }\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n border-radius: 10px;\n margin: 2px 12px;\n padding: 12px 20px;\n\n font-size: .95em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n & > span > i {\n height: 1em;\n aspect-ratio: 1 / 1;\n\n margin-right: 12px;\n\n text-align: center;\n }\n }\n }\n }\n\n &.settings-right {\n flex: 1;\n\n padding: 20px 30px;\n\n overflow-y: auto;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .5);\n\n & > .hidden {\n display: none;\n }\n\n a {\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n color: rgba(176, 192, 255, 1);\n }\n }\n\n pre, code {\n border-radius: 4px;\n padding: 2px 4px;\n\n font-size: .95em;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n\n .settings-compact-grid {\n & > .compact {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n & > .numeric-input-container {\n & > .numeric-input {\n width: calc(100% - 70px);\n }\n }\n\n & > select {\n width: 100%;\n }\n }\n }\n\n .settings-section, .settings-toggles-section {\n display: block;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 25px;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n\n background: rgba(35, 38, 48, .8);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n .settings-section-title {\n margin-bottom: 5px;\n\n font-size: 1em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n &.collapse-title {\n margin-bottom: 0;\n }\n }\n\n .settings-section-desc {\n margin-bottom: 0;\n\n font-size: .85em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .pad-list {\n margin: 8px 0;\n padding-left: 20px;\n }\n\n &:not(:last-child) {\n margin-bottom: 30px;\n }\n\n &.compact {\n margin-bottom: 0;\n padding: 18px;\n\n & > .settings-section-title {\n font-size: 1.05em;\n\n &.collapse-title {\n margin-bottom: 15px;\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 12px;\n\n font-size: .85em;\n }\n }\n\n &.inline {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .6);\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .settings-section-content {\n flex: 1;\n }\n }\n\n &.collapsed {\n & > .collapse-title::after {\n transform: rotate(-180deg);\n }\n }\n\n & > .collapse-title {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n &::after{\n content: \"\\f077\";\n\n float: right;\n\n font-family: \"Font Awesome 6 Free\";\n font-weight: 900;\n\n transition: transform .2s ease;\n }\n }\n\n & > .collapsible-content {\n padding: initial;\n\n overflow: hidden;\n\n transition: padding .2s ease;\n\n &.collapsed {\n padding: 0;\n }\n }\n\n & > .settings-section-title {\n margin-bottom: 15px;\n\n font-size: 1.4em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 8px;\n }\n }\n\n & > .settings-section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n\n margin-bottom: 15px;\n\n font-size: 1.2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 0;\n }\n\n & > .settings-section-header-icon {\n font-size: 1.3em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .2));\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 20px;\n\n font-size: .95em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .checkbox-container {\n display: flex;\n flex-wrap: wrap;\n\n & > div {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 200px;\n\n margin-bottom: 8px;\n\n &:hover {\n & > .checkbox-box {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .checkbox-box {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: block;\n\n position: relative;\n\n border-radius: 5px;\n\n font-size: .95em;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(213, 213, 213, 1);\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n position: absolute;\n width: 0;\n height: 0;\n\n border-radius: 5px;\n\n opacity: 0;\n\n &:checked ~ .checkmark {\n /* Theme dependent */\n background: linear-gradient(45deg,\n rgba(100, 61, 219, 1),\n rgba(217, 21, 239, 1)\n );\n\n &::after {\n opacity: 1;\n }\n }\n }\n\n & > .checkmark {\n width: 1.3em;\n height: 1.3em;\n\n position: relative;\n left: 0;\n top: 0;\n\n border-radius: 5px;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(204, 204, 204, 1);\n\n &::after {\n content: \"\";\n\n width: .25em;\n height: .5em;\n\n position: absolute;\n left: .45em;\n top: .25em;\n\n border-width: 0 .15em .15em 0;\n border-style: solid;\n\n opacity: 0;\n\n transform: rotate(45deg);\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, 1);\n }\n }\n }\n }\n }\n\n .numeric-input-container {\n display: flex;\n\n & > .numeric-input-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n width: 35px;\n height: 35px;\n\n border: 1px solid;\n\n border-radius: 8px;\n\n font-size: 1.3em;\n\n transition: background .2s ease,\n border-color .2s ease,\n color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .8);\n\n &:hover {\n transform: scale(1.05);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n }\n\n & > .numeric-input {\n width: 100px;\n\n border-radius: 8px;\n margin: 0 5px;\n padding: 6px 12px;\n\n font-size: 1.1em;\n }\n }\n\n .volume-control {\n display: block;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 20px 0;\n padding: 20px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .volume-control-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n\n margin-bottom: 16px;\n\n & > .volume-control-info {\n flex: 1;\n\n & > .volume-control-title {\n margin-bottom: 6px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .volume-control-desc {\n font-size: .9em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .volume-control-preview {\n --background: 123, 143, 245;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 18px;\n\n font-size: .9em;\n font-weight: 500;\n }\n }\n\n & > .volume-control-slider-container {\n display: flex;\n align-items: center;\n gap: 16px;\n\n & > .volume-control-slider {\n flex: 1;\n height: 6px;\n\n outline: none;\n\n border-radius: 3px;\n\n -webkit-appearance: none;\n appearance: none;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n\n &::-webkit-slider-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n\n &::-moz-range-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border: none;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n }\n\n & > .volume-control-input {\n width: 70px;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-size: .95em;\n text-align: center;\n }\n }\n }\n\n .settings-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 60px;\n height: 32px;\n\n position: relative;\n\n &:hover {\n & > .toggle-switch {\n transform: scale(1.02);\n }\n }\n\n &.active {\n & > .toggle-switch {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n & > .toggle-slider {\n left: 30px;\n\n /* Theme dependent */\n box-shadow: 0 4px 10px rgba(0, 0, 0, .3),\n 0 2px 4px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .toggle-switch {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n border: 2px solid;\n\n border-radius: 16px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n\n & > .toggle-slider {\n width: 24px;\n height: 24px;\n\n position: absolute;\n left: 2px;\n top: 2px;\n\n border-radius: 50%;\n\n transition: left .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n 0 1px 2px rgba(0, 0, 0, .15);\n\n background: rgba(255, 255, 255, 1);\n }\n }\n }\n\n .settings-radio-group {\n display: flex;\n flex-direction: row;\n gap: 12px;\n\n border-radius: 100vh;\n padding: 8px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-radio-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n flex: 1;\n\n text-align: center;\n\n border-radius: 100vh;\n padding: 10px 16px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 1);\n }\n\n &.selected {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n color: rgba(224, 224, 224, 1);\n }\n }\n }\n\n .settings-slider {\n display: flex;\n flex-direction: column;\n gap: 14px;\n\n border-radius: 14px;\n padding: 16px 20px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-slider-labels {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n & > .settings-slider-labels > .settings-slider-label-left,\n & > .settings-slider-labels > .settings-slider-label-right {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &.active {\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .percent {\n font-size: .85em;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n }\n\n & > .settings-slider-labels > .settings-slider-label-right {\n text-align: right;\n }\n\n & > .settings-slider-track {\n cursor: pointer;\n\n height: 8px;\n\n position: relative;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n &::before {\n content: '';\n\n width: var(--fill, 50%);\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .6),\n rgba(118, 75, 162, .6)\n );\n }\n\n & > .settings-slider-thumb {\n cursor: grab;\n\n width: 22px;\n height: 22px;\n\n position: absolute;\n top: 50%;\n\n border: 2px solid;\n\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n transition: transform .15s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .4),\n 0 0 12px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: translate(-50%, -50%) scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 12px rgba(0, 0, 0, .5),\n 0 0 20px rgba(102, 126, 234, .5);\n }\n\n &:active, &.dragging {\n cursor: grabbing;\n\n transform: translate(-50%, -50%) scale(1.2);\n\n /* Theme dependent */\n box-shadow: 0 4px 16px rgba(0, 0, 0, .5),\n 0 0 24px rgba(102, 126, 234, .6);\n }\n }\n }\n }\n\n .palette-selector {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n\n margin-top: 20px;\n\n & > .palette-option {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 12px;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 20px rgba(20, 20, 30, .4);\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4);\n }\n\n & > .palette-name {\n pointer-events: none;\n\n font-size: .9em;\n font-weight: 600;\n text-align: center;\n }\n\n & > .palette-preview {\n pointer-events: none;\n\n display: flex;\n gap: 4px;\n height: 40px;\n\n border-radius: 8px;\n margin-bottom: 12px;\n\n overflow: hidden;\n\n & > canvas {\n flex: 1;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .tracklist {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n\n & > .track {\n position: relative;\n\n border-radius: 8px;\n\n overflow: hidden;\n\n & > .thumbnail {\n display: block;\n width: 100%;\n aspect-ratio: 1 / 1;\n\n overflow: hidden;\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n\n overflow: hidden;\n }\n }\n\n & > .info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n\n padding: 10px 12px;\n\n /* Theme dependent */\n background: linear-gradient(180deg,\n rgba(0, 0, 0, 0),\n rgba(0, 0, 0, .35),\n rgba(0, 0, 0, .65)\n );\n\n & > .title {\n font-size: .95em;\n font-weight: 600;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n\n color: rgba(255, 255, 255, 1);\n }\n\n & > :is(.artist, .length) {\n font-size: .8em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n }\n }\n\n & > .preview-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0;\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n top: 8px;\n\n border-radius: 50%;\n padding: 0;\n }\n }\n }\n\n .control-container {\n border: 1px solid;\n\n border-radius: 12px;\n margin-bottom: 15px;\n padding: 18px 22px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .control-container-title {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.margin-top {\n margin-top: 10px;\n }\n }\n\n & > .control-keys {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n & > div {\n display: flex;\n align-items: center;\n width: max-content;\n\n border: 1px solid;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-weight: 500;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .3);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .9);\n\n &:not(.key-select):hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(60, 64, 78, .95);\n }\n\n &.key-select {\n border: 2px dashed;\n\n font-style: italic;\n\n /* Theme dependent */\n border-color: rgba(192, 192, 192, .6);\n box-shadow: 0 0 10px rgba(192, 192, 192, .4);\n\n background: rgba(192, 192, 192, .1);\n }\n\n &.duplicate {\n border: 2px dashed;\n\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n box-shadow: 0 0 10px rgba(255, 87, 34, .5);\n\n background: rgba(255, 87, 34, .1);\n }\n\n & > .key-elem-title {\n margin-right: 10px;\n }\n\n &.add, & > .remove {\n cursor: pointer;\n }\n }\n }\n\n & > .control-actions {\n .control-action {\n border-left: 2px solid;\n\n margin-top: 12px;\n padding-left: 16px;\n\n /* Theme dependent */\n border-left-color: rgba(102, 126, 234, .5);\n\n & > .control-action-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n margin-bottom: 8px;\n\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n span {\n margin-right: 5px;\n }\n\n & > .control-action-title-left {\n white-space: nowrap;\n\n overflow-x: auto;\n\n & > span {\n width: 17px;\n }\n\n & > select {\n border-radius: 6px;\n margin: 0 5px;\n padding: 6px 10px;\n }\n\n & > .params {\n font-size: .85em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n & > .condition-parameter {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n margin: 0 4px;\n\n & > select,\n & > input:not([type=checkbox]) {\n border-radius: 6px;\n padding: 6px 10px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n }\n }\n }\n\n & > .control-action-title-right {\n display: flex;\n\n & > span {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display:flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n\n border-radius: 5px;\n margin-right: 0;\n\n font-size: 1.2em;\n\n transition: background .1s ease;\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n }\n }\n }\n\n & > .action-parameter {\n border: 1px solid;\n\n border-radius: 8px;\n margin-top: 10px;\n padding: 12px 14px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .3);\n\n & > .parameter-title {\n margin-bottom: 8px;\n\n font-size: .9em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n\n & > select,\n & > input:not([type=checkbox]),\n & > duration-input {\n width: 100%;\n\n border-radius: 6px;\n padding: 8px 12px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 20px;\n height: 20px;\n }\n }\n }\n\n & > .control-bottom-container {\n display: flex;\n justify-content: space-between;\n\n margin-top: 10px;\n\n & > div {\n display: flex;\n\n & > .add-action-button {\n width: max-content;\n\n border-radius: 8px;\n padding: 8px 16px;\n\n font-weight: 500;\n }\n }\n }\n }\n }\n\n .text-input-container {\n display: flex;\n gap: 12px;\n\n border-style: 2px dashed;\n\n border-radius: 12px;\n margin-top: 18px;\n padding: 16px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .35);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 0.15),\n rgba(118, 75, 162, 0.15)\n );\n\n & > input[type=\"text\"] {\n flex: 1;\n\n border-style: dashed;\n\n border-radius: 10px;\n padding: 10px 16px;\n\n font-size: .95em;\n\n &:focus {\n border-style: solid;\n }\n }\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n\n margin-top: 20px;\n\n & > .stat-card {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n width: 100%;\n height: 150px;\n\n background-color: transparent;\n\n perspective: 1000px;\n\n transition: transform .3s ease;\n\n &:hover, &:active {\n transform: scale(1.05);\n\n & > .inside {\n transform: rotateY(180deg);\n\n &::before {\n opacity: 1;\n }\n }\n }\n\n & > .inside {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n transform-style: preserve-3d;\n\n transition: transform 0.8s linear(\n 0, 0.005, 0.02 2.2%, 0.046 4.5%, 0.182 11.5%,\n 0.318 16.3%, 0.459 20.6%, 0.601 24.6%, 0.738 28.6%,\n 0.863 32.7%, 0.954 37%, 1.015 41.8%, 1.049 47.4%,\n 1.059, 1.047 57.3%, 1.03 63.5%, 1.012 70.9%,\n 1.002 79.5%, 1\n );\n\n &::before {\n inset: -2px;\n\n border-radius: 14px;\n padding: 2px;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n }\n\n & > :is(.front, .back) {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n position: absolute;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n text-align: center;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .25);\n\n &.front {\n justify-content: center;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .15),\n rgba(118, 75, 162, .15)\n );\n }\n &.back {\n transform: rotateY(180deg);\n\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(118, 75, 162, .15),\n rgba(102, 126, 234, .15)\n );\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 4px;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .4);\n }\n &::-webkit-scrollbar-track {\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n }\n\n & > .stat-value {\n margin-bottom: 8px;\n\n font-size: 2.2em;\n font-weight: 700;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n /* Theme independent */\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .stat-label {\n margin-bottom: 4px;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .stat-sublabel {\n font-size: .8em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n &:not(:last-child) {\n margin-bottom: 8px;\n }\n }\n }\n }\n }\n }\n\n .changelog-content {\n & > .changelog-header {\n border-bottom: 2px solid;\n\n padding-bottom: 24px;\n margin-bottom: 8px;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n & > h1 {\n margin: 0 0 10px 0;\n\n font-size: 2.5em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n\n & > i {\n margin-right: 12px;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > .changelog-subtitle {\n margin: 0 0 20px 0;\n\n font-size: 1.1em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .9);\n }\n\n & > .changelog-nav {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n gap: 8px;\n\n & > .changelog-nav-item {\n cursor: pointer;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 6px 16px;\n\n font-size: .85em;\n font-weight: 600;\n text-decoration: none;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(200, 200, 200, .9);\n background: rgba(102, 126, 234, .08);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n color: rgba(255, 255, 255, 1);\n background: rgba(102, 126, 234, .2);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .3),\n rgba(118, 168, 255, .3)\n );\n box-shadow: 0 0 12px rgba(102, 126, 234, .3);\n }\n }\n }\n }\n\n & > .changelog-divider {\n height: 2px;\n\n margin: 48px auto 8px;\n\n border-radius: 1px;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(102, 126, 234, .4) 20%,\n rgba(118, 168, 255, .4) 50%,\n rgba(102, 126, 234, .4) 80%,\n transparent\n );\n }\n\n & > .changelog-version {\n margin-top: 32px;\n padding: 24px;\n\n border: 1px solid;\n border-radius: 16px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(30, 33, 42, .4);\n\n & > .changelog-version-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n\n border-bottom: 1px solid;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n & > .version-badge-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n margin-bottom: 12px;\n\n & > .version-badge {\n display: inline-block;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 4px 16px;\n\n font-size: .8em;\n font-weight: 700;\n font-family: 'Courier New', monospace;\n letter-spacing: .5px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(118, 168, 255, 1);\n background: rgba(102, 126, 234, .12);\n }\n\n & > .version-tag {\n display: inline-block;\n\n border-radius: 20px;\n padding: 4px 12px;\n\n font-size: .7em;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 1px;\n\n &.latest {\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .4);\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 1.6em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .changelog-version-subtitle {\n margin: 0;\n\n font-size: .9em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .7);\n\n & > i {\n margin-right: 4px;\n }\n }\n }\n\n & > .changelog-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: 24px;\n\n margin: 0 auto;\n padding: 0;\n\n & > .card {\n position: relative;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n overflow: hidden;\n\n transition: border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n background: rgba(40, 43, 52, .6);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &::before {\n content: '';\n\n height: 3px;\n\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n }\n\n &:hover {\n transform: translateY(-4px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5),\n 0 0 0 1px rgba(102, 126, 234, .2);\n\n background: rgba(40, 43, 52, .85);\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n transform: scale(1.1) rotate(5deg);\n }\n }\n\n &.featured {\n grid-column: 1 / -1;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: linear-gradient(135deg,\n rgba(40, 43, 52, .8),\n rgba(50, 53, 62, .8)\n );\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 168, 255, .25)\n );\n }\n }\n\n & > .card-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n\n border-radius: 12px;\n margin-bottom: 16px;\n\n transition: transform .3s ease;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n\n & > i {\n font-size: 24px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 168, 255, 1)\n );\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > h2 {\n margin: 0 0 12px 0;\n\n font-size: 1.35em;\n font-weight: 700;\n letter-spacing: -0.02em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .95);\n }\n\n & > p {\n margin: 0 0 16px 0;\n\n font-size: .95em;\n line-height: 1.6em;\n\n /* Theme dependent */\n color: rgba(118, 168, 255, .9);\n }\n\n & > ul {\n margin: 0;\n padding-left: 24px;\n\n font-size: .9em;\n line-height: 1.7em;\n\n /* Theme dependent */\n color: rgba(229, 229, 229, .9);\n\n & > li {\n margin-bottom: 8px;\n padding-left: 4px;\n\n &::marker {\n /* Theme dependent */\n color: rgba(102, 126, 234, .8);\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n & > strong {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n }\n\n & > code {\n border-radius: 4px;\n padding: 2px 6px;\n\n font-family: 'Courier New', monospace;\n font-size: .9em;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n color: rgba(118, 168, 255, 1);\n }\n\n & > ul {\n margin-top: 6px;\n padding-left: 20px;\n\n & > li {\n font-size: .95em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .85);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .about-content {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 0;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .25);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(30, 33, 42, .95),\n rgba(25, 28, 36, .9)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & > .about-version {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n\n padding: 32px;\n\n font-size: 1.3em;\n font-weight: 700;\n letter-spacing: .5px;\n\n /* Theme dependent */\n box-shadow: 0 4px 20px rgba(143, 163, 255, .25),\n inset 0 1px 0 rgba(255, 255, 255, .15),\n inset 0 -1px 0 rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .25),\n rgba(118, 75, 162, .2)\n );\n\n & > .fa {\n font-size: 1.5em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n filter: drop-shadow(0 2px 8px rgba(143, 163, 255, .6));\n }\n }\n\n & > .about-tagline {\n padding: 24px 32px;\n\n text-align: center;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 255, .08);\n\n & > p {\n margin: 0;\n\n font-size: 1.05em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(180, 185, 200, 1);\n }\n }\n\n & > .about-links {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n padding: 16px;\n\n & > .link-card {\n display: flex;\n align-items: center;\n gap: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n margin-bottom: 12px;\n padding: 16px 20px;\n\n text-decoration: none;\n\n transition:\n border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease,\n border-left-color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n border-left: 3px solid rgba(143, 163, 255, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .6) 40%\n );\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &:hover {\n transform: translateX(6px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .5);\n border-left-color: rgba(143, 163, 255, .8);\n box-shadow: 0 6px 24px rgba(143, 163, 255, .2),\n 0 2px 12px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .15),\n rgba(118, 75, 162, .08) 50%\n );\n\n & > .link-card-icon {\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .25);\n }\n\n & > .link-card-arrow {\n transform: translateX(4px);\n\n opacity: 1;\n }\n }\n\n & > .link-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n\n border-radius: 10px;\n\n font-size: 1.3em;\n\n transition:\n transform .3s ease,\n background .3s ease;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .15);\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .link-card-content {\n flex: 1;\n text-align: left;\n\n & > .link-card-title {\n margin-bottom: 4px;\n\n font-size: 1em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .link-card-desc {\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n & > .link-card-arrow {\n font-size: 1.2em;\n\n opacity: .5;\n\n transition:\n transform .3s ease,\n opacity .3s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .about-footer {\n padding: 0;\n\n & > .footer-divider {\n height: 1px;\n\n margin: 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(143, 163, 255, .3) 20%,\n rgba(143, 163, 255, .3) 80%,\n transparent\n );\n }\n\n & > .about-credits {\n padding: 24px;\n\n & > div {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(max(280px, calc(50% - 6px)), 1fr));\n gap: 12px;\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .credit-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n border-radius: 14px;\n padding: 14px 16px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n border-top: 2px solid rgba(143, 163, 255, .18);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .4) 30%\n );\n\n &:hover {\n transform: translateY(-3px) scale(1.01);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n border-top-color: rgba(143, 163, 255, .5);\n box-shadow: 0 6px 20px rgba(143, 163, 255, .18),\n 0 2px 8px rgba(0, 0, 0, .25);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .1),\n rgba(40, 43, 52, .6) 40%\n );\n }\n\n & > .credit-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n\n border-radius: 50%;\n\n font-size: 1.1em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .15)\n );\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .credit-info {\n flex: 1;\n min-width: 0;\n text-align: left;\n\n & > .credit-name {\n position: relative;\n overflow: hidden;\n\n margin-bottom: 2px;\n\n font-size: .95em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n & > span {\n display: inline-block;\n white-space: nowrap;\n }\n }\n\n & > .credit-role {\n font-size: .8em;\n line-height: 1.4;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n &:hover {\n & > .credit-info {\n & > .credit-name > span {\n animation: scroll-text 3s linear infinite;\n }\n }\n }\n }\n\n & > .copyright-card {\n cursor: pointer;\n\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n text-align: center;\n overflow: hidden;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: rgba(35, 38, 46, .3);\n\n & > .copyright-title {\n margin-bottom: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > .copyright-desc {\n font-size: .75em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(140, 140, 140, 1);\n }\n }\n }\n }\n }\n }\n\n &#ollama-server-url {\n & > .connection-status-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n &:has(#settings-ollama-connection-status:empty) {\n display: none;\n }\n\n &.testing {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.connected {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .7);\n box-shadow: 0 2px 8px rgba(76, 175, 80, .4);\n\n background: rgba(76, 175, 80, .1);\n }\n &.failed {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > #settings-connection-status {\n font-size: .9em;\n }\n }\n }\n\n &#ollama-model-select {\n .models-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n text-align: center;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n &.searching {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .7);\n box-shadow: 0 2px 8px rgba(143, 163, 255, .4);\n\n background: rgba(143, 163, 255, .1);\n }\n &.none {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.error {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > p {\n font-size: .9em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n & > #settings-ollama-models {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 8px;\n\n &:not(:empty) {\n margin-top: 8px;\n }\n\n & > .model {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 12px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(50, 54, 66, .9);\n }\n\n &.selected {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 0 15px rgba(143, 163, 255, .5);\n\n background: rgba(143, 163, 255, .1);\n\n & > .model-top {\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .model-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n\n & > .fa {\n /* Theme dependent */\n color: rgba(128, 128, 128, .5);\n }\n\n & > .model-name {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .pseudo-indicator {\n pointer-events: none;\n\n opacity: 0;\n }\n }\n\n & > .model-bottom {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n }\n }\n }\n\n &#ollama-setup {\n & > .settings-section-title {\n /* Theme dependent */\n color: rgba(255, 54, 34, 1);\n }\n & > .settings-section-desc {\n border-left: 4px solid;\n\n border-radius: 6px;\n padding: 10px;\n\n /* Theme dependent */\n border-left-color: rgba(255, 193, 7, 1);\n\n background: rgba(255, 193, 7, .125);\n\n color: rgba(225, 225, 225, 1);\n }\n }\n\n &.save {\n & > .save-settings-header {\n margin-bottom: 16px;\n }\n\n & > .save-settings-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .save-settings-card {\n border: 1px solid;\n border-radius: 12px;\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .5);\n box-shadow: 0 2px 12px rgba(0, 0, 0, .2);\n\n transition: border-color .3s ease, box-shadow .3s ease;\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n }\n\n & > .card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(50, 54, 66, .6),\n rgba(40, 43, 52, .6)\n );\n border-bottom: 1px solid rgba(255, 255, 255, .06);\n\n & > .card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 10px;\n\n font-size: 1.25em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(143, 163, 255, .15);\n }\n\n & > .card-header-content {\n flex: 1;\n\n & > .card-title {\n font-size: 1.1em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(232, 232, 232, 1);\n }\n\n & > .card-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n }\n }\n\n & > .card-toggle {\n flex-shrink: 0;\n }\n }\n\n & > .card-body {\n padding: 12px;\n\n & > .action-buttons-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n\n & > .action-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(46, 52, 66, .6);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .25);\n background: rgba(56, 62, 76, .7);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n }\n\n & > .action-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 8px;\n\n font-size: 1.15em;\n flex-shrink: 0;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n\n & > .action-card-content {\n flex: 1;\n\n & > .action-card-title {\n font-size: .95em;\n font-weight: 600;\n margin-bottom: 1px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .action-card-desc {\n font-size: .85em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n &.export-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .2),\n rgba(56, 142, 60, .2)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.import-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .5);\n background: rgba(76, 175, 80, .1);\n\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .3),\n rgba(56, 142, 60, .3)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n }\n\n &.reset-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .2),\n rgba(183, 28, 28, .2)\n );\n color: rgba(211, 47, 47, 1);\n }\n }\n }\n }\n\n & > .status-message {\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n animation: scale-in .3s ease;\n\n &.hidden {\n display: none;\n }\n\n & > .status-content {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n & > .status-icon {\n font-size: 1.25em;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n & > .status-text {\n flex: 1;\n\n & > .status-title {\n font-size: .95em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(240, 240, 240, 1);\n }\n\n & > .status-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(210, 210, 210, 1);\n }\n }\n }\n\n &.success {\n /* Theme dependent */\n border: 1px solid rgba(76, 175, 80, .4);\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .15),\n rgba(56, 142, 60, .1)\n );\n box-shadow: 0 4px 16px rgba(76, 175, 80, .2);\n\n & > .status-content > .status-icon {\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.error {\n /* Theme dependent */\n border: 1px solid rgba(211, 47, 47, .4);\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .15),\n rgba(183, 28, 28, .1)\n );\n box-shadow: 0 4px 16px rgba(211, 47, 47, .2);\n\n & > .status-content > .status-icon {\n color: rgba(211, 47, 47, 1);\n }\n }\n\n &.info {\n /* Theme dependent */\n border: 1px solid rgba(255, 193, 7, .4);\n background: linear-gradient(135deg,\n rgba(255, 193, 7, .15),\n rgba(255, 152, 0, .1)\n );\n box-shadow: 0 4px 16px rgba(255, 193, 7, .2);\n\n & > .status-content > .status-icon {\n color: rgba(255, 193, 7, 1);\n }\n }\n }\n\n & > .import-textarea {\n width: 100%;\n min-height: 140px;\n\n border: 2px solid;\n\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n font-family: 'Courier New', Consolas, monospace;\n font-size: .88em;\n line-height: 1.6;\n\n resize: vertical;\n\n animation: scale-in .3s ease;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n background: rgba(20, 23, 32, .8);\n color: rgba(220, 220, 220, 1);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3);\n\n &:focus {\n outline: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .6);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3),\n 0 0 0 3px rgba(143, 163, 255, .15);\n }\n\n &.hidden {\n display: none;\n }\n\n &::placeholder {\n /* Theme dependent */\n color: rgba(130, 130, 130, 1);\n }\n }\n }\n }\n }\n }\n\n .list-container {\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border: 1px solid;\n\n border-radius: 8px;\n margin-bottom: 8px;\n padding: 8px;\n padding-left: 15px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n &.empty {\n padding: 20px;\n\n text-align: center;\n\n opacity: .6;\n }\n\n & > div {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n a > {\n font-weight: 600;\n word-break: break-all;\n }\n\n & > span {\n font-size: .85em;\n\n opacity: .7;\n }\n\n & > .add-action-button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n\n border-radius: 6px;\n\n font-size: 1em;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n\n &.remove-button {\n /* Theme dependent */\n background: rgba(211, 47, 47, .1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(211, 47, 47, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(211, 47, 47, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n }\n }\n }\n }\n }\n\n .settings-compact-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 18px;\n\n margin-bottom: 25px;\n }\n\n .draggable-order-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n\n &.is-dragging .draggable-order-item {\n pointer-events: none;\n\n &:hover {\n transform: none;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: none;\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n opacity: .5;\n\n color: inherit;\n }\n }\n }\n\n & > .draggable-order-item-wrapper {\n position: relative;\n\n transition: transform .2s cubic-bezier(0.2, 0, 0, 1);\n\n &.dragging {\n z-index: 4;\n\n &::after {\n content: '';\n\n width: 100%;\n height: 100%;\n\n border: 2px dashed;\n\n border-radius: 10px;\n\n position: absolute;\n top: 0;\n left: 0;\n\n pointer-events: none;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4),\n inset 0 0 20px rgba(102, 126, 234, .15);\n\n background: rgba(102, 126, 234, .1);\n }\n\n & > .draggable-order-item {\n visibility: hidden;\n }\n }\n }\n\n .draggable-order-item {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 10px;\n padding: 14px 18px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n content: '\\f0c9';\n\n font-family: 'Font Awesome 6 Free';\n font-size: .9em;\n font-weight: 900;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n color .2s ease;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 6px 24px rgba(0, 0, 0, .4);\n\n background: rgba(50, 54, 66, .9);\n\n &::before {\n opacity: .8;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n &:active {\n cursor: grabbing;\n\n transform: scale(1.02);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n box-shadow: 0 8px 32px rgba(102, 126, 234, .3);\n\n background: rgba(60, 65, 80, .95);\n }\n\n &.disabled {\n opacity: .5;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .05);\n\n background: rgba(30, 32, 38, .6);\n\n & > .draggable-order-item-name {\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .draggable-order-item-toggle {\n /* Theme dependent */\n background: rgba(80, 80, 80, .5);\n\n &::before {\n transform: translateX(0);\n\n /* Theme dependent */\n background: rgba(120, 120, 120, 1);\n }\n }\n\n &:hover {\n opacity: .7;\n\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n }\n }\n\n & > .draggable-order-item-name {\n flex: 1;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(230, 230, 230, 1);\n }\n\n & > .draggable-order-item-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 44px;\n height: 24px;\n\n border-radius: 100vh;\n\n position: relative;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 75, 162, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .3);\n\n &::before {\n content: '';\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n position: absolute;\n top: 3px;\n left: 3px;\n\n transform: translateX(20px);\n\n transition: transform .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, .2);\n }\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5);\n }\n }\n }\n }\n }\n }\n }\n }\n\n select, input:not([type=range]), textarea, button {\n border: 1px solid transparent;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-family: inherit;\n font-size: inherit;\n color: var(--color, inherit);\n\n transition: border .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 8px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .3), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .9);\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .4), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), 1);\n }\n &:not(input, textarea):active {\n /* Theme dependent */\n box-shadow: 0 1px 4px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .2), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .95);\n }\n\n &[type=number] {\n -moz-appearance: textfield;\n appearance: textfield;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n appearance: none;\n\n margin: 0;\n }\n }\n }\n\n button {\n cursor: pointer !important;\n\n &:hover {\n transform: translateY(-2px);\n }\n &:active {\n transform: translateY(0);\n }\n }\n\n duration-input {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n font-family: inherit;\n font-size: .9em;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n background: rgba(40, 43, 52, .7);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n background: rgba(40, 43, 52, .85);\n }\n\n & > .infinity-label {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 10px 14px;\n\n font-weight: 500;\n font-size: .95em;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(220, 220, 220, 1);\n background: rgba(35, 38, 48, .6);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2);\n\n &::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n\n position: absolute;\n top: 50%;\n right: 12px;\n\n font-size: 13px;\n line-height: 1;\n\n opacity: 0;\n transform: translateY(-50%) scale(0);\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n & > span {\n flex: 1;\n letter-spacing: .3px;\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(45, 48, 58, .8);\n box-shadow: 0 3px 10px rgba(0, 0, 0, .3);\n }\n\n &.selected {\n border-color: rgba(102, 126, 234, .5);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .2) 0%,\n rgba(118, 75, 162, .2) 100%\n );\n box-shadow: 0 3px 12px rgba(102, 126, 234, .25),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n &::after {\n opacity: 1;\n transform: translateY(-50%) scale(1);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .6);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25) 0%,\n rgba(118, 75, 162, .25) 100%\n );\n box-shadow: 0 4px 16px rgba(102, 126, 234, .35),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n }\n }\n }\n\n & > .duration-inputs {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n\n opacity: 1;\n transform: scale(1);\n\n transition: opacity .2s ease,\n transform .2s cubic-bezier(.4, 0, .2, 1);\n\n & > label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n\n & > span {\n font-size: .75em;\n font-weight: 600;\n letter-spacing: .5px;\n text-align: center;\n text-transform: uppercase;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .85);\n }\n\n & > input {\n cursor: text;\n\n width: 100%;\n\n border: 1px solid;\n border-radius: 6px;\n padding: 8px 10px;\n\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: .95em;\n font-weight: 500;\n text-align: center;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(230, 230, 230, 1);\n background: rgba(30, 33, 42, .9);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n\n &::placeholder {\n color: rgba(150, 154, 170, .6);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(35, 38, 48, 1);\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &:focus {\n outline: none;\n border-color: rgba(102, 126, 234, .6);\n background: rgba(40, 43, 52, 1);\n box-shadow: 0 0 0 2px rgba(102, 126, 234, .2),\n 0 2px 10px rgba(102, 126, 234, .15),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n }\n }\n\n &:has(.infinity-label.selected) > .duration-inputs {\n opacity: .4;\n transform: scale(.98);\n pointer-events: none;\n }\n }\n\n #reset-statistics-button {\n float: right;\n\n font-size: 1rem;\n\n /* Theme dependent */\n --background: 211, 51, 51;\n }\n\n #settings-ollama-refresh-models {\n float: right;\n\n font-size: 1rem;\n }\n }\n\n .ws-username-highlight {\n position: relative;\n\n &::before {\n content: \"\";\n\n pointer-events: none;\n\n position: absolute;\n inset: 0;\n\n border-radius: 10px;\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n }\n }\n}"; /***/ }, /***/ 4192(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.generateRandomUUID = generateRandomUUID; function GenerateUUID() { if (crypto && crypto.randomUUID) return crypto.randomUUID(); return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c === "x" ? r : r & 3 | 8; return v.toString(16); }); } const size = 256; const cache = []; function Fill() { if (cache.length < size) cache.push(GenerateUUID()); requestIdleCallback(Fill); } if (typeof requestIdleCallback === "function") requestIdleCallback(Fill); function generateRandomUUID() { if (cache.length === 0) return GenerateUUID(); return cache.pop(); } /***/ }, /***/ 4041(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.CreateDOMElement = CreateDOMElement; function CreateDOMElement(tag, options = {}) { const $el = document.createElement(tag); if ("id" in options) $el.id = options.id; if ("class" in options) $el.className = options.class; if ("text" in options) $el.textContent = options.text; if ("html" in options) $el.innerHTML = options.html; if ("content" in options) $el.append(options.content); if ("value" in options) $el.value = options.value; if ("attributes" in options) for (const [key, value] of Object.entries(options.attributes || {})) $el.setAttribute(key, value); if ("dataset" in options) for (const [key, value] of Object.entries(options.dataset || {})) $el.dataset[key] = value; if ("style" in options) for (const [key, value] of Object.entries(options.style || {})) $el.style.setProperty(key, value); return $el; } /***/ }, /***/ 5643(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.fullTrim = void 0; const fullTrim = str => { const lines = str.split("\n"), length = lines.length; let start = true, indent = Infinity; let temp = [], parsed = []; for (let i = 0; i < length; i++) { const line = lines[i]; if (line.trim() === "") { if (start) { continue; } else { temp.push(""); } } else { if (start) { start = false; } else { parsed = parsed.concat(temp); temp = []; } const leadingSpaces = line.match(/^(\s*)/)[0].length; indent = Math.min(indent, leadingSpaces); parsed.push(line); } } const parsedLength = parsed.length; if (parsedLength === 0) { return ""; } const result = []; for (let i = 0; i < parsedLength; i++) { const line = parsed[i].trimEnd(); if (line === "") { result.push(""); } else { result.push(line.slice(indent)); } } return result.join("\n"); }; exports.fullTrim = fullTrim; /***/ }, /***/ 2852(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Memory = void 0; class Memory { constructor(options = {}) { this.order = []; this.store = new Map; this.timeouts = new Map; if ("timeout" in options) this.timeout = options.timeout; if ("size" in options) this.maxSize = options.size; } clear() { this.order = []; this.store.clear(); this.timeouts.clear(); } has(key) { return this.store.has(key); } get(key) { return this.store.get(key); } set(key, value) { const existingIndex = this.order.indexOf(key); if (existingIndex !== -1) this.order.splice(existingIndex, 1); this.order.push(key); this.store.set(key, value); if (this.timeouts.has(key)) clearTimeout(this.timeouts.get(key)); if (this.timeout !== undefined) this.timeouts.set(key, setTimeout(() => { this.delete(key); }, this.timeout)); if (this.maxSize !== undefined && this.store.size > this.maxSize) this.delete(this.order.shift()); } add(key) { if (!this.store.has(key)) this.set(key, true); } delete(key) { const index = this.order.indexOf(key); if (index !== -1) this.order.splice(index, 1); this.store.delete(key); clearTimeout(this.timeouts.get(key)); this.timeouts.delete(key); } size() { return this.store.size; } } exports.Memory = Memory; /***/ }, /***/ 2595(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Stack = void 0; class Stack { constructor(maxSize = 50) { this.items = []; this.maxSize = maxSize; } push(item) { this.items.push(item); if (this.items.length > this.maxSize) this.items.shift(); } pop() { return this.items.pop(); } unshift(item) { this.items.unshift(item); if (this.items.length > this.maxSize) this.items.pop(); } shift() { return this.items.shift(); } peek() { return this.items[this.items.length - 1]; } clear() { this.items = []; } get length() { return this.items.length; } set length(v) { this.items.length = Math.min(v, this.maxSize); } } exports.Stack = Stack; /***/ }, /***/ 6873(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Trie = void 0; var _scriptEsm = __webpack_require__(4192); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } /* const Node = { UUID: <UUID>, defined: <boolean>, value: <any>, terminal: <boolean>, children: Map<any, Node> }; */ var _Trie_brand = new WeakSet; class Trie { constructor(options = {}) { _classPrivateMethodInitSpec(this, _Trie_brand); this.order = {}; this.store = new Map; this.timeouts = new Map; if ("timeout" in options) this.timeout = options.timeout; if ("size" in options) this.maxSize = options.size; } clear() { this.order = {}; this.store.clear(); this.timeouts.clear(); } has(...keys) { var _scope$get; const lastKey = keys.pop(); let scope = this.store; for (const key of keys) { if (!scope.has(key)) return false; const temp = scope.get(key); if (temp.terminal) return false; scope = temp.children; } return ((_scope$get = scope.get(lastKey)) === null || _scope$get === void 0 ? void 0 : _scope$get.defined) === true; } get(...keys) { var _scope$get2; const lastKey = keys.pop(); let scope = this.store; for (const key of keys) { if (!scope.has(key)) return undefined; const temp = scope.get(key); if (temp.terminal) return undefined; scope = temp.children; } return (_scope$get2 = scope.get(lastKey)) === null || _scope$get2 === void 0 ? void 0 : _scope$get2.value; } set(...keys) { var _scope$get4; const value = keys.pop(); let UUID = ((keys, _scope$get3) => { const lastKey = keys.pop(); let scope = this.store; for (const key of keys) { if (!scope.has(key)) return undefined; const temp = scope.get(key); if (temp.terminal) return undefined; scope = temp.children; } return (_scope$get3 = scope.get(lastKey)) === null || _scope$get3 === void 0 ? void 0 : _scope$get3.UUID; })(keys); delete this.order[UUID]; if (UUID === undefined) UUID = (0, _scriptEsm.generateRandomUUID)(); const finalKey = keys.pop(); let scope = this.store; for (const key of keys) { if (scope.has(key)) { var _temp$children; const temp = scope.get(key); temp.terminal = false; (_temp$children = temp.children) !== null && _temp$children !== void 0 ? _temp$children : temp.children = new Map; scope = temp.children; } else { const temp = { defined: false, terminal: false, children: new Map }; scope.set(key, temp); scope = temp.children; } } const final = (_scope$get4 = scope.get(finalKey)) !== null && _scope$get4 !== void 0 ? _scope$get4 : { terminal: true }; final.UUID = UUID; final.defined = true; final.value = value; scope.set(finalKey, final); this.order[UUID] = keys.concat([ finalKey ]); if (this.timeouts.has(UUID)) clearTimeout(this.timeouts.get(UUID)); if (this.timeout !== undefined) this.timeouts.set(UUID, setTimeout(() => { _assertClassBrand(_Trie_brand, this, _deleteByUUID).call(this, UUID); }, this.timeout)); if (this.maxSize !== undefined && Object.keys(this.order).length > this.maxSize) _assertClassBrand(_Trie_brand, this, _deleteByUUID).call(this, this.order.shift()); } add(key) { if (!this.store.has(key)) this.set(key, true); } delete(...keys) { const UUID = ((keys, _scope$get5) => { const lastKey = keys.pop(); let scope = this.store; for (const key of keys) { if (!scope.has(key)) return undefined; const temp = scope.get(key); if (temp.terminal) return undefined; scope = temp.children; } return (_scope$get5 = scope.get(lastKey)) === null || _scope$get5 === void 0 ? void 0 : _scope$get5.UUID; })(keys); if (UUID !== undefined) _assertClassBrand(_Trie_brand, this, _deleteByUUID).call(this, UUID); } size() { return Object.keys(this.order).length; } } exports.Trie = Trie; function _deleteByUUID(UUID) { var _final$children; if (this.timeouts.has(UUID)) clearTimeout(this.timeouts.get(UUID)); this.timeouts.delete(UUID); const keys = this.order[UUID]; delete this.order[UUID]; const scopes = [ { children: this.store } ]; let scope = this.store; for (const key of keys) { const temp = scope.get(key); scopes.push(temp); scope = temp.children; } const final = scopes.pop(); final.defined = false; delete final.value; if (((_final$children = final.children) === null || _final$children === void 0 ? void 0 : _final$children.size) > 0) return; for (let i = scopes.length - 1; i >= 0; i--) { const scope = scopes[i]; const key = keys.pop(); scope.children.delete(key); if (scope.children.size > 0 || scope.defined) break; scope.terminal = true; delete scope.children; } } /***/ }, /***/ 4551(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.truncate = truncate; function truncate(str, len) { return str.length > len ? `${str.substring(0, len - 3).trimEnd()}...` : str; } /***/ }, /***/ 1289(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.convertToUTCString = void 0; const convertToUTCString = date => `${date.getUTCFullYear().toString().padStart(4, "0")}-` + `${(date.getUTCMonth() + 1).toString().padStart(2, "0")}-` + `${date.getUTCDate().toString().padStart(2, "0")}T` + `${date.getUTCHours().toString().padStart(2, "0")}:` + `${date.getUTCMinutes().toString().padStart(2, "0")}:` + `${date.getUTCSeconds().toString().padStart(2, "0")}`; exports.convertToUTCString = convertToUTCString; /***/ }, /***/ 8678(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Ollama = exports.AI = void 0; var _namespaces = __webpack_require__(4018); var _scriptEsm = __webpack_require__(5643); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _AI_brand = new WeakSet; class AI { static registerProvider(name, providerClass) { AI.providers[name] = providerClass; } setup(type, item) { if (this.analysis[type].has(item.id)) { const analysis = this.analysis[type].get(item.id); analysis.count++; return analysis.request; } const abortController = new AbortController; const request = this.fetch(type, item, abortController.signal); this.analysis[type].set(item.id, { request, abortController, count: 1 }); request.finally(() => { this.analysis[type].delete(item.id); }); return request; } async fetch(type, item, abortSignal) { return { error: "No service has been selected" }; } constructor(ws, config) { _classPrivateMethodInitSpec(this, _AI_brand); _defineProperty(this, "analysis", { edit: new Map, username: new Map }); _defineProperty(this, "cache", { username: new Set }); _defineProperty(this, "analyze", { edit: item => this.setup("edit", item), username: item => { if (this.cache["username"].has(item.user.name)) { return Promise.resolve({ flag: false, confidence: 1, issues: [], explanation: "Username previously analyzed." }); } this.cache["username"].add(item.user.name); return this.setup("username", item); } }); _defineProperty(this, "cancel", { all: (type = true) => { if (type === true) { for (const type of Object.keys(this.analysis)) for (const id of (_this$analysis$type = this.analysis[type]) === null || _this$analysis$type === void 0 ? void 0 : _this$analysis$type.keys()) { var _this$analysis$type; this.cancel[type](id); } } else { for (const id of (_this$analysis$type2 = this.analysis[type]) === null || _this$analysis$type2 === void 0 ? void 0 : _this$analysis$type2.keys()) { var _this$analysis$type2; this.cancel[type](id); } } }, edit: id => { const analysis = this.analysis["edit"].get(id); if (analysis) { analysis.count--; if (analysis.count <= 0) { analysis.abortController.abort("Edit analysis canceled by user"); this.analysis["edit"].delete(id); } } }, username: id => { const analysis = this.analysis["username"].get(id); if (analysis) { analysis.count--; if (analysis.count <= 0) { analysis.abortController.abort("Username analysis canceled by user"); this.analysis["username"].delete(id); } } } }); _defineProperty(this, "prompt", { edit: async item => { var _namespaces$find, _item$tags; const diffText = _assertClassBrand(_AI_brand, this, _parseDiff).call(this, item.diff); const namespace = (_namespaces$find = _namespaces.namespaces.find(ns => ns.id === item.ns)) !== null && _namespaces$find !== void 0 ? _namespaces$find : _namespaces.namespaces[0]; let userType = "registered"; if (item.user.temp) userType = "temporary (unregistered)"; else if (item.user.ip) userType = "IP (unregistered)"; const categories = item.page.categories.join(", ") || "(none)"; const isBLP = item.page.categories.some(c => /living people/i.test(c)); return (0, _scriptEsm.fullTrim)(`\nYou are an automated Wikipedia item reviewer. Analyze the following item and determine whether the CHANGES INTRODUCED violate Wikipedia policy.\n\nCRITICAL: You are evaluating what this item CHANGED, not the page content before it. The diff shows removed lines (prefixed "-") and added lines (prefixed "+"). Only ADDED content can be a new violation. Removing bad content is a GOOD item. Adding references, citations, and sources is GOOD — it improves verifiability, not the opposite.\n\nitem CONTEXT:\n- Page: "${item.page.title}" (${namespace.name} namespace)\n- Categories: ${categories}${isBLP ? "\n- ⚠ BLP: This page is about a living person. Unsourced negative claims are a serious concern." : ""}\n- User: "${item.user.name}" (${userType}, warning level: ${item.user.warning}/4)\n- ORES vandalism probability: ${(item.ores * 100).toFixed(0)}%\n- Size change: ${item.sizediff > 0 ? "+" : ""}${item.sizediff} bytes\n- Flagged minor: ${item.minor ? "yes" : "no"}\n- Summary: ${item.comment || "(empty)"}\n- Tags: ${((_item$tags = item.tags) === null || _item$tags === void 0 ? void 0 : _item$tags.join(", ")) || "(none)"}\n\nWHAT TO CHECK:\n1. VANDALISM: Does the item add nonsense, profanity as attacks, hoaxes, blanking, or deliberate misinformation? (WP:VANDALISM)\n2. NPOV: Does the item add clearly biased or one-sided language that is not presented neutrally? (WP:NPOV)\n3. VERIFIABILITY: Does the item add claims that are extraordinary or contentious WITHOUT any sourcing? Note: adding "<ref>" tags, URLs, or citation templates is adding sources — this is the OPPOSITE of a verifiability problem. (WP:V)\n4. ORIGINAL RESEARCH: Does the item add novel analysis, synthesis, or unpublished interpretation not attributable to any source? Simply adding text IS NOT original research if it restates commonly known facts or is sourced. Adding citations is NEVER original research. (WP:NOR)\n5. BLP: If this is a BLP article, does the item add unsourced or poorly-sourced negative material about the subject? (WP:BLP)\n\nWHAT IS NOT A VIOLATION:\n- Adding references, citations, "<ref>" tags, or URLs (this IMPROVES the article)\n- Removing vandalism or bad content\n- Fixing grammar, spelling, formatting, or wikilinks\n- Content about controversial topics written in a neutral, encyclopedic tone\n- Wikipedia is NOT censored — explicit content on appropriate pages is allowed (WP:NOTCENSORED)\n- Absent or auto-generated item summaries (e.g. "/* Section name */") are normal, not violations\n- ORES scores and warning levels are hints — do NOT treat them as evidence by themselves\n\nASSESSMENT SCALE:\n- "Good": No policy issues. Normal constructive item.\n- "Review": Minor concerns; a human should glance at it.\n- "Suspicious": Likely problematic; warrants close scrutiny.\n- "Bad": Clear policy violation.\n\nWhen in doubt between two ratings, choose the LESS severe one. Most items on Wikipedia are constructive — reflect that in your assessments.\n\nFor issues, use short policy codes (e.g. "WP:VANDALISM", "WP:NPOV", "WP:BLP"). Keep your explanation to 1-3 sentences.\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: <b>Clear vandalism</b> — added <code>lol hacked</code> which violates <i>WP:VANDALISM</i>.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n\nDIFF:\n${diffText}\n`); }, username: async item => { var _item$page; return (0, _scriptEsm.fullTrim)(`\nYou are an automated Wikipedia username policy reviewer. Determine whether the username below violates Wikipedia's username policy.\n\nUSERNAME: ${item.user.name}\nPAGE CONTEXT: ${((_item$page = item.page) === null || _item$page === void 0 ? void 0 : _item$page.title) || "(unknown)"}\n\nThe page context is provided ONLY to check for potential conflict-of-interest (e.g. a user named "AcmeCorp" iteming the Acme Corporation article). A controversial page topic does NOT make the username problematic.\n\nVIOLATION CATEGORIES (flag ONLY if the username clearly and unambiguously fits one):\n\n1. Offensive — The name is unambiguously profane, threatening, sexually explicit, or promotes vandalism. Merely edgy, weird, or humorous names do NOT qualify. (WP:U#OFFENSIVE)\n2. Disruptive — The name clearly declares intent to disrupt or vandalize (e.g. "I Will Vandalize"). (WP:U#DISRUPTIVE)\n3. Libelous — The name makes a clearly false or disparaging claim about a specific real person, or reveals private personal information. (WP:U#LIBEL)\n4. Misleading — The name impersonates a specific real person, or falsely claims special permissions by including terms like "admin", "sysop", "bureaucrat", "checkuser". (WP:U#MISLEADING)\n5. Promotional — The name is a URL or email address whose clear purpose is advertising or revenue. Containing a brand name alone is NOT enough. (WP:U#PROMO)\n6. Shared — The name unambiguously represents a company, organization, or role rather than an individual (e.g. "XYZ Foundation", "Secretary of ABC"). Names like "JohnAtAcme" or "AcmeFan123" are fine — they clearly identify an individual. (WP:U#SHARED)\n\nDECISION RULES:\n- Flag ONLY clear, unambiguous violations. Borderline = no flag.\n- Numbers at the end of a username (e.g. "itemor2847", "WikiFan99") are completely normal and NOT a violation of any kind.\n- Creative, odd, humorous, or meaningless usernames are NOT violations.\n- Containing a real word that could be offensive in some context is NOT enough — the name must be clearly and intentionally offensive.\n- When in doubt: do NOT flag. Set flag to false.\n- If not flagging, set explanation to "No violation."\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: Username contains <code>sysop</code> which falsely implies <i>WP:U#MISLEADING</i> permissions.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n`); } }); this.ws = ws; this.settings = ws.store.settings.AI; this.config = config; } async test() { return false; } async models() { return []; } } exports.AI = AI; function _parseDiff(diffHtml) { var _container$textConten; const container = document.createElement("div"); container.innerHTML = diffHtml; const lines = []; for (const row of container.querySelectorAll("tr")) { const deleted = row.querySelector(".diff-deletedline"); const added = row.querySelector(".diff-addedline"); const context = row.querySelector(".diff-context"); if (deleted) lines.push(`- ${deleted.textContent.trim()}`); if (added) lines.push(`+ ${added.textContent.trim()}`); else if (context) lines.push(` ${context.textContent.trim()}`); } if (lines.length > 0) return lines.join("\n"); // Fallback: strip HTML tags and return plain text return ((_container$textConten = container.textContent) === null || _container$textConten === void 0 ? void 0 : _container$textConten.trim()) || ""; } _defineProperty(AI, "providers", {}); const EDIT_RESPONSE_FORMAT = { type: "object", properties: { issues: { type: "array", items: { type: "object", properties: { policy: { type: "string" }, severity: { type: "string", enum: [ "Low", "Medium", "High", "Critical" ] } }, required: [ "policy", "severity" ] } }, explanation: { type: "string" }, assessment: { type: "string", enum: [ "Good", "Review", "Suspicious", "Bad" ] }, confidence: { type: "number", minimum: 0, maximum: 1 } }, required: [ "assessment", "confidence", "issues", "explanation" ] }; const USERNAME_RESPONSE_FORMAT = { type: "object", properties: { issues: { type: "array", items: { type: "object", properties: { policy: { type: "string", enum: [ "Offensive", "Disruptive", "Libelous", "Misleading", "Promotional", "Shared" ] }, severity: { type: "string", enum: [ "Low", "Medium", "High", "Critical" ] } }, required: [ "policy", "severity" ] } }, explanation: { type: "string" }, flag: { type: "boolean" }, confidence: { type: "number", minimum: 0, maximum: 1 } }, required: [ "flag", "confidence", "issues", "explanation" ] }; class Ollama extends AI { async test() { try { const response = await fetch(`${this.config.server}/api/version`, { method: "GET" }); return response.ok; } catch (error) { return false; } } async models() { try { const response = await fetch(`${this.config.server}/api/tags`, { method: "GET", headers: { "Content-Type": "application/json" } }); if (!response.ok) throw new Error(`Ollama API error: ${response.status} ${response.statusText}`); const data = await response.json(); return data.models || []; } catch (error) { throw error; } } async fetch(type, item, signal = null) { try { const prompt = this.prompt[type](item); const fetchOptions = { method: "POST", headers: { "Content-Type": "application/json" } }; const body = { model: this.config.model, prompt: await prompt, stream: false, options: { temperature: .1, top_p: .9, num_predict: 1024 }, format: type === "edit" ? EDIT_RESPONSE_FORMAT : USERNAME_RESPONSE_FORMAT }; fetchOptions.body = JSON.stringify(body); if (signal) fetchOptions.signal = signal; let response; try { response = await fetch(`${this.config.server}/api/generate`, fetchOptions); if (!response.ok) throw new Error(`Ollama API error: ${response.status} ${response.statusText}`); const data = await response.json(); if (!data.response) throw new Error("Empty response from Ollama"); return JSON.parse(data.response); } catch (err) { return { error: err.message || "Ollama request failed" }; } } catch (error) { return { error: error.message || "Ollama request failed" }; } } } exports.Ollama = Ollama; AI.registerProvider("Ollama", Ollama); /***/ }, /***/ 8169(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.AudioManager = void 0; var _scriptEsm = __webpack_require__(4192); var _zengine = __webpack_require__(1258); const audio = { startup: { type: "sound", title: "Startup Sound", description: "Sound played when WikiShield starts up.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/startup.wav" }, music: { type: "category", title: "Music", description: "Background music tracks.", volume: 1, properties: { zen_mode: { type: "sound", title: "Zen Mode", description: "Background audio played in Zen mode.", volume: 1, data: "custom://zen_mode", preview: false } } }, ui: { type: "category", title: "User Interface Sounds", description: "Sounds used for user interface interactions.", volume: 1, properties: { click: { type: "sound", title: "Click Sound", description: "Sound played when clicking on interface elements.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/click.wav" } } }, queue: { type: "category", title: "Queue Sounds", description: "Sounds played for queue events.", volume: 1, properties: { ores: { type: "sound", title: "ORES Alert", description: "Sound played due to a high ORES score.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/ores.wav" }, mention: { type: "sound", title: "Mention Alert", description: "Sound played when your username is mentioned in an edit.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/mention.wav" } } }, notification: { type: "category", title: "Notification Sounds", description: "Sounds played for various notifications.", volume: 1, properties: { alert: { type: "sound", title: "Alert Sound", description: "Sound played for alerts.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/alert.wav" }, message: { type: "sound", title: "Message Sound", description: "Sound played for messages.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/message.wav" }, toast: { type: "sound", title: "Toast Sound", description: "Sound played for toast notifications.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/toast.wav" } } }, action: { type: "category", title: "Action Sounds", description: "Sounds played for various user actions.", volume: 1, properties: { default: { type: "sound", title: "Default Action Sound", description: "Sound played for default actions.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/action.wav" }, failed: { type: "sound", title: "Failed Action Sound", description: "Sound played when an action fails.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/failed.wav" }, report: { type: "sound", title: "Report Action Sound", description: "Sound played for report actions.", volume: 1, data: "https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/report.wav" } } } }; class AudioManager { constructor(ws) { this.ws = ws; this.audio = audio; this.soundEffects = new Map; this.previews = new Map; this.previewing = false; } async init() { this.zengine = new _zengine.Zengine; this.zengine.debug = this.ws.__DEV__; await this.zengine.init(); this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"]); } async playSound(soundPath, signal, preview = false, callback) { if (!preview) { const zenMode = this.ws.store.settings.zen_mode; if (zenMode.enabled && !zenMode.sound.enabled) return; } const sound = this.getSound(soundPath); if (!sound || !sound.data) return; const volume = this.getVolume(soundPath); const audio = new Audio(sound.data); audio.volume = !preview && this.previewing ? 0 : volume; if ("mediaSession" in navigator) { navigator.mediaSession.setActionHandler("play", () => {}); navigator.mediaSession.setActionHandler("pause", () => {}); navigator.mediaSession.setActionHandler("previoustrack", () => {}); navigator.mediaSession.setActionHandler("nexttrack", () => {}); } const muteId = (0, _scriptEsm.generateRandomUUID)(); if (preview) { this.muteId = muteId; this.previewing = true; this.stopPreviews(); this._muteAll(); this.previews.set(audio, soundPath); } this.soundEffects.set(audio, soundPath); const promise = new Promise((resolve, reject) => { audio.resolve = resolve; audio.reject = reject; }); audio.onended = () => { audio.resolve(); this.soundEffects.delete(audio); if (preview) { this.previewing = false; setTimeout(() => { if (this.muteId === muteId) this._unmuteAll(); }, 250); this.previews.delete(audio); } }; audio.onerror = () => { audio.resolve(); this.soundEffects.delete(audio); if (preview) { this.previewing = false; setTimeout(() => { if (this.muteId === muteId) this._unmuteAll(); }, 250); this.previews.delete(audio); } }; let played = false; audio.onplay = () => { if (played) return; played = true; if (callback) callback(); }; signal === null || signal === void 0 || signal.addEventListener("abort", () => { audio.pause(); audio.src = ""; audio.resolve(); this.soundEffects.delete(audio); if (preview) { this.previewing = false; setTimeout(() => { if (this.muteId === muteId) { this._unmuteAll(); } }, 250); this.previews.delete(audio); } }); audio.play(); return promise; } async previewSound(soundPath) { const sound = this.getSound(soundPath); if (!sound || !sound.data) return; this._muteAll(); const audio = new Audio(sound.data); audio.volume = this.getVolume(soundPath); this.previews.set(audio, soundPath); const cleanup = () => { this.previews.delete(audio); if (this.previews.size === 0) this._unmuteAll(); }; audio.onended = cleanup; audio.onerror = cleanup; await audio.play(); } stopPreviews() { for (const audio of this.previews.keys()) { audio.resolve(); audio.pause(); audio.onended = null; audio.onerror = null; audio.src = ""; } this.previews.clear(); this._unmuteAll(); } onvolumechanged() { this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"]); if (this.previewing) for (const [audio, soundPath] of this.previews.entries()) { const newVolume = this.getVolume(soundPath); audio.volume = newVolume; } else for (const [audio, soundPath] of this.soundEffects.entries()) { const newVolume = this.getVolume(soundPath); audio.volume = newVolume; } } _muteAll() { for (const audio of this.soundEffects.keys()) audio.volume = 0; } _unmuteAll() { for (const [audio, soundPath] of this.soundEffects.entries()) audio.volume = this.getVolume(soundPath); } getSound(path) { let current = { type: "category", properties: this.audio }; for (const segment of path) { if (current.type === "category") current = current.properties[segment]; else return null; if (!current) return null; } return current; } getVolume(path) { const volumes = this.ws.store.settings.audio.volume; let volume = volumes.master; let current = { type: "category", properties: this.audio }; const pathParts = [ "master" ]; for (const segment of path) { pathParts.push(segment); if (current.type === "category") current = current.properties[segment]; else return volume; if (!current) break; const specificVolume = volumes[pathParts.join(".")]; if (specificVolume !== undefined) volume *= specificVolume; } return volume; } } exports.AudioManager = AudioManager; /***/ }, /***/ 1258(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Zengine = void 0; class MusicEngine { constructor() { this.audioContext = null; this.masterGain = null; this.isPlaying = false; this.debug = false; this.layers = { bass: { oscillators: [], gains: [], compressor: null }, pad: { oscillators: [], gains: [], filter: null, reverb: null } }; this.nextChordTimeout = null; this.baseFrequency = 65.41; this.currentKey = 0; this.chordLibrary = { maj7: { bass: [ 0 ], pad: [ 0, 7, 11, 16, 19 ], tension: .1 }, min7: { bass: [ 0 ], pad: [ 0, 7, 10, 15, 19 ], tension: .15 }, maj9: { bass: [ 0 ], pad: [ 0, 7, 11, 14, 19 ], tension: .12 }, min9: { bass: [ 0 ], pad: [ 0, 7, 10, 14, 19 ], tension: .18 }, sus2: { bass: [ 0 ], pad: [ 0, 7, 12, 14, 19 ], tension: .25 }, sus4: { bass: [ 0 ], pad: [ 0, 7, 12, 17, 19 ], tension: .28 }, add9: { bass: [ 0 ], pad: [ 0, 7, 14, 16, 21 ], tension: .15 }, madd9: { bass: [ 0 ], pad: [ 0, 7, 14, 15, 21 ], tension: .2 }, openvoice: { bass: [ 0 ], pad: [ 0, 7, 12, 19, 24 ], tension: .08 }, "6add9": { bass: [ 0 ], pad: [ 0, 7, 9, 14, 19 ], tension: .18 } }; this.chordCompatibility = { maj7: [ "maj9", "min7", "sus2", "add9", "openvoice", "6add9" ], min7: [ "maj7", "min9", "sus4", "madd9", "openvoice" ], maj9: [ "maj7", "add9", "sus2", "6add9", "openvoice" ], min9: [ "min7", "madd9", "sus2", "maj9" ], sus2: [ "maj7", "maj9", "add9", "openvoice", "sus4" ], sus4: [ "maj7", "sus2", "min7", "openvoice" ], add9: [ "maj9", "sus2", "maj7", "openvoice", "6add9" ], madd9: [ "min9", "min7", "add9", "sus2" ], openvoice: [ "sus2", "maj7", "add9", "maj9" ], "6add9": [ "maj7", "maj9", "add9", "sus2" ] }; this.currentChordName = "maj7"; this.currentTension = .1; } init() { if (!this.audioContext) { this.audioContext = new (window.AudioContext || window.webkitAudioContext); this.masterGain = this.audioContext.createGain(); this.masterGain.connect(this.audioContext.destination); this.masterGain.gain.value = .2; this.setupLayerEffects(); } } async start() { if (this.isPlaying) return; this.init(); if (this.audioContext.state === "suspended") await this.audioContext.resume(); this.isPlaying = true; this.currentKey = Math.floor(Math.random() * 12); this.playNextChord(); } setupLayerEffects() { const bassComp = this.audioContext.createDynamicsCompressor(); bassComp.threshold.value = -30; bassComp.knee.value = 40; bassComp.ratio.value = 12; bassComp.attack.value = .003; bassComp.release.value = .25; bassComp.connect(this.masterGain); this.layers.bass.compressor = bassComp; const padFilter = this.audioContext.createBiquadFilter(); padFilter.type = "lowpass"; padFilter.frequency.value = 1200; padFilter.Q.value = .5; const padDelay = this.audioContext.createDelay(2); padDelay.delayTime.value = .4; const delayGain = this.audioContext.createGain(); delayGain.gain.value = .3; padFilter.connect(padDelay); padDelay.connect(delayGain); delayGain.connect(padFilter); padFilter.connect(this.masterGain); this.layers.pad.filter = padFilter; this.layers.pad.reverb = { delay: padDelay, gain: delayGain }; } playNextChord() { if (!this.isPlaying) return; const nextChord = this.chooseNextChord(); const prevChord = this.currentChordName; this.currentChordName = nextChord; this.currentTension = this.chordLibrary[nextChord].tension; if (this.debug) { console.log("[MusicEngine] Chord changed", { from: prevChord, to: nextChord, tension: this.currentTension, key: this.currentKey, timestamp: this.audioContext.currentTime }); } if (Math.random() < .08) { const oldKey = this.currentKey; this.currentKey = (this.currentKey + [ 2, 5, 7 ][Math.floor(Math.random() * 3)]) % 12; if (this.debug) console.log("[MusicEngine] Key changed", { from: oldKey, to: this.currentKey }); } this.transitionToChord(nextChord); const nextDelay = 12e3 + Math.random() * 1e4; this.nextChordTimeout = setTimeout(() => this.playNextChord(), nextDelay); } chooseNextChord() { const compatible = this.chordCompatibility[this.currentChordName] || Object.keys(this.chordLibrary); const weighted = compatible.map(name => { const tension = this.chordLibrary[name].tension; const weight = tension < .2 ? 2 : 1; return { name, weight }; }); const total = weighted.reduce((sum, item) => sum + item.weight, 0); let random = Math.random() * total; for (const item of weighted) { random -= item.weight; if (random <= 0) return item.name; } return compatible[0]; } transitionToChord(chordName) { const chord = this.chordLibrary[chordName]; if (!chord) return; const fadeDuration = 6 + Math.random() * 3; [ "bass", "pad" ].forEach(layerName => this.createLayer(layerName, chord[layerName], fadeDuration)); } createLayer(layerName, noteOffsets, fadeDuration) { if (!(noteOffsets !== null && noteOffsets !== void 0 && noteOffsets.length)) return; const now = this.audioContext.currentTime; const layer = this.layers[layerName]; if (layer.gains && layer.gains.length > 0) { const oldOscillators = [ ...layer.oscillators ]; const oldGains = [ ...layer.gains ]; oldGains.forEach(gain => { try { gain.gain.cancelScheduledValues(now); gain.gain.setValueAtTime(gain.gain.value, now); gain.gain.linearRampToValueAtTime(0, now + fadeDuration); } catch (e) {} }); setTimeout(() => { oldOscillators.forEach(osc => { try { osc.stop(); osc.disconnect(); } catch (e) {} }); oldGains.forEach(gain => { try { gain.disconnect(); } catch (e) {} }); }, fadeDuration * 1e3 + 100); } const newOscillators = []; const newGains = []; const frequencies = []; noteOffsets.forEach((offset, index) => { const frequency = this.baseFrequency * Math.pow(2, (this.currentKey + offset) / 12); frequencies.push(frequency); const osc = this.audioContext.createOscillator(); osc.type = layerName === "bass" ? "sine" : "triangle"; osc.frequency.value = frequency; osc.detune.value = (Math.random() - .5) * 6; const gain = this.audioContext.createGain(); gain.gain.value = 0; osc.connect(gain); if (layerName === "bass" && layer.compressor) gain.connect(layer.compressor); else if (layer.filter) gain.connect(layer.filter); osc.start(now); newOscillators.push(osc); newGains.push(gain); const volume = layerName === "bass" ? .15 : .08 - index * .01; gain.gain.setValueAtTime(0, now); gain.gain.linearRampToValueAtTime(volume, now + fadeDuration); }); if (this.debug) console.log("[MusicEngine] Layer created", { layer: layerName, frequencies, volumes: newGains.map(g => g.gain.value), fadeDuration }); layer.oscillators = newOscillators; layer.gains = newGains; } stop() { this.isPlaying = false; if (this.nextChordTimeout) clearTimeout(this.nextChordTimeout); if (this.debug) console.log("[MusicEngine] Stopping music engine", { timestamp: this.audioContext.currentTime }); const now = this.audioContext.currentTime; const fadeDuration = .5; Object.values(this.layers).forEach(layer => { if (layer.gains) { layer.gains.forEach(gain => { try { gain.gain.setValueAtTime(gain.gain.value, now); gain.gain.linearRampToValueAtTime(0, now + fadeDuration); } catch (e) {} }); } if (layer.oscillators) { setTimeout(() => { layer.oscillators.forEach(osc => { try { osc.stop(); osc.disconnect(); } catch (e) {} }); layer.oscillators = []; if (layer.gains) { layer.gains.forEach(gain => { try { gain.disconnect(); } catch (e) {} }); layer.gains = []; } }, fadeDuration * 1e3 + 50); } }); if (this.masterGain) try { this.masterGain.gain.setValueAtTime(this.masterGain.gain.value, now); this.masterGain.gain.linearRampToValueAtTime(0, now + fadeDuration); } catch (e) {} } setMasterVolume(volume) { if (this.masterGain) { const oldVolume = this.masterGain.gain.value; this.masterGain.gain.value = volume; if (this.debug) console.log("[MusicEngine] Master volume changed", { from: oldVolume, to: volume }); } } } class Zengine { constructor() { this.audioContext = null; this.sounds = []; this.activeSounds = new Map; this.masterGainNode = null; this.isRunning = false; this.currentEnvironment = null; this.eventLoopInterval = null; this.activityLevel = 4; this.musicEngine = null; this.debug = false; } async init() { this.musicEngine = new MusicEngine; this.musicEngine.init(); this.musicEngine.debug = this.debug; const response = await fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/bbc-sounds.json"); const rawSounds = await response.json(); this.sounds = this.categorizeSounds(rawSounds); if (this.debug) console.log("[Zengine] Initialized", { soundCount: this.sounds.length, categories: [ ...new Set(this.sounds.map(s => s.category)) ] }); return this.sounds.length; } categorizeSounds(rawSounds) { return rawSounds.map(sound => { var _sound$technicalMetad; const tags = (sound.tags || []).map(t => t.toLowerCase()); const description = (sound.description || "").toLowerCase(); const duration = parseFloat(((_sound$technicalMetad = sound.technicalMetadata) === null || _sound$technicalMetad === void 0 ? void 0 : _sound$technicalMetad.duration) || sound.duration) || 0; const category = this.detectCategory(tags, description); const role = duration > 60 ? "ambient" : duration > 15 ? "feature" : "event"; return { id: sound.id, duration, description: sound.description, category, role }; }); } detectCategory(tags, description) { const text = [ ...tags, description ].join(" "); if (/rain|drizzle/i.test(text)) return "rain"; if (/ocean|sea|wave/i.test(text)) return "ocean"; if (/stream|river|water/i.test(text)) return "water-flow"; if (/wind|breeze/i.test(text)) return "wind"; if (/bird/i.test(text)) return "bird"; if (/cricket|insect/i.test(text)) return "insect"; return "other"; } generateEnvironment() { const environments = [ { name: "Gentle Rain", requiredAmbient: [ "rain" ], commonCategories: [ "bird" ], weather: "rain" }, { name: "Ocean Shore", requiredAmbient: [ "ocean" ], commonCategories: [ "bird", "wind" ], weather: "clear" }, { name: "Forest Stream", requiredAmbient: [ "water-flow" ], commonCategories: [ "bird", "insect" ], weather: "clear" } ]; const env = environments[Math.floor(Math.random() * environments.length)]; if (this.debug) console.log("[Zengine] Environment generated", { name: env.name, weather: env.weather, ambientRequirements: env.requiredAmbient, commonSounds: env.commonCategories }); return env; } getEnvironmentSounds(environment) { const allAmbient = this.sounds.filter(s => s.role === "ambient" && environment.requiredAmbient.includes(s.category)); const allEvents = this.sounds.filter(s => s.role === "event" && environment.commonCategories.includes(s.category)); return { ambient: allAmbient, events: allEvents }; } async start() { if (this.isRunning) return; if (this.sounds.length === 0) await this.init(); if (!this.musicEngine.isPlaying) await this.musicEngine.start(); if (!this.audioContext) { this.audioContext = new (window.AudioContext || window.webkitAudioContext); this.masterGainNode = this.audioContext.createGain(); this.masterGainNode.connect(this.audioContext.destination); this.masterGainNode.gain.value = .3; } if (this.audioContext.state === "suspended") await this.audioContext.resume(); this.isRunning = true; this.currentEnvironment = this.generateEnvironment(); if (this.debug) console.log("[Zengine] Engine started", { environment: this.currentEnvironment.name, audioContextState: this.audioContext.state }); await this.startAmbientLayers(); this.startEventLoop(); } async startAmbientLayers() { const envSounds = this.getEnvironmentSounds(this.currentEnvironment); const numAmbient = Math.min(envSounds.ambient.length, 2); for (let i = 0; i < numAmbient; i++) { const sound = envSounds.ambient[Math.floor(Math.random() * envSounds.ambient.length)]; if (!this.activeSounds.has(sound.id)) await this.playSound(sound, "ambient", .35 + Math.random() * .1); } } startEventLoop() { this.eventLoopInterval = setInterval(() => this.processEvents(), 3e3); if (this.debug) console.log("[Zengine] Event loop started"); } async processEvents() { if (!this.isRunning) return; const envSounds = this.getEnvironmentSounds(this.currentEnvironment); const activeEvents = Array.from(this.activeSounds.values()).filter(s => s.role !== "ambient").length; if (activeEvents < this.activityLevel && envSounds.events.length > 0 && Math.random() < .5) { const sound = envSounds.events[Math.floor(Math.random() * envSounds.events.length)]; await this.playSound(sound, "event", .12 + Math.random() * .08); } } async playSound(sound, role, volume) { if (this.activeSounds.has(sound.id)) return; try { const url = sound.url || `https://sound-effects-media.bbcrewind.co.uk/mp3/${sound.id}.mp3`; const audio = new Audio; audio.crossOrigin = "anonymous"; audio.src = url; audio.preload = "auto"; const source = this.audioContext.createMediaElementSource(audio); const gainNode = this.audioContext.createGain(); gainNode.gain.value = volume; source.connect(gainNode); gainNode.connect(this.masterGainNode); this.activeSounds.set(sound.id, { sound, audio, source, gainNode, role, volume }); if (this.debug) { console.log("[Zengine] Sound started playing", { soundId: sound.id, description: sound.description, role, volume, category: sound.category, duration: sound.duration, activeCount: this.activeSounds.size }); } audio.addEventListener("ended", () => { this.removeSound(sound.id); if (role === "ambient" && this.isRunning) setTimeout(() => this.playSound(sound, role, volume), 1e3); }); audio.addEventListener("error", () => this.removeSound(sound.id)); await audio.play(); } catch (error) { console.error("[Zengine] Sound error:", sound.id, error); } } removeSound(soundId) { const instance = this.activeSounds.get(soundId); if (instance) { try { instance.audio.pause(); instance.gainNode.disconnect(); instance.source.disconnect(); } catch (e) {} if (this.debug) console.log("[Zengine] Sound removed", { soundId, description: instance.sound.description, activeCount: this.activeSounds.size - 1 }); this.activeSounds.delete(soundId); } } stop() { if (this.musicEngine.isPlaying) this.musicEngine.stop(); this.isRunning = false; if (this.eventLoopInterval) { clearInterval(this.eventLoopInterval); this.eventLoopInterval = null; } if (this.debug) console.log("[Zengine] Engine stopping", { activeSounds: this.activeSounds.size }); this.activeSounds.forEach((instance, id) => { try { instance.audio.pause(); instance.audio.currentTime = 0; } catch (e) {} const now = this.audioContext.currentTime; instance.gainNode.gain.cancelScheduledValues(now); instance.gainNode.gain.setValueAtTime(instance.gainNode.gain.value, now); instance.gainNode.gain.linearRampToValueAtTime(0, now + .5); setTimeout(() => this.removeSound(id), 500); }); if (this.audioContext && this.audioContext.state === "running") this.audioContext.suspend(); if (this.debug) console.log("[Zengine] Engine stopped"); } setMasterVolume(volume) { if (this.masterGainNode) { const oldVolume = this.masterGainNode.gain.value; this.masterGainNode.gain.value = volume; if (this.debug) console.log("[Zengine] Master volume changed", { from: oldVolume, to: volume, musicEngineVolume: volume * .25 }); } this.musicEngine.setMasterVolume(volume * .25); } } exports.Zengine = Zengine; /***/ }, /***/ 870(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.conditions = void 0; var _queue = __webpack_require__(372); const conditions = exports.conditions = { true: { title: "True", check: (ws, item, params) => true }, false: { title: "False", check: (ws, item, params) => false }, "account-admin": { title: "You are an admin", check: (ws, item, params) => ws.groups.sysop === true }, "item-selected": { title: "An item is selected", check: (ws, item, params) => item !== null }, "edit-selected": { title: "An edit is selected", check: (ws, item, params) => _queue.Queue.groups[item === null || item === void 0 ? void 0 : item.type] === "edit" }, "logevent-selected": { title: "A logentry is selected", check: (ws, item, params) => _queue.Queue.groups[item === null || item === void 0 ? void 0 : item.type] === "logevent" }, revertable: { title: "Current item is revertable", check: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return false; return true; } }, pending: { title: "Current item is pending review", check: (ws, item, params) => { if (!ws.queue.pending.has(item.id)) return false; return true; } }, "user-registered": { title: "Selected user is registered", check: (ws, item, params) => item.user.anon === false }, "user-ip": { title: "Selected user is an IP address", check: (ws, item, params) => item.user.ip === true }, "user-temp": { title: "Selected user is a temporary account", check: (ws, item, params) => item.user.temp === true }, "user-empty-talk": { title: "Selected user's talk page is empty", check: (ws, item, params) => item.user.talk === undefined }, "user-blocked": { title: "Selected user is blocked", check: (ws, item, params) => item.user.blocked === true }, "user-edit-count": { title: "Selected user's edit count is", parameters: (ws, item) => [ { id: "condition", title: "Condition", type: "choice", options: [ "<", "≤", "=", "≥", ">" ], default: "=" }, { id: "count", title: "Edit count", type: "number", default: 0 } ], check: (ws, item, params) => { const count = item.user.editcount === -1 ? Infinity : item.user.editcount || 0; const target = Number(params.count); switch (params.condition) { case "<": return count < target; case "≤": return count <= target; case "=": return count === target; case "≥": return count >= target; case ">": return count > target; default: return false; } } }, "user-final-warning": { title: "Selected user at final warning level", check: (ws, item, params) => item.user.warning === "4" || item.user.warning === "4im" }, "user-has-warnings": { title: "Selected user has no warnings", check: (ws, item, params) => item.user.warning !== "0" }, "edit-pending": { title: "Edit is pending", check: (ws, item, params) => ws.queue.pending.has(item === null || item === void 0 ? void 0 : item.id) }, "edit-minor": { title: "Edit is marked as minor", check: (ws, item, params) => item.minor === true }, "edit-size": { title: "Edit size is", parameters: (ws, item) => [ { id: "condition", title: "Condition", type: "choice", options: [ "<", "≤", "=", "≥", ">" ], default: "=" }, { id: "size", title: "Size", type: "number", default: 0 } ], check: (ws, item, params) => { const size = item.sizediff || 0; const target = Number(params.size); switch (params.condition) { case "<": return size < target; case "≤": return size <= target; case "=": return size === target; case "≥": return size >= target; case ">": return size > target; default: return false; } } }, "abs-edit-size": { title: "Absolute edit size is", parameters: (ws, item) => [ { id: "condition", title: "Condition", type: "choice", options: [ "<", "≤", "=", "≥", ">" ], default: "=" }, { id: "size", title: "Size", type: "number", min: 0, default: 0 } ], check: (ws, item, params) => { const size = Math.abs(item.sizediff || 0); const target = Number(params.size); switch (params.condition) { case "<": return size < target; case "≤": return size <= target; case "=": return size === target; case "≥": return size >= target; case ">": return size > target; default: return false; } } }, "edit-ores-score": { title: "Edit ORES score is", parameters: (ws, item) => [ { id: "condition", title: "Condition", type: "choice", options: [ "<", "≤", "=", "≥", ">" ], default: "=" }, { id: "score", title: "Score", type: "number", min: 0, max: 1, default: 0 } ], check: (ws, item, params) => { const score = item.ores_score || 0; const target = Number(params.score); switch (params.condition) { case "<": return score < target; case "≤": return score <= target; case "=": return score === target; case "≥": return score >= target; case ">": return score > target; default: return false; } } }, "user-highlighted": { title: "Selected user is highlighted", check: (ws, item, params) => ws.store.highlight.users.has(item.user.name) }, "user-whitelisted": { title: "Selected user is whitelisted", check: (ws, item, params) => ws.store.whitelist.users.has(item.user.name) }, "page-highlighted": { title: "Selected page is highlighted", check: (ws, item, params) => ws.store.highlight.pages.has(item.page.title) }, "page-whitelisted": { title: "Selected page is whitelisted", check: (ws, item, params) => ws.store.whitelist.pages.has(item.page.title) }, "page-watched": { title: "Selected page is watched", check: (ws, item, params) => item.page.watched === true }, "tag-highlighted": { title: "Selected edit has a highlighted tag", check: (ws, item, params) => { for (const tag of item.tags) { if (ws.store.highlight.tags.has(tag)) return true; } return false; } }, "tag-whitelisted": { title: "Selected edit has a whitelisted tag", check: (ws, item, params) => { for (const tag of item.tags) { if (ws.store.whitelist.tags.has(tag)) return true; } return false; } }, "in-recent-queue": { title: "In recent changes queue", check: (ws, item, params) => ws.queue.current.type === "recent" }, "in-pending-queue": { title: "In pending changes queue", check: (ws, item, params) => ws.queue.current.type === "pending" }, "in-user-queue": { title: "In user creations queue", check: (ws, item, params) => ws.queue.current.type === "users" }, "in-watchlist-queue": { title: "In watchlist queue", check: (ws, item, params) => ws.queue.current.type === "watchlist" } }; /***/ }, /***/ 9808(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.validateShortcut = exports.controls = exports.buildShortcut = void 0; const controls = exports.controls = new Set([ "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "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", "-", "=", "[", "]", "\\", ";", "'", ",", ".", "/", "_", "+", "{", "}", "|", ":", '"', "<", ">", "?", " ", "arrowleft", "arrowup", "arrowdown", "arrowright" ]); const buildShortcut = event => { const order = [ "ctrl", "shift", "alt" ]; const parts = []; order.forEach(mod => { if (event[`${mod}Key`]) parts.push(mod); }); const key = event.key.toLowerCase(); if (controls.has(key)) parts.push(key); return parts.join("+"); }; exports.buildShortcut = buildShortcut; const validateShortcut = shortcut => { const parts = shortcut.toLowerCase().split("+"); if (parts.length === 0) return false; const seen = new Set; for (const part of parts) { if (seen.has(part)) return false; seen.add(part); if (part !== "ctrl" && part !== "shift" && part !== "alt" && !controls.has(part)) return false; } return parts.some(part => part !== "ctrl" && part !== "shift" && part !== "alt"); }; exports.validateShortcut = validateShortcut; /***/ }, /***/ 985(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.events = void 0; var _queue = __webpack_require__(372); var _wikishield = __webpack_require__(7054); var _warnings = __webpack_require__(955); var _welcomes = __webpack_require__(863); var _scriptEsm = __webpack_require__(5643); const events = exports.events = { "next-item": { title: "Go to next item", icon: "fas fa-arrow-right", script: (ws, item, params) => { ws.queue.next(); return { valid: true }; } }, "previous-item": { title: "Go to previous item", icon: "fas fa-arrow-left", script: (ws, item, params) => { ws.queue.previous(); return { valid: true }; } }, "clear-queue": { title: "Clear queue", icon: "fas fa-trash-can", valid: (ws, item, params) => { if (ws.queue.current.type === "pending") return { valid: false, reason: "Pending edits queue cannot be cleared." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.clear(ws.queue.current.type); return { valid: true }; } }, "next-queue": { title: "Go to next queue", icon: "fas fa-forward", script: (ws, item, params) => { const queues = _queue.Queue.types.map(type => ({ name: type, ...ws.store.settings.queue[type] })); queues.sort((a, b) => a.order - b.order); const index = queues.findIndex(queue => queue.name === ws.queue.current.type); ws.queue.switch(queues[(index + 1) % queues.length].name); return { valid: true }; } }, "previous-queue": { title: "Go to previous queue", icon: "fas fa-forward", script: (ws, item, params) => { const queues = _queue.Queue.types.map(type => ({ name: type, ...ws.store.settings.queue[type] })); queues.sort((a, b) => a.order - b.order); const index = queues.findIndex(queue => queue.name === ws.queue.current.type); ws.queue.switch(queues[(index - 1 + queues.length) % queues.length].name); return { valid: true }; } }, "accept-pending-edit": { title: "Accept pending edit", icon: "fas fa-check", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Accepting pending edit", valid: (ws, item, params) => { if (!ws.rights.review) return { valid: false, reason: "You do not have permission to review pending changes." }; if (!ws.queue.pending.has(item.id)) return { valid: false, reason: "Pending edit can only be accepted when a pending edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { const pending = ws.queue.pending.get(item.id); if (!pending) return { valid: false, reason: "Pending edit not found." }; const count = `${pending.count || ""} pending revision${pending.count === 1 ? "" : "s"}`; const join = array => { switch (array.length) { case 0: case 1: { return array[0] || ""; } // removed by dead control flow case 2: { return `${array[0]} and ${array[1]}`; } // removed by dead control flow default: { return `${array.slice(0, -1).join(", ")}, and ${array[array.length - 1]}`; } // removed by dead control flow } }; const users = Object.entries(pending.users || {}).map(user => [ ws.api.user(user[0]), user[1] ]); users.sort((a, b) => b[1] - a[1]); // sort by number of edits const overflow = Math.max(users.reduce((sum, user) => { const len = user[0].length; if (sum[0] + len <= 250) return [ sum[0] + len, sum[1] + 1 ]; return sum; }, [ 0, 0 ])[1], 1); let userText = ""; const len = users.length; if (len > overflow) { const display = users.slice(0, overflow).map(user => user[0]); const remaining = len - display.length; userText = `${display.join(", ")}, and ${remaining} other${remaining === 1 ? "" : "s"}`; } else userText = join(users.map(user => user[0])); return await ws.api.acceptPendingEdit(item.pending.revid, ws.api.summary(`Accepted ${count} by ${userText}`, params.summary)); }, successful: (ws, item, params) => { ws.store.statistics.pending_changes_reviewed.accepted++; } }, "reject-pending-edit": { title: "Reject pending edit", icon: "fas fa-xmark", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Rejecting pending edit", valid: (ws, item, params) => { if (!ws.rights.review) return { valid: false, reason: "You do not have permission to review pending changes." }; if (!ws.queue.pending.has(item.id)) return { valid: false, reason: "Pending edit can only be rejected when a pending edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { const pending = ws.queue.pending.get(item.id); if (!pending) return { valid: false, reason: "Pending edit not found." }; const count = `${pending.count || ""} pending revision${pending.count === 1 ? "" : "s"}`; const join = array => { switch (array.length) { case 0: case 1: { return array[0] || ""; } // removed by dead control flow case 2: { return `${array[0]} and ${array[1]}`; } // removed by dead control flow default: { return `${array.slice(0, -1).join(", ")}, and ${array[array.length - 1]}`; } // removed by dead control flow } }; const users = Object.entries(pending.users || {}).map(user => [ ws.api.user(user[0]), user[1] ]); users.sort((a, b) => b[1] - a[1]); // sort by number of edits const overflow = Math.max(users.reduce((sum, user) => { const len = user[0].length; if (sum[0] + len <= 250) return [ sum[0] + len, sum[1] + 1 ]; return sum; }, [ 0, 0 ])[1], 1); let userText = ""; const len = users.length; if (len > overflow) { const display = users.slice(0, overflow).map(user => user[0]); const remaining = len - display.length; userText = `${display.join(", ")}, and ${remaining} other${remaining === 1 ? "" : "s"}`; } else userText = join(users.map(user => user[0])); return await ws.api.rejectPendingEdit(item.id, pending.prior, item.page.title, ws.api.summary(`Rejected ${count} by ${userText} to [[Special:Diff/${pending.prior}|last stable revision]]`, params.summary)); }, successful: (ws, item, params) => { ws.store.statistics.pending_changes_reviewed.rejected++; } }, revert: { title: "Revert and auto warn/report", icon: "fas fa-undo-alt", parameters: (ws, item) => [ { id: "warning", title: "Warning template", type: "choice", options: Object.keys(_warnings.warningsLookup), default: Object.keys(_warnings.warningsLookup)[0] } ], progress: "Reverting edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be reverted when an edit is selected." }; const warning = (0, _warnings.getWarningFromLookup)(params.warning); if (!("summary" in warning)) return { valid: false, reason: "Selected warning template does not support reverting." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags; const warning = (0, _warnings.getWarningFromLookup)(params.warning); await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Reverting yourself", `You are about to revert your own edit. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to revert their edit?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to revert the edit on it?`) === false || (_item$tags = item.tags) !== null && _item$tags !== void 0 && _item$tags.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to revert it?`) === false) return { valid: false, reason: "Revert cancelled by user." }; const rollback = await (async () => await ws.api.rollbackEdit(item.page.title, item.user.name, ws.api.summary(`Reverted edits by ${ws.api.user(item.user.name)}`, warning.summary)))(); if (!rollback.valid) return rollback; else { ws.store.statistics.reverts_made.total++; switch (item.type) { case "recent": { ws.store.statistics.reverts_made.from_recent_changes++; } break; case "pending": { ws.store.statistics.reverts_made.from_pending_changes++; } break; case "watchlist": { ws.store.statistics.reverts_made.from_watchlist++; } break; case "abuselog": { ws.store.statistics.reverts_made.from_abuse_log++; } break; default: { ws.store.statistics.reverts_made.from_loaded_edits++; } break; } } let oldLevel; const warn = await (async () => { const talk = `User talk:${item.user.name}`; const monthSection = ws.util.monthSectionName(); const content = (await ws.api.getPagesContent([ talk ]))[talk] || ""; const sections = ws.util.getPageSections(content); let section = "new"; const len = sections.length; for (let i = 0; i < len; i++) if (sections[i].title === monthSection) section = i + 1; let level; oldLevel = ws.queue.getWarningLevel(content); if (typeof warning.auto === "string") level = warning.auto; else if (typeof warning.auto === "function") level = warning.auto(item, oldLevel); else level = warning.auto[oldLevel]; const template = warning.templates.find(template => template.name === level.toString()); if (!template) return { valid: true }; // no warning to issue, still wanna check for reporting let summary = "Message about "; if (_queue.Queue.groups[item.type] === "edit") // kinda redundant but whatever summary += `[[Special:Diff/${item.id}|your edit]] on [[${item.page.title}]]`; else if (item.type === "abuselog") { if (item.revid) summary += `[[Special:Diff/${item.revid}|your edit]] on [[${item.page.title}]]`; else summary += `[[Special:AbuseLog/${item.id}|your contribution]] on [[${item.page.title}]]`; } else summary += `[[${item.page.title}]]`; let newContent = ""; if (section === "new") newContent = `{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)`; else newContent = `${sections[section - 1].heading}\n${sections[section - 1].content}\n\n{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)`; const result = await ws.api.editSection(talk, section, monthSection, newContent, ws.api.summary(summary, `${warning.name} (${template.name})`)); if (result.valid) { ws.queue.talks.set(item.user.name, true); const levels = [ "0", "1", "2", "3", "4", "4im" ]; if (levels.indexOf(level) > levels.indexOf(item.user.warning || "0")) ws.queue.warnings.set(item.user.name, level); ws.store.statistics.warnings_issued.total++; switch (level) { case "1": { ws.store.statistics.warnings_issued.level_1++; } break; case "2": { ws.store.statistics.warnings_issued.level_2++; } break; case "3": { ws.store.statistics.warnings_issued.level_3++; } break; case "4": { ws.store.statistics.warnings_issued.level_4++; } break; case "4im": { ws.store.statistics.warnings_issued.level_4im++; } break; } } return result; })(); if (!warn.valid) return warn; if (oldLevel === "4" || oldLevel === "4im") if (warning.reportable && ws.store.settings.auto_report.enabled && ws.store.settings.auto_report.for.has(params.warning)) { const report = await (async () => { if (await ws.api.areUsersBlocked([ item.user.name ])[item.user.name]) return { valid: false, reason: "User cannot be reported because they are blocked." }; return await ws.api.append(_wikishield.WikiShield.config.pages.AIV, null, (0, _scriptEsm.fullTrim)(`\n * {{vandal|${item.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)\n `), ws.api.summary(`Reporting ${ws.api.user(item.user.name)}`), page => { var _ws$util$getPageSecti; const content = (_ws$util$getPageSecti = ws.util.getPageSections(page).find(section => section.title === "User-reported")) === null || _ws$util$getPageSecti === void 0 ? void 0 : _ws$util$getPageSecti.content; return { valid: !(content !== null && content !== void 0 && content.includes(`{{vandal|${item.user.name}}`) || content !== null && content !== void 0 && content.includes(`{{IPVandal|${item.user.name}}`)), reason: "User has already been reported to AIV." }; }); })(); if (!report.valid) return { valid: true }; // invalid but everything worked so no need to throw an error else { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.AIV++; } } return { valid: true }; } }, "warn-and-report": { title: "Auto warn/report", icon: "fas fa-exclamation-triangle", parameters: (ws, item) => [ { id: "warning", title: "Warning template", type: "choice", options: Object.keys(_warnings.warningsLookup), default: Object.keys(_warnings.warningsLookup)[0] } ], progress: "Warning user", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be warned when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags2; const warning = (0, _warnings.getWarningFromLookup)(params.warning); await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Warning yourself", `You are about to warn yourself. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to warn them?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`) === false || (_item$tags2 = item.tags) !== null && _item$tags2 !== void 0 && _item$tags2.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?`) === false) return { valid: false, reason: "Warn cancelled by user." }; let oldLevel; const warn = await (async () => { const talk = `User talk:${item.user.name}`; const monthSection = ws.util.monthSectionName(); const content = (await ws.api.getPagesContent([ talk ]))[talk] || ""; const sections = ws.util.getPageSections(content); let section = "new"; const len = sections.length; for (let i = 0; i < len; i++) if (sections[i].title === monthSection) section = i + 1; let level; oldLevel = ws.queue.getWarningLevel(content); if (typeof warning.auto === "string") level = warning.auto; else if (typeof warning.auto === "function") level = warning.auto(item, oldLevel); else level = warning.auto[oldLevel]; const template = warning.templates.find(template => template.name === level.toString()); if (!template) return { valid: true }; // no warning to issue, still wanna check for reporting let summary = "Message about "; if (_queue.Queue.groups[item.type] === "edit") // kinda redundant but whatever summary += `[[Special:Diff/${item.id}|your edit]] on [[${item.page.title}]]`; else if (item.type === "abuselog") { if (item.revid) summary += `[[Special:Diff/${item.revid}|your edit]] on [[${item.page.title}]]`; else summary += `[[Special:AbuseLog/${item.id}|your contribution]] on [[${item.page.title}]]`; } else summary += `[[${item.page.title}]]`; let newContent = ""; if (section === "new") newContent = `{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)`; else newContent = `${sections[section - 1].heading}\n${sections[section - 1].content}\n\n{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)`; const result = await ws.api.editSection(talk, section, monthSection, newContent, ws.api.summary(summary, `${warning.name} (${template.name})`)); if (result.valid) { ws.queue.talks.set(item.user.name, true); const levels = [ "0", "1", "2", "3", "4", "4im" ]; if (levels.indexOf(level) > levels.indexOf(item.user.warning || "0")) ws.queue.warnings.set(item.user.name, level); ws.store.statistics.warnings_issued.total++; switch (level) { case "1": { ws.store.statistics.warnings_issued.level_1++; } break; case "2": { ws.store.statistics.warnings_issued.level_2++; } break; case "3": { ws.store.statistics.warnings_issued.level_3++; } break; case "4": { ws.store.statistics.warnings_issued.level_4++; } break; case "4im": { ws.store.statistics.warnings_issued.level_4im++; } break; } } return result; })(); if (!warn.valid) return warn; if (oldLevel === "4" || oldLevel === "4im") if (warning.reportable && ws.store.settings.auto_report.enabled && ws.store.settings.auto_report.for.has(params.warning)) { const report = await (async () => { if (await ws.api.areUsersBlocked([ item.user.name ])[item.user.name]) return { valid: false, reason: "User cannot be reported because they are blocked." }; return await ws.api.append(_wikishield.WikiShield.config.pages.AIV, null, (0, _scriptEsm.fullTrim)(`\n * {{vandal|${item.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)\n `), ws.api.summary(`Reporting ${ws.api.user(item.user.name)}`), page => { var _ws$util$getPageSecti2; const content = (_ws$util$getPageSecti2 = ws.util.getPageSections(page).find(section => section.title === "User-reported")) === null || _ws$util$getPageSecti2 === void 0 ? void 0 : _ws$util$getPageSecti2.content; return { valid: !(content !== null && content !== void 0 && content.includes(`{{vandal|${item.user.name}}`) || content !== null && content !== void 0 && content.includes(`{{IPVandal|${item.user.name}}`)), reason: "User has already been reported to AIV." }; }); })(); if (!report.valid) return { valid: true }; // invalid but everything worked so no need to throw an error else { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.AIV++; } } return { valid: true }; } }, "warn-user": { title: "Warn user", icon: "fas fa-exclamation-triangle", parameters: (ws, item) => [ { id: "warning", title: "Warning template", type: "choice", options: Object.keys(_warnings.warningsLookup), default: Object.keys(_warnings.warningsLookup)[0] }, { dependencies: [ "warning" ], id: "level", title: "Warning level", type: "choice", options: dependencies => [ "auto", ..._warnings.warningsLookup[dependencies.warning].templates.filter(template => template.generic === undefined).map(template => template.name) ], default: "auto" } ], continuity: true, progress: "Issuing warning to user", valid: (ws, item, params) => { var _getWarningFromLookup; if (!item) return { valid: false, reason: "User can only be warned when an item is selected." }; else if (params.level !== "auto" && ((_getWarningFromLookup = (0, _warnings.getWarningFromLookup)(params.warning)) === null || _getWarningFromLookup === void 0 ? void 0 : _getWarningFromLookup.templates[params.level]) === null) return { valid: false, reason: "Selected warning template does not support automatic level selection." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags3; await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Warning yourself", `You are about to warn yourself. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to warn them?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`) === false || (_item$tags3 = item.tags) !== null && _item$tags3 !== void 0 && _item$tags3.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?`) === false) return { valid: false, reason: "Warning cancelled by user." }; const warning = (0, _warnings.getWarningFromLookup)(params.warning); const talk = `User talk:${item.user.name}`; const monthSection = ws.util.monthSectionName(); const content = (await ws.api.getPagesContent([ talk ]))[talk] || ""; const sections = ws.util.getPageSections(content); let section = "new"; const len = sections.length; for (let i = 0; i < len; i++) if (sections[i].title === monthSection) section = i + 1; let level; if (params.level === "auto") { if (typeof warning.auto === "string") level = warning.auto; else if (typeof warning.auto === "function") level = warning.auto(item, ws.queue.getWarningLevel(content)); else level = warning.auto[ws.queue.getWarningLevel(content)]; } else level = params.level; const template = warning.templates.find(template => template.name === level.toString()); if (!template) { if (params.level !== "auto") return { valid: false, reason: "Selected warning template does not support the specified level." }; return { valid: true }; // no warning to issue, still wanna check for reporting } let summary = "Message about "; if (_queue.Queue.groups[item.type] === "edit") summary += `[[Special:Diff/${item.id}|your edit]] on [[${item.page.title}]]`; else if (item.type === "abuselog") { if (item.revid) summary += `[[Special:Diff/${item.revid}|your edit]] on [[${item.page.title}]]`; else summary += `[[Special:AbuseLog/${item.id}|your contribution]] on [[${item.page.title}]]`; } else summary += `[[${item.page.title}]]`; let newContent = ""; if (section === "new") newContent = `{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)`; else newContent = `${sections[section - 1].heading}\n${sections[section - 1].content}\n\n{{subst:${template.template}|${item.page.title}|${template.generic || ""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)`; const result = await ws.api.editSection(talk, section, monthSection, newContent, ws.api.summary(summary, `${warning.name} (${template.name})`)); if (result.valid) { ws.queue.talks.set(item.user.name, true); const levels = [ "0", "1", "2", "3", "4", "4im" ]; if (levels.indexOf(level) > levels.indexOf(item.user.warning || "0")) ws.queue.warnings.set(item.user.name, level); ws.store.statistics.warnings_issued.total++; switch (level) { case "1": { ws.store.statistics.warnings_issued.level_1++; } break; case "2": { ws.store.statistics.warnings_issued.level_2++; } break; case "3": { ws.store.statistics.warnings_issued.level_3++; } break; case "4": { ws.store.statistics.warnings_issued.level_4++; } break; case "4im": { ws.store.statistics.warnings_issued.level_4im++; } break; } } return result; } }, "rollback-edit": { title: "Rollback edit", icon: "fas fa-undo-alt", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" }, { id: "hide_username", title: "Hide username", type: "choice", options: [ "Yes", "No" ], default: "No" } ], progress: "Rolling back edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be rolled back when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags4; await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Rollbacking own edit", `You are about to revert your own edit. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`) === false || (_item$tags4 = item.tags) !== null && _item$tags4 !== void 0 && _item$tags4.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to rollback it?`) === false) return { valid: false, reason: "Rollback cancelled by user." }; const user = params.hide_username === "Yes" ? "" : ` by ${ws.api.user(item.user.name)}`; return await ws.api.rollbackEdit(item.page.title, item.user.name, ws.api.summary(`Reverted edits${user}`, params.summary)); }, successful: (ws, item, params) => { ws.store.statistics.reverts_made.total++; switch (item.type) { case "recent": { ws.store.statistics.reverts_made.from_recent_changes++; } break; case "pending": { ws.store.statistics.reverts_made.from_pending_changes++; } break; case "watchlist": { ws.store.statistics.reverts_made.from_watchlist++; } break; case "abuselog": { ws.store.statistics.reverts_made.from_abuse_log++; } break; default: { ws.store.statistics.reverts_made.from_loaded_edits++; } break; } } }, "rollback-goodfaith-edit": { title: "Rollback good faith edit", icon: "fas fa-undo-alt", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" }, { id: "hide_username", title: "Hide username", type: "choice", options: [ "Yes", "No" ], default: "No" } ], progress: "Rolling back good faith edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be rolled back when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags5; await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Rollbacking own edit", `You are about to revert your own edit. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`) === false || (_item$tags5 = item.tags) !== null && _item$tags5 !== void 0 && _item$tags5.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to rollback it?`) === false) return { valid: false, reason: "Rollback cancelled by user." }; const user = params.hide_username === "Yes" ? "" : ` by ${ws.api.user(item.user.name)}`; return await ws.api.rollbackEdit(item.page.title, item.user.name, ws.api.summary(`Reverted [[Wp:AGF|Good faith]] edits${user}`, params.summary)); }, successful: (ws, item, params) => { ws.store.statistics.reverts_made.total++; ws.store.statistics.reverts_made.good_faith++; switch (item.type) { case "recent": { ws.store.statistics.reverts_made.from_recent_changes++; } break; case "pending": { ws.store.statistics.reverts_made.from_pending_changes++; } break; case "watchlist": { ws.store.statistics.reverts_made.from_watchlist++; } break; case "abuselog": { ws.store.statistics.reverts_made.from_abuse_log++; } break; default: { ws.store.statistics.reverts_made.from_loaded_edits++; } break; } } }, "undo-edit": { title: "Undo edit", icon: "fas fa-undo", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" }, { id: "hide_username", title: "Hide username", type: "choice", options: [ "Yes", "No" ], default: "No" } ], progress: "Undoing edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be undone when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _item$tags6; await ws.gui.settings.waitForClose(); if (item.user.name === ws.api.username && await ws.gui.dialog.confirm("Undoing own edit", `You are about to undo your own edit. Are you sure you want to proceed?`) === false || ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to undo their edit?`) === false || ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to undo the edit on it?`) === false || (_item$tags6 = item.tags) !== null && _item$tags6 !== void 0 && _item$tags6.some(tag => ws.store.whitelist.tags.has(tag)) && await ws.gui.dialog.confirm("Edit is whitelisted", `This edit has one or more whitelisted tags. Are you sure you want to undo it?`) === false) return { valid: false, reason: "Undo cancelled by user." }; const user = params.hide_username === "Yes" ? "" : ` by ${ws.api.user(item.user.name)}`; return await ws.api.undoEdit(item.page.title, item.id, ws.api.summary(`Undid revision ${ws.api.revision(item.id)}${user}`, params.summary)); } }, "restore-edit": { title: "Restore edit", icon: "fas fa-redo", parameters: (ws, item) => [ { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Restoring edit", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit can only be restored when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => await ws.api.restoreEdit(item.page.title, item.id, ws.api.summary(`Restored revision ${ws.api.revision(item.id)} by ${ws.api.user(item.user.name)}`, params.summary)) }, "send-message-to-user-talk": { title: "Send message to user talk page", icon: "fas fa-comment", parameters: (ws, item) => [ { id: "heading", title: "Section heading", type: "text" }, { id: "message", title: "Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC))", type: "text" } ], progress: "Sending message to user talk page", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Message can only be sent when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => await ws.api.editSection(`User talk:${item.user.name}`, "new", params.heading, params.message, ws.api.summary(`Message from ${ws.api.username}: ${params.heading}`)) }, "send-message-to-page-talk": { title: "Send message to page talk page", icon: "fas fa-comment", parameters: (ws, item) => [ { id: "heading", title: "Section heading", type: "text" }, { id: "message", title: "Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC))", type: "text" } ], progress: "Sending message to page talk page", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Message can only be sent when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { const title = item.page.title.split(":"); let ns = "Talk"; if (title.length > 1) ns = title[0].toLowerCase().includes("talk") ? title[0] : `${title[0]} talk`; const page = `${ns}:${title.length === 1 ? title[0] : title.slice(1).join(":")}`; return await ws.api.editSection(page, "new", params.heading, params.message, ws.api.summary(`Message from ${ws.api.username}: ${params.heading}`)); } }, "report-user-to-aiv": { title: "Report user to AIV", icon: "fas fa-flag", parameters: (ws, item) => [ { id: "reason", title: "Reason", type: "choice", options: [ "Vandalism past final warning", "Vandalism-only account", "Vandalism after recent release of block", "Spambot or compromised account", "Long-term abuse" ], default: "Vandalism past final warning" }, { id: "summary", title: "Summary (optional)", type: "text" } ], continuity: true, progress: "Reporting user to AIV", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be reported when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { if (item.user.name === ws.api.username) return { valid: false, reason: "You cannot report yourself, silly!" }; await ws.gui.settings.waitForClose(); if (ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to report them?`) === false) return { valid: false, reason: "User report cancelled by user." }; if (await ws.api.areUsersBlocked([ item.user.name ])[item.user.name]) return { valid: false, reason: "User cannot be reported because they are blocked." }; return await ws.api.append(_wikishield.WikiShield.config.pages.AIV, null, (0, _scriptEsm.fullTrim)(`\n * {{vandal|${item.user.name}}} &ndash; ${params.reason}${params.summary ? `: ${params.summary}` : ""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)\n `), ws.api.summary(`Reporting ${ws.api.user(item.user.name)}`), page => { var _ws$util$getPageSecti3; const content = (_ws$util$getPageSecti3 = ws.util.getPageSections(page).find(section => section.title === "User-reported")) === null || _ws$util$getPageSecti3 === void 0 ? void 0 : _ws$util$getPageSecti3.content; return { valid: !(content !== null && content !== void 0 && content.includes(`{{vandal|${item.user.name}}`) || content !== null && content !== void 0 && content.includes(`{{IPVandal|${item.user.name}}`)), reason: "User has already been reported to AIV." }; }); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.AIV++; } }, "report-user-to-uaa": { title: "Report user to UAA", icon: "fas fa-user-slash", parameters: (ws, item) => [ { id: "reason", title: "Reason", type: "choice", options: [ "Disruptive username", "Offensive username", "Promotional username", "Misleading username" ], default: "Disruptive username" }, { id: "summary", title: "Summary (optional)", type: "text" } ], continuity: true, progress: "Reporting user to UAA", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be reported when an item is selected." }; else if (item.user.anon) return { valid: false, reason: "User cannot be reported because they are anonymous." }; return { valid: true }; }, script: async (ws, item, params) => { if (item.user.name === ws.api.username) return { valid: false, reason: "You cannot report yourself, silly!" }; await ws.gui.settings.waitForClose(); if (ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to report them?`) === false) return { valid: false, reason: "User report cancelled by user." }; if (await ws.api.areUsersBlocked([ item.user.name ])[item.user.name]) return { valid: false, reason: "User cannot be reported because they are blocked." }; const username = params.reason === "Offensive username" ? "offensive username" : ws.api.user(item.user.name); return await ws.api.append(_wikishield.WikiShield.config.pages.UAA, null, (0, _scriptEsm.fullTrim)(`\n * {{user-uaa|${item.user.name}}} &ndash; ${params.reason}${params.summary ? `: ${params.summary}` : ""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)\n `), ws.api.summary(`Reporting ${username}`), page => { var _ws$util$getPageSecti4; return { valid: !((_ws$util$getPageSecti4 = ws.util.getPageSections(page).find(section => section.title === "User-reported")) !== null && _ws$util$getPageSecti4 !== void 0 && _ws$util$getPageSecti4.content.includes(`{{user-uaa|${item.user.name}}`)), reason: "User has already been reported to UAA." }; }); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.UAA++; } }, "request-page-protection": { title: "Request page protection", icon: "fas fa-shield-alt", parameters: (ws, item) => [ { id: "level", title: "Protection level", type: "choice", options: [ ...ws.api.hasPendingChanges ? [ "Pending changes protection" ] : [], "Semi-protection", "Extended-confirmed protection", "Full protection", "Move protection", "Template protection" ], default: "Semi-protection" }, { id: "reason", title: "Reason", type: "choice", options: [ "Generic", "Persistent vandalism", "Disruptive editing", "Edit warring", "BLP violations", "Sockpuppetry", "Arbitration enforcement" ], default: "Generic" }, { id: "duration", title: "Duration", type: "choice", options: [ "Temporary", "Indefinite" ], default: "Temporary" }, { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Requesting page protection", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Page protection can only be requested for edits." }; return { valid: true }; }, script: async (ws, item, params) => { // what in the skibidi is this structured spaghetti code await ws.gui.settings.waitForClose(); if (ws.store.whitelist.pages.has(item.page.title) && await ws.gui.dialog.confirm("Page is whitelisted", `The page <a href="https://${ws.server}/wiki/${encodeURIComponent(item.page.title)}" target="_blank">${item.page.title}</a> is whitelisted. Are you sure you want to request protection for it?`) === false) return { valid: false, reason: "Page protection request cancelled by user." }; const reason = params.reason === "Generic" ? params.summary : `${params.reason} &ndash; ${params.summary}`; return await ws.api.append(_wikishield.WikiShield.config.pages.RFPP, null, `\n${(0, _scriptEsm.fullTrim)(`\n === [[${item.page.title}]] ===\n * {{pagelinks|${item.page.title}}}\n '''${params.duration} ${params.level.toLowerCase()}'''${reason ? `: ${reason}` : ""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)\n `)}`, ws.api.summary(`Requesting ${params.level} protection for [[${item.page.title}]]`), page => ({ valid: !ws.util.getPageSections(page).some(section => section.title === `[[${item.page.title}]]`), reason: "Page protection has already been requested for this page." })); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.RFPP++; } }, "request-global-block": { title: "Request global block", icon: "fas fa-ban", parameters: (ws, item) => [ { id: "reason", title: "Reason", type: "choice", options: [ "Generic", "Long-term abuse", "Cross-wiki abuse", "Spam / spambot", "Compromised account" ], default: "Generic" }, { id: "summary", title: "Summary (optional)", type: "text" } ], progress: "Requesting global block", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Global block can only be requested when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { var _Object$entries$find; if (item.user.name === ws.api.username) return { valid: false, reason: "You cannot request a global block for yourself, silly!" }; await ws.gui.settings.waitForClose(); if (ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to request a global block for them?`) === false) return { valid: false, reason: "Global block request cancelled by user." }; if (await ws.api.isUserGloballyLocked(item.user.name)) return { valid: false, reason: "User is globally locked." }; const reason = params.reason === "Generic" ? params.summary : `${params.reason}. ${params.summary}`; const page = (await ws.api.getPagesContent([ _wikishield.WikiShield.config.pages.SRG ], true, "meta.wikimedia.org"))[_wikishield.WikiShield.config.pages.SRG] || ""; const sections = ws.util.getPageSections(page); return await ws.api.append(_wikishield.WikiShield.config.pages.SRG, Number((_Object$entries$find = Object.entries(sections).find(([, section]) => section.level === 2 && section.title === "Requests for global (un)block")) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0]) + 1 || undefined, `\n${(0, _scriptEsm.fullTrim)(`\n === Global block for ${item.user.name} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{Luxotool|${item.user.name}}}\n ${reason ? `${reason} ` : ""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)\n `)}`, ws.api.summary(`Requesting global block for ${ws.api.user(item.user.name)}`), page => { let searching = false; let sections = []; for (const section of ws.util.getPageSections(page)) { if (section.level === 2) { if (section.title === "Requests for global (un)block") searching = true; else if (searching) break; } else if (searching && section.level === 3) sections.push(section); } sections = sections.filter(section => !section.content.match(/^{{Status\|not done}}/i)); return { valid: !sections.some(section => { const content = section.content; if (content.match(new RegExp(`{{Luxotool\\|(?:\\d+=)?\\s*${ws.util.escapeRegex(item.user.name)}}}`, "i"))) return true; else if (content.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${ws.util.escapeRegex(item.user.name)}(?:\\|hidename=1)?(?:\\||})`, "i"))) return true; return false; }), reason: "User has already been requested for global block." }; }, false, "meta.wikimedia.org"); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.global_block++; } }, "request-global-lock": { title: "Request global lock", icon: "fas fa-lock", parameters: (ws, item) => [ { id: "reason", title: "Reason", type: "choice", options: [ "Generic", "Long-term abuse", "Cross-wiki abuse", "Abusive-username", "Spam / spambot", "Compromised account" ], default: "Generic" }, { id: "summary", title: "Summary (optional)", type: "text" }, { id: "hide_username", title: "Hide username", type: "choice", options: [ "Yes", "No" ], default: "No" } ], progress: "Requesting global lock", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Global lock can only be requested when an item is selected." }; else if (item.user.anon) return { valid: false, reason: "Global lock cannot be requested for anonymous users." }; return { valid: true }; }, script: async (ws, item, params) => { var _Object$entries$find2; if (item.user.name === ws.api.username) return { valid: false, reason: "You cannot request a global lock for yourself, silly!" }; await ws.gui.settings.waitForClose(); if (ws.store.whitelist.users.has(item.user.name) && await ws.gui.dialog.confirm("User is whitelisted", `The user <a href="https://${ws.server}/wiki/User:${encodeURIComponent(item.user.name)}" target="_blank">${item.user.name}</a> is whitelisted. Are you sure you want to request a global lock for them?`) === false) return { valid: false, reason: "Global lock request cancelled by user." }; if (await ws.api.isUserGloballyLocked(item.user.name)) return { valid: false, reason: "User is already globally locked." }; const reason = params.reason === "Generic" ? params.summary : `${params.reason}. ${params.summary}`; const user = params.hide_username === "Yes" ? "" : ` for ${ws.api.centralAuthUser(item.user.name)}`; const page = (await ws.api.getPagesContent([ _wikishield.WikiShield.config.pages.SRG ], true, "meta.wikimedia.org"))[_wikishield.WikiShield.config.pages.SRG] || ""; const sections = ws.util.getPageSections(page); return await ws.api.append(_wikishield.WikiShield.config.pages.SRG, Number((_Object$entries$find2 = Object.entries(sections).find(([, section]) => section.level === 2 && section.title === "Requests for global (un)lock and (un)hiding")) === null || _Object$entries$find2 === void 0 ? void 0 : _Object$entries$find2[0]) + 1 || undefined, `\n${(0, _scriptEsm.fullTrim)(`\n === Global lock${user} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{LockHide|${item.user.name}${params.hide_username === "Yes" ? "|hidename=1" : ""}}}\n ${reason ? `${reason} ` : ""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)\n `)}`, ws.api.summary(`Requesting global lock${user}`), page => { let searching = false; let sections = []; for (const section of ws.util.getPageSections(page)) { if (section.level === 2) { if (section.title === "Requests for global (un)lock and (un)hiding") searching = true; else if (searching) break; } else if (searching && section.level === 3) sections.push(section); } sections = sections.filter(section => !section.content.match(/^{{Status\|not done}}/i)); return { valid: !sections.some(section => { const content = section.content; if (content.match(new RegExp(`{{LockHide\\|(?:\\d+=)?\\s*${ws.util.escapeRegex(item.user.name)}(\\|hidename=1)?}}`, "i"))) return true; else if (content.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${ws.util.escapeRegex(item.user.name)}(?:\\|hidename=1)?(?:\\||})`, "i"))) return true; return false; }), reason: "User has already been requested for global lock." }; }, false, "meta.wikimedia.org"); }, successful: (ws, item, params) => { ws.store.statistics.reports_filed.total++; ws.store.statistics.reports_filed.global_lock++; } }, "thank-user": { title: "Thank user", icon: "fas fa-handshake", progress: "Thanking user", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "User can only be thanked when an edit is selected." }; return { valid: true }; }, script: async (ws, item, params) => { const summary = ws.api.summary(`Thank you for [[Special:Diff/${item.id}|your edit]] on [[${item.page.title}]]`); const page = `User talk:${item.user.name}`; if (item.user.temp) { const result = await ws.api.thankRevision(item.id); if (result.valid || ws.store.settings.talk_page_thanks_for_temporary_users.enabled) { if ((await ws.api.pagesExist(page))[page] === undefined) // if talk page doesn't exist, we can use the welcome, thanks template =) await ws.api.editSection(page, "new", "Thank you!", "{{subst:Thanks-autosign}}", summary); } return result; // if the talk page thank failed, at least the revision thank went through } else if (item.user.ip) return await ws.api.editSection(page, "new", "Thank you!", "{{subst:Thanks-autosign}}", summary); else return await ws.api.thankRevision(item.id); }, successful: (ws, item, params) => { ws.store.statistics.edits_reviewed.thanked++; } }, "welcome-user": { title: "Welcome user", icon: "fas fa-paper-plane", parameters: (ws, item) => [ { id: "template", title: "Template", type: "choice", options: Object.keys(_welcomes.welcomes), default: Object.keys(_welcomes.welcomes)[0] } ], progress: "Welcoming user", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be welcomed when an item is selected." }; else if (item.user.talk !== undefined) return { valid: false, reason: "User cannot be welcomed because their talk page is not empty." }; return { valid: true }; }, script: async (ws, item, params) => await (async () => { const page = `User talk:${item.user.name}`; if ((await ws.api.pagesExist([ page ]))[page] !== undefined) return { valid: false, reason: "User cannot be welcomed because their talk page is not empty." }; let template = _welcomes.welcomes[params.template]; if (!template) return { valid: false, reason: "Selected welcome template does not exist." }; const DONT_CRASH_ANY_COMPUTERS_PLEASE = new Set([ template ]); while (typeof ((_template = template) === null || _template === void 0 ? void 0 : _template.template) === "function") { var _template, _ws$gui$dialog$toast; template = _welcomes.welcomes[template.template(ws, item)]; if (DONT_CRASH_ANY_COMPUTERS_PLEASE.has(template)) return (_ws$gui$dialog$toast = void ws.gui.dialog.toast("REPORT TO DEVELOPER", "Uh oh! Something has gone <i>cat</i>astrophically wrong. Please report this to a developer, and include the error code below:<br><br><code>WELCOME_TEMPLATE_LOOP</code>", "dev", -1)) !== null && _ws$gui$dialog$toast !== void 0 ? _ws$gui$dialog$toast : { valid: false }; if (!template) return { valid: false, reason: "Selected welcome template does not exist." }; DONT_CRASH_ANY_COMPUTERS_PLEASE.add(template); } const content = `{{subst:${template.template}}}${template.sign ? ` [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:07, 25 May 2026 (UTC)` : ""}`; return await ws.api.append(page, null, content, ws.api.summary(`Welcome to Wikipedia!`)); })(), successful: (ws, item, params) => { ws.store.statistics.users_welcomed.total++; ws.queue.talks.set(item.user.name, true); ws.gui.renderQueue(); } }, "watch-page": { title: "Watch page", icon: "fas fa-eye", progress: "Watching page", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be watched when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => await ws.api.watchPage(item.page.title, ws.util.utcString(ws.util.expiryToDate(ws.store.settings.expiry.watchlist))), successful: (ws, item, params) => { ws.store.statistics.watchlist.watched++; ws.queue.watchlist.set(item.page.title, true); } }, "unwatch-page": { title: "Unwatch page", icon: "fas fa-eye-slash", progress: "Unwatching page", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be unwatched when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => await ws.api.unwatchPage(item.page.title), successful: (ws, item, params) => { ws.store.statistics.watchlist.unwatched++; ws.queue.watchlist.set(item.page.title, false); } }, "whitelist-user": { title: "Add user to whitelist", icon: "fas fa-user-check", progress: "Adding user to whitelist", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be added to whitelist when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.whitelist.users.set(item.user.name, [ Date.now(), ws.util.expiryToDate(ws.store.settings.expiry.whitelist.users).valueOf() ]); ws.store.statistics.items_whitelisted.total++; ws.store.statistics.items_whitelisted.users++; ws.gui.renderQueue(); return { valid: true }; } }, "unwhitelist-user": { title: "Remove user from whitelist", icon: "fas fa-user-minus", progress: "Removing user from whitelist", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be removed from whitelist when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.whitelist.users.delete(item.user.name); ws.gui.renderQueue(); return { valid: true }; } }, "whitelist-page": { title: "Add page to whitelist", icon: "fas fa-check", progress: "Adding page to whitelist", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be added to whitelist when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.whitelist.pages.set(item.page.title, [ Date.now(), ws.util.expiryToDate(ws.store.settings.expiry.whitelist.pages).valueOf() ]); ws.store.statistics.items_whitelisted.total++; ws.store.statistics.items_whitelisted.pages++; ws.gui.renderQueue(); return { valid: true }; } }, "unwhitelist-page": { title: "Remove page from whitelist", icon: "fas fa-minus", progress: "Removing page from whitelist", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be removed from whitelist when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.whitelist.pages.delete(item.page.title); ws.gui.renderQueue(); return { valid: true }; } }, "highlight-user": { title: "Add user to highlighted users", icon: "fas fa-star", progress: "Adding user to highlighted users", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be added to highlighted users when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.highlight.users.set(item.user.name, [ Date.now(), ws.util.expiryToDate(ws.store.settings.expiry.highlight.users).valueOf() ]); ws.store.statistics.items_highlighted.total++; ws.store.statistics.items_highlighted.users++; ws.gui.renderQueue(); return { valid: true }; } }, "unhighlight-user": { title: "Remove user from highlighted users", icon: "fas fa-user-minus", progress: "Removing user from highlighted users", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User can only be removed from highlighted users when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.highlight.users.delete(item.user.name); ws.gui.renderQueue(); return { valid: true }; } }, "highlight-page": { title: "Add page to highlighted pages", icon: "fas fa-star", progress: "Adding page to highlighted pages", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be added to highlighted pages when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.highlight.pages.set(item.page.title, [ Date.now(), ws.util.expiryToDate(ws.store.settings.expiry.highlight.pages).valueOf() ]); ws.store.statistics.items_highlighted.total++; ws.store.statistics.items_highlighted.pages++; ws.gui.renderQueue(); return { valid: true }; } }, "unhighlight-page": { title: "Remove page from highlighted pages", icon: "fas fa-minus", progress: "Removing page from highlighted pages", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be removed from highlighted pages when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.store.highlight.pages.delete(item.page.title); ws.gui.renderQueue(); return { valid: true }; } }, "refresh-user-contributions": { title: "Refresh user contributions", icon: "fas fa-rotate", progress: "Refreshing user contributions", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User contributions can only be refreshed when an item is selected." }; return { valid: true }; }, script: async (ws, item, params) => { try { var _user$contributions; document.querySelector("#refresh-page-history").classList.add("refreshing"); const user = (await ws.api.parseUsers([ item.user.name ]))[0].user; ws.queue.talks.set(item.user.name, user.talk); ws.queue.contributions.set(item.user.name, user.contributions); ws.queue.blocked.set(item.user.name, user.blocked); ws.queue.blocks.set(item.user.name, user.blocks); item.user.edits = Math.max(user.edits, ((_user$contributions = user.contributions) === null || _user$contributions === void 0 ? void 0 : _user$contributions.length) || 0); item.user.warning = ws.queue.getWarningLevel(user.talk || ""); item.user.warnings = ws.queue.getWarningHistory(user.talk || ""); delete item.user.cached_contributions; ws.gui.renderQueue(); if (ws.queue.current.item === item) ws.gui.newCurrentItem(item); return { valid: true }; } catch (err) { console.error(err); return { valid: false, reason: "An error occurred while fetching user contributions." }; } } }, "refresh-page-history": { title: "Refresh page history", icon: "fas fa-rotate", progress: "Refreshing page history", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page history can only be refreshed when an item is selected." }; else if (item.type === "users") return { valid: false, reason: "Page history cannot be refreshed for user creations." }; return { valid: true }; }, script: async (ws, item, params) => { try { document.querySelector("#refresh-page-history").classList.add("refreshing"); const [history, detailsData] = await Promise.all([ ws.api.getHistory(item.page.title), ws.api.getPagesDetails(item.page.title) ]); const details = detailsData[item.page.title]; ws.queue.histories.set(item.page.title, history); item.page.metadata = details.metadata; item.page.categories = details.categories; item.page.protection = details.protection; delete item.page.cached_history; ws.gui.renderQueue(); if (ws.queue.current.item === item) ws.gui.newCurrentItem(item); return { valid: true }; } catch (err) { console.error(err); return { valid: false, reason: "An error occurred while fetching page history." }; } } }, "open-user-page": { title: "Open user page", icon: "fas fa-circle-user", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User page can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`User:${item.user.name}`)); return { valid: true }; } }, "open-user-talk": { title: "Open user talk page", icon: "fas fa-comment", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User talk page can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`User talk:${item.user.name}`)); return { valid: true }; } }, "open-user-contributions": { title: "Open user contributions", icon: "fas fa-list", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User contributions can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`Special:Contributions/${item.user.name}`)); return { valid: true }; } }, "open-user-filter-log": { title: "Open user filter log", icon: "fas fa-filter", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "User filter log can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`?title=Special:AbuseLog&wpSearchUser=${encodeURIComponent(item.user.name)}`, true)); return { valid: true }; } }, "open-page": { title: "Open page", icon: "fas fa-file", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(item.page.title)); return { valid: true }; } }, "open-page-talk": { title: "Open page talk", icon: "fas fa-comments", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page talk can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { const title = item.page.title.split(":"); let ns = "Talk"; if (title.length > 1) ns = title[0].toLowerCase().includes("talk") ? title[0] : `${title[0]} talk`; const page = ws.page(`${ns}:${title.length === 1 ? title[0] : title.slice(1).join(":")}`); ws.open(page); return { valid: true }; } }, "open-page-history": { title: "Open page history", icon: "fas fa-clock-rotate-left", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Page history can only be opened when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`Special:PageHistory/${item.page.title}`)); return { valid: true }; } }, "open-revision": { title: "Open revision", icon: "fas fa-file-lines", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Revision can only be opened for edits." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`Special:Permalink/${item.id}`)); return { valid: true }; } }, "open-diff": { title: "Open diff", icon: "fas fa-code-compare", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Diff can only be opened for edits." }; return { valid: true }; }, script: (ws, item, params) => { ws.open(ws.page(`Special:Diff/${item.id}`)); return { valid: true }; } }, "copy-link": { title: "Copy link", icon: "fas fa-link", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Link can only be copied when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { if (item.group === "edit") navigator.clipboard.writeText(ws.page(`?diff=${item.id}`, true)); else if (item.group === "logevent") navigator.clipboard.writeText(ws.page(`?title=Special:Log&logid=${item.id}`, true)); else if (item.group === "abuselog") { if (item.revid) navigator.clipboard.writeText(ws.page(`?diff=${item.revid}`, true)); else navigator.clipboard.writeText(ws.page(`?title=Special:AbuseLog/${item.id}`, true)); } else { ws.gui.dialog.toast("Cannot copy link", `Please report this issue to a developer, including the error code below:<br><br><code>UNKNOWN_ITEM_GROUP_FOR_LINK_COPY</code>`, "error", 3e3); return { valid: false }; } ws.gui.dialog.toast("Link copied", `The link has been copied to your clipboard.`, "success", 3e3); return { valid: true }; } }, "open-revert-menu": { title: "Open revert menu", icon: "fas fa-undo", valid: (ws, item, params) => { let type = item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Revert menu is only available for edits." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="revert"]'); const $container = document.querySelector("#revert-menu"); $container.innerHTML = ""; ws.gui.createWarnMenu("reverts", $container, item); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "open-warn-menu": { title: "Open warn menu", icon: "fas fa-exclamation-triangle", valid: (ws, item, params) => { if (!item) return { valid: false, reason: "Warning menu is only available when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="warn"]'); const $container = document.querySelector("#warn-menu"); $container.innerHTML = ""; ws.gui.createWarnMenu("warnings", $container, item); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "open-user-menu": { title: "Open user menu", icon: "fas fa-flag", valid: (ws, item, params) => { if (!ws.queue.current.item) return { valid: false, reason: "User menu is only available when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="user"]'); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "open-page-menu": { title: "Open page menu", icon: "fas fa-flag", valid: (ws, item, params) => { if (!ws.queue.current.item) return { valid: false, reason: "Page menu is only available when an item is selected." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="page"]'); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "open-edit-menu": { title: "Open edit menu", icon: "fas fa-flag", valid: (ws, item, params) => { let type = ws.queue.current.item.type; if (type === "abuselog" && item.revid) type = "edit"; // treat abuse log items with revids as edits for the sake of the revert menu if (_queue.Queue.groups[type] !== "edit") return { valid: false, reason: "Edit menu is only available for edits." }; return { valid: true }; }, script: (ws, item, params) => { const $button = document.querySelector('[data-menu="edit"]'); if ($button) { const $trigger = $button.querySelector(".bottom-tool-trigger"); const $menu = document.querySelector(`#${$button.dataset.menu}-menu`); if ($trigger && $menu) { if ($menu.classList.contains("show")) { $menu.classList.remove("show"); $trigger.classList.remove("active"); } else { ws.gui.closeMenus(); $menu.classList.add("show"); $trigger.classList.add("active"); ws.gui.positionBottomMenu($button, $menu); } } } return { valid: true }; } }, "switch-to-recent-queue": { title: "Switch to recent changes queue", icon: "fas fa-stopwatch", valid: (ws, item, params) => { if (!ws.store.settings.queue.recent.enabled) return { valid: false, reason: "Recent changes queue is not enabled." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("recent"); return { valid: true }; } }, "switch-to-pending-queue": { title: "Switch to pending changes queue", icon: "fas fa-flag", valid: (ws, item, params) => { if (!ws.store.settings.queue.pending.enabled) return { valid: false, reason: "Pending changes queue is not enabled." }; else if (!ws.rights.review) return { valid: false, reason: "You do not have permission to review pending changes." }; else if (!ws.api.hasPendingChanges) return { valid: false, reason: "The pending changes extension is not enabled on this wiki." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("pending"); return { valid: true }; } }, "switch-to-watchlist-queue": { title: "Switch to watchlist queue", icon: "fas fa-book-bookmark", valid: (ws, item, params) => { if (!ws.store.settings.queue.watchlist.enabled) return { valid: false, reason: "Watchlist queue is not enabled." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("watchlist"); return { valid: true }; } }, "switch-to-users-queue": { title: "Switch to user creation logs queue", icon: "fas fa-user-plus", valid: (ws, item, params) => { if (!ws.store.settings.queue.users.enabled) return { valid: false, reason: "User creation logs queue is not enabled." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("users"); return { valid: true }; } }, "switch-to-abuselog-queue": { title: "Switch to abuse log queue", icon: "fas fa-filter-circle-xmark", valid: (ws, item, params) => { if (!ws.store.settings.queue.abuselog.enabled) return { valid: false, reason: "Abuse log queue is not enabled." }; return { valid: true }; }, script: (ws, item, params) => { ws.queue.switch("abuselog"); return { valid: true }; } }, "toggle-zen-mode": { title: "Toggle zen mode", icon: "fas fa-spa", script: (ws, item, params) => { var _document$querySelect; ws.store.settings.zen.enabled = !ws.store.settings.zen.enabled; (_document$querySelect = document.querySelector("#zen-mode-enable")) === null || _document$querySelect === void 0 || _document$querySelect.classList.toggle("active", ws.store.settings.zen.enabled); ws.gui.updateZenMode(); return { valid: true }; } }, "toggle-consecutive-edits": { title: "Toggle consecutive edits", icon: "fas fa-users", valid: (ws, item, params) => { const type = ws.queue.current.type; if (type !== "recent" && type !== "watchlist") return { valid: false, reason: "Consecutive edits can only be viewed in the recent changes or watchlist queues." }; return { valid: true }; }, script: (ws, item, params) => { const $consecutive = document.querySelector("#consecutive-edits-tab"); if (!$consecutive.classList.contains("hidden")) { if ($consecutive.classList.contains("selected")) document.querySelector("latest-edits-tab").click(); else $consecutive.click(); } return { valid: true }; } } }; /***/ }, /***/ 8921(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.EventManager = void 0; var _events = __webpack_require__(985); var _conditions = __webpack_require__(870); var _scripts = __webpack_require__(5564); class EventManager { constructor(ws) { this.ws = ws; this.events = _events.events; this.conditions = _conditions.conditions; } button($el, event) { const ws = this.ws; const handleClick = e => { ws.gui.selectedMenu = null; const item = ws.queue.current.item; const params = {}; for (const param of ((_ws$gui$events$events = (_ws$gui$events$events2 = ws.gui.events.events[event]).parameters) === null || _ws$gui$events$events === void 0 ? void 0 : _ws$gui$events$events.call(_ws$gui$events$events2, ws, item)) || []) { var _ws$gui$events$events, _ws$gui$events$events2; if (param.id === "external") params[param.id] = (e === null || e === void 0 ? void 0 : e.altKey) || false; } ws.execute({ actions: [ { name: event, params } ] }); }; $el.addEventListener("click", e => handleClick(e)); } submenu($el, name) { var _current$item, _event$parameters2; const event = this.events[name]; $el.dataset.eventName = name; const current = this.ws.queue.current; const id = `${current.type}:${(_current$item = current.item) === null || _current$item === void 0 ? void 0 : _current$item.id}`; const cachedParams = {}; if ($el.dataset.eventId === id) for (const param of ((_event$parameters = event.parameters) === null || _event$parameters === void 0 ? void 0 : _event$parameters.call(event, this.ws, this.ws.queue.current.item)) || []) { var _event$parameters; const $input = $el.querySelector(`[data-paramid="${param.id}"]`); cachedParams[param.id] = $input.type === "checkbox" ? $input.checked : $input.value; } else $el.dataset.eventId = id; $el.innerHTML = ""; const $description = document.createElement("div"); $description.classList.add("bottom-subcontent-title"); $description.textContent = event.title; $el.appendChild($description); const dependencyMap = new Map; const actions = {}; const parameters = (0, _scripts.sortDependencies)(((_event$parameters2 = event.parameters) === null || _event$parameters2 === void 0 ? void 0 : _event$parameters2.call(event, this.ws, this.ws.queue.current.item)) || []); for (const param of parameters) { const $param = document.createElement("div"); $param.classList.add("bottom-subcontent-input-title"); $param.textContent = param.title; $el.appendChild($param); const dependencies = {}; for (const dependent of (_param$dependencies = param.dependencies) !== null && _param$dependencies !== void 0 ? _param$dependencies : []) { var _param$dependencies; dependencies[dependent] = actions[dependent]; } const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; let callback = null; switch (param.type) { case "choice": { const $input = document.createElement("select"); $input.dataset.paramid = param.id; $el.appendChild($input); const options = typeof param.options === "function" ? param.options(dependencies) : param.options; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $input.appendChild($option); } if (cachedParams[param.id] !== undefined) { $input.value = cachedParams[param.id]; actions[param.id] = cachedParams[param.id]; } else if ("default" in param) { $input.value = _default; actions[param.id] = _default; } callback = () => { const dependencies = {}; for (const dependent of (_param$dependencies2 = param.dependencies) !== null && _param$dependencies2 !== void 0 ? _param$dependencies2 : []) { var _param$dependencies2; dependencies[dependent] = actions[dependent]; } const value = $input.value; const options = typeof param.options === "function" ? param.options(dependencies) : param.options; $input.innerHTML = ""; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $input.appendChild($option); } if (options.includes(value)) $input.value = value; else { const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; $input.value = _default; actions[param.id] = _default; } }; $input.addEventListener("change", () => { actions[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "text": { const $input = document.createElement("input"); $input.type = "text"; $input.dataset.paramid = param.id; $el.appendChild($input); if (cachedParams[param.id] !== undefined) { $input.value = cachedParams[param.id]; actions[param.id] = cachedParams[param.id]; } else if ("default" in param) { $input.value = _default; actions[param.id] = _default; } $input.addEventListener("change", () => { actions[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "boolean": { const $input = document.createElement("input"); $input.type = "checkbox"; $input.dataset.paramid = param.id; $el.appendChild($input); if (cachedParams[param.id] !== undefined) { $input.checked = cachedParams[param.id]; actions[param.id] = cachedParams[param.id]; } else if ("default" in param) { $input.checked = _default; actions[param.id] = _default; } $input.addEventListener("change", () => { actions[param.id] = $input.checked; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "duration": { const $input = document.createElement("duration-input"); $input.dataset.paramid = param.id; $el.appendChild($input); if (cachedParams[param.id] !== undefined) { $input.value = cachedParams[param.id]; actions[param.id] = cachedParams[param.id]; } else if ("default" in param) { $input.value = _default; actions[param.id] = _default; } $input.addEventListener("change", () => { actions[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; } if (typeof callback === "function") for (const dependent of (_param$dependencies3 = param.dependencies) !== null && _param$dependencies3 !== void 0 ? _param$dependencies3 : []) { var _param$dependencies3; if (!dependencyMap.has(dependent)) dependencyMap.set(dependent, []); dependencyMap.get(dependent).push(callback); } } const $button = document.createElement("button"); $button.classList.add("bottom-subcontent-button"); $button.textContent = "Submit"; $el.appendChild($button); $button.addEventListener("click", () => { const params = {}; for (const param of parameters) { const $input = $el.querySelector(`[data-paramid="${param.id}"]`); params[param.id] = $input.value; } this.ws.execute({ actions: [ { name, params } ] }); this.ws.gui.closeMenus(); }); } } exports.EventManager = EventManager; /***/ }, /***/ 372(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Queue = void 0; var _scriptEsm = __webpack_require__(2852); var _scriptEsm2 = __webpack_require__(2595); var _profanity = __webpack_require__(6400); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _uaaQueue = new WeakMap; var _Queue_brand = new WeakSet; class Queue { static areSameGroup(a, b) { return this.groups[a] === this.groups[b]; } constructor(ws) { _classPrivateMethodInitSpec(this, _Queue_brand); _classPrivateFieldInitSpec(this, _uaaQueue, Promise.resolve()); this.ws = ws; this.queues = Object.fromEntries([ "void", ...Queue.types ].map(type => [ type, { type, item: null, previous: null, queue: [], hold: [], repeats: {}, history: new _scriptEsm2.Stack(100), memory: new _scriptEsm.Memory({ size: 1e3 }), last: { timestamp: ws.util.utcString(new Date), id: 0 } } ])); this.cache = { simple: new _scriptEsm.Memory({ size: 1e3 }), full: new _scriptEsm.Memory({ size: 250 }) }; this.current = this.queues[Queue.types[0]]; this.pending = new Map; this.watchlist = new _scriptEsm.Memory({ size: 1e3 }); this.talks = new _scriptEsm.Memory({ size: 500 }); this.warnings = new _scriptEsm.Memory({ size: 1e3, timeout: 24 * 60 * 60 * 1e3 }); // 1 day this.noWelcome = new _scriptEsm.Memory({ timeout: 60 * 60 * 1e3 }); // 1 hour this.histories = new _scriptEsm.Memory({ size: 1e3 }); this.contributions = new _scriptEsm.Memory({ size: 1e3 }); this.blocks = new _scriptEsm.Memory({ size: 1e3 }); this.blocked = new _scriptEsm.Memory({ size: 1e4 }); this.playedSound = { mention: new _scriptEsm.Memory({ timeout: 60 * 1e3 }) }; this.bypass = new _scriptEsm.Memory({ timeout: 60 * 60 * 1e3, size: 1e4 }); // 1 hour this.backoff = 2e3; } switch(type) { var _document$querySelect; if (this.current.type === type) return; else if (this.current.type === "pending") this.queues.pending.queue = this.queues.pending.queue.filter(item => this.pending.has(item.id)); document.querySelector("#clear-queue").classList.toggle("hidden", type === "pending"); this.current = this.queues[type]; if (!this.current.queue.some(item => { var _this$current$item; return item.id === ((_this$current$item = this.current.item) === null || _this$current$item === void 0 ? void 0 : _this$current$item.id); })) this.current.item = this.current.queue[0] || null; this.ws.gui.renderQueue(); this.ws.gui.newCurrentItem(this.current.item); document.querySelectorAll("#queue-tabs > .queue-tab.selected").forEach($el => $el.classList.remove("selected")); (_document$querySelect = document.querySelector(`#queue-tab-${type}`)) === null || _document$querySelect === void 0 || _document$querySelect.classList.add("selected"); } async fetch() { try { const queues = this.ws.store.settings.queue; if (queues.pending.enabled && this.ws.rights.review) { const pending = (await this.ws.api.feeds(null, { ns: "*", full: true })).pending; this.pending.clear(); Object.values(pending).forEach(item => this.pending.set(item.revid, item)); await this.outdated("pending"); } const feeds = await this.ws.api.feeds(queues.recent.enabled ? { ns: this.ws.store.settings.namespaces.join("|"), since: this.queues.recent.last.timestamp } : null, queues.pending.enabled && this.ws.rights.review ? { ns: "*", full: false } : null, queues.users.enabled ? { ns: "*", since: this.queues.users.last.timestamp } : null, queues.watchlist.enabled ? { ns: "*", since: this.queues.watchlist.last.timestamp } : null, queues.abuselog.enabled ? { ns: this.ws.store.settings.namespaces.join("|"), since: this.queues.abuselog.last.timestamp } : null); const whitelist = this.ws.store.whitelist; for (const type of Queue.types) { var _feeds$type; const lastId = this.queues[type].last.id; let q = (_feeds$type = feeds[type]) !== null && _feeds$type !== void 0 ? _feeds$type : []; const maxTimestamp = q.reduce((max, item) => Math.max(max, item.timestamp), 0); if (maxTimestamp) this.queues[type].last.timestamp = this.ws.util.utcString(new Date(maxTimestamp)); switch (Queue.groups[type]) { case "edit": { const fn = item => item.revid > lastId; if (type === "recent") q = q.filter(item => fn(item) && !whitelist.pages.has(item.title)); else q = q.filter(fn); } break; case "abuselog": { q = q.filter(item => item.id > lastId); } break; case "logevent": { q = q.filter(item => item.logid > lastId); } break; } q = q.concat(this.queues[type].hold); if (q.length > 25) this.queues[type].hold = q.splice(25).reverse(); else this.queues[type].hold = []; let changed = false; switch (type) { case "recent": { const remove = new Set; for (const a of q) for (const b of this.queues[type].queue) { var _this$current$item2; if (remove.has(b)) continue; else if (b.id === ((_this$current$item2 = this.current.item) === null || _this$current$item2 === void 0 ? void 0 : _this$current$item2.id)) continue; if (a.title === b.page.title && b.id < a.revid) remove.add(b); } for (const item of remove) { const i = this.queues[type].queue.indexOf(item); if (i > -1) { this.queues[type].queue.splice(i, 1); this.ws.gui.removeQueueItem(type, item.id); } } changed = remove.size > 0; } break; case "pending": { for (const item of this.queues[type].queue) { var _this$current$item3; if (((_this$current$item3 = this.current.item) === null || _this$current$item3 === void 0 ? void 0 : _this$current$item3.id) !== item.id && !this.pending.has(item.id)) { const i = this.queues[type].queue.indexOf(item); if (i > -1) { this.queues[type].queue.splice(i, 1); this.ws.gui.removeQueueItem(type, item.id); changed = true; } } } } break; case "users": { q = q.filter(item => !item.temp); // remove temp accounts } break; case "watchlist": { const remove = new Set; for (const a of q) for (const b of this.queues[type].queue) { var _this$current$item4; if (remove.has(b)) continue; else if (b.id === ((_this$current$item4 = this.current.item) === null || _this$current$item4 === void 0 ? void 0 : _this$current$item4.id)) continue; if (a.title === b.page.title && b.id < a.revid) remove.add(b); else if (!b.page.watched) remove.add(b); } if (q.length === 0) for (const item of this.queues[type].queue) if (!item.page.watched) remove.add(item); for (const item of remove) { const i = this.queues[type].queue.indexOf(item); if (i > -1) { this.queues[type].queue.splice(i, 1); this.ws.gui.removeQueueItem(type, item.id); } } changed = remove.size > 0; } break; } if (q.length === 0) { if (changed) this.ws.gui.renderQueue(this.queues[type].queue, this.current.edit, type); continue; } switch (Queue.groups[type]) { case "edit": { this.queues[type].last.id = q.reduce((max, item) => Math.max(max, item.revid), 0); const highlight = this.ws.store.highlight; const hasHighlight = item => { var _item$tags; return highlight.users.has(item.user) || highlight.pages.has(item.title) || ((_item$tags = item.tags) === null || _item$tags === void 0 ? void 0 : _item$tags.some(tag => highlight.tags.has(tag))); }; q = q.filter(item => { var _item$tags2; return !whitelist.users.has(item.user) && !((_item$tags2 = item.tags) !== null && _item$tags2 !== void 0 && _item$tags2.some(tag => whitelist.tags.has(tag))) && (!this.bypass.has(item.user) || hasHighlight(item)); }); // parallel const oresCache = {}; let [editCounts, ores] = await Promise.allSettled([ type === "recent" ? this.ws.api.getEditCounts(q.map(item => item.user).filter(user => !this.bypass.has(user))) : Promise.resolve([]), this.ws.api.getORES(q.filter(item => { var _item$oresscores; if ((_item$oresscores = item.oresscores) !== null && _item$oresscores !== void 0 && _item$oresscores.length) return void (oresCache[item.revid] = item.oresscores); return true; }, this.ws.store.settings.queue.ores_bias).map(item => item.revid)) ]); if (editCounts.status === "rejected") console.error("Edit counts failed:", editCounts.reason); if (editCounts.status === "fulfilled") editCounts = editCounts.value; else editCounts = {}; if (ores.status === "rejected") console.error("ORES failed:", ores.reason); if (ores.status === "fulfilled") ores = ores.value; else ores = {}; for (const [revid, score] of Object.entries(await this.ws.api.extractORES(oresCache, this.ws.store.settings.queue.ores_bias))) ores[revid] = score; const repeats = this.queues[type].repeats; const filtered = []; if (type === "recent") { const minORES = this.ws.store.settings.queue.min_ores; const max = this.ws.store.settings.queue.max_edits; q.forEach(item => { var _ref, _editCounts$item$user; if (isNaN(ores[item.revid]) && (repeats[item.revid] || 0) < 3) { repeats[item.revid] = (repeats[item.revid] || 0) + 1; return this.queues[type].hold.push(item); } delete repeats[item.revid]; const edits = (_ref = (_editCounts$item$user = editCounts[item.user]) !== null && _editCounts$item$user !== void 0 ? _editCounts$item$user : this.bypass.get(item.user)) !== null && _ref !== void 0 ? _ref : 0; if (edits > max) { this.bypass.set(item.user, edits); if (hasHighlight(item)) filtered.push(item); } else if ((ores[item.revid] || 0) >= minORES || hasHighlight(item)) filtered.push(item); }); } else q.forEach(item => { if (isNaN(ores[item.revid]) && (repeats[item.revid] || 0) < 3) { repeats[item.revid] = (repeats[item.revid] || 0) + 1; return this.queues[type].hold.push(item); } delete repeats[item.revid]; filtered.push(item); }); await this.add(type, filtered); } break; case "logevent": { let max = 0; const set = new Set; const filtered = []; q.forEach(item => { if (set.has(item.logid)) return; set.add(item.logid); if (item.logid > max) max = item.logid; filtered.push(item); }); this.queues[type].last.id = max; await this.add(type, filtered); } break; case "abuselog": { const noEditCounts = q.filter(item => item.editcount === null); let editCounts = {}; if (noEditCounts.length > 0) editCounts = await this.ws.api.getEditCounts(noEditCounts.map(item => item.user)); const maxEdits = this.ws.store.settings.queue.max_edits; let max = 0; const filtered = []; q.forEach(item => { var _item$editcount; if ((((_item$editcount = item.editcount) !== null && _item$editcount !== void 0 ? _item$editcount : editCounts[item.user]) || 0) > maxEdits) return; if (item.id > max) max = item.id; filtered.push(item); }); this.queues[type].last.id = max; await this.add(type, filtered); } break; } } await this.outdated(); this.backoff = Queue.refresh; } catch (error) { console.error(error); this.backoff = Math.min(this.backoff * 2, 12e4); } setTimeout(() => this.fetch(), this.backoff); } async outdated() { { // pending const remove = []; for (const item of this.queues.pending.queue) { if (item === this.current.item) continue; if (!this.pending.has(item.id)) remove.push(item); } if (remove.length > 0) for (const item of remove) { const i = this.queues.pending.queue.indexOf(item); if (i > -1) { this.queues.pending.queue.splice(i, 1); this.ws.gui.removeQueueItem("pending", item.id); } } } const pages = new Set; const queues = [ "recent", "watchlist", "abuselog" ]; for (const type of queues) this.queues[type].queue.forEach(item => { if (type === "abuselog" && !item.revid) return; pages.add(item.page.title); }); const latests = await this.ws.api.getLatestIds([ ...pages ]); for (const type of queues) { const remove = []; for (const item of this.queues[type].queue) { let revid = item.id; if (type === "abuselog") { if (item.revid) revid = item.revid; else continue; } const latest = latests[item.page.title]; if (latest && latest > revid) remove.push([ item.id, revid ]); } if (remove.length > 0) for (const [id, revid] of remove) { var _this$queues$type$ite; const prop = type === "abuselog" ? "revid" : "id"; if (revid === ((_this$queues$type$ite = this.queues[type].item) === null || _this$queues$type$ite === void 0 ? void 0 : _this$queues$type$ite[prop])) continue; const i = this.queues[type].queue.findIndex(qItem => qItem[prop] === revid); if (i > -1) { this.queues[type].queue.splice(i, 1); this.ws.gui.removeQueueItem(type, id); } } } this.ws.gui.renderQueue(); } async add(type, items) { const prop = { edit: "revid", logevent: "logid", abuselog: "id" }[Queue.groups[type]]; items = items.filter(item => !this.queues[type].memory.has(item[prop])); items.forEach(item => this.queues[type].memory.add(item[prop])); const len = items.length; if (len === 0) return; const play = { ores: false, mention: false }; const parsed = await this.generate(type, items, false); switch (Queue.groups[type]) { case "edit": { const threshold = this.ws.store.settings.audio.ores_alert.threshold; for (let i = 0; i < len; i++) { const item = items[i]; const data = parsed[i]; this.queues[type].queue.push(data); if (type === "recent" && data.ores >= threshold) play.ores = true; if (data.mentions.has && !this.playedSound.mention.has(data.id)) { this.playedSound.mention.add(data.id); play.mention = true; } } } break; case "logevent": { for (let i = 0; i < len; i++) { const item = items[i]; const data = parsed[i]; this.queues[type].queue.push(data); if (data.mentions.has && !this.playedSound.mention.has(data.id)) { this.playedSound.mention.add(data.id); play.mention = true; } } } break; case "abuselog": { for (let i = 0; i < len; i++) { const item = items[i]; const data = parsed[i]; this.queues[type].queue.push(data); if (data.mentions.has && !this.playedSound.mention.has(data.id)) { this.playedSound.mention.add(data.id); play.mention = true; } } } break; } this.sort(type); if (play.ores && this.ws.store.settings.audio.ores_alert.enabled) this.ws.audio.playSound([ "queue", "ores" ]); if (play.mention && this.ws.store.settings.username_highlighting.enabled) this.ws.audio.playSound([ "queue", "mention" ]); this.ws.gui.renderQueue(this.queues[type].queue, this.queues[type].item, type); } sort(type) { var _this$queues$type$ite2; let i = -1; if (this.queues[type].item) i = this.queues[type].queue.findIndex(item => item === this.queues[type].item); let sorted = this.queues[type].queue; if (i >= 0) sorted = sorted.slice(0, i).concat(sorted.slice(i + 1)); const highlight = this.ws.store.highlight; const mentions = this.ws.store.settings.username_highlighting.enabled; switch (Queue.groups[type]) { case "edit": { sorted = sorted.sort((a, b) => { if (a.history && b.history) return a.history - b.history; else if (a.history) return -1; else if (b.history) return 1; let aScore = a.ores; if (mentions && a.mentions.has) aScore += 200; if (highlight.users.has(a.user.name)) aScore += 100; if (highlight.pages.has(a.page.title)) aScore += 75; aScore += a.tags.filter(tag => highlight.tags.has(tag)).length * 50; let bScore = b.ores; if (mentions && b.mentions.has) bScore += 200; if (highlight.users.has(b.user.name)) bScore += 100; if (highlight.pages.has(b.page.title)) bScore += 75; bScore += b.tags.filter(tag => highlight.tags.has(tag)).length * 50; if (aScore === bScore) return b.id - a.id; return bScore - aScore; }); } break; case "logevent": { sorted = sorted.sort((a, b) => { if (a.history && b.history) return a.history - b.history; else if (a.history) return 1; else if (b.history) return -1; let aScore = (a.user.profanity.clamped || 0) * 100; if (mentions && a.mentions.has) aScore += 200; let bScore = (b.user.profanity.clamped || 0) * 100; if (mentions && b.mentions.has) bScore += 200; if (aScore === bScore) return b.id - a.id; return bScore - aScore; }); } break; case "abuselog": { sorted = sorted.sort((a, b) => { if (a.history && b.history) return a.history - b.history; else if (a.history) return 1; else if (b.history) return -1; let aScore = 0; if (highlight.users.has(a.user.name)) aScore += 100; if (highlight.pages.has(a.page.title)) aScore += 75; if (mentions && a.mentions.has) aScore += 200; let bScore = 0; if (highlight.users.has(b.user.name)) bScore += 100; if (highlight.pages.has(b.page.title)) bScore += 75; if (mentions && b.mentions.has) bScore += 200; if (aScore === bScore) return b.id - a.id; return bScore - aScore; }); } break; } // it's doubling up somewhere and idk why but this should fix it const existing = new Set((_this$queues$type$ite2 = this.queues[type].item) !== null && _this$queues$type$ite2 !== void 0 && _this$queues$type$ite2.id ? [ this.queues[type].item.id ] : []); sorted = sorted.filter(item => { if (existing.has(item.id)) return false; existing.add(item.id); return true; }); if (i >= 0) sorted.splice(i, 0, this.queues[type].item); this.queues[type].queue = [ ...sorted.slice(0, this.ws.store.settings.queue.max_size) ]; if (!this.queues[type].item) this.queues[type].item = this.queues[type].queue[0]; } async generate(type, items, simple, options = {}) { var _options$bypass; if (items.length === 0) return []; const bypass = (_options$bypass = options === null || options === void 0 ? void 0 : options.bypass) !== null && _options$bypass !== void 0 ? _options$bypass : false; const ws = this.ws; const username = ws.api.username; const result = []; switch (Queue.groups[type]) { case "edit": { items = items.filter(item => { const cached = (revid => { if (simple) { if (this.cache.simple.has(revid)) return this.cache.simple.get(revid); else if (this.cache.full.has(revid)) return this.cache.full.get(revid); } else if (this.cache.full.has(revid)) return this.cache.full.get(revid); return null; })(item.revid); if (cached) { var _result$push; if (item.pending && !cached.pending) cached.pending = item.pending; return (_result$push = void result.push(cached)) !== null && _result$push !== void 0 ? _result$push : false; } return true; }); items = items.map(item => { var _this$pending$get; let prior = null; if (item.pending) prior = (_this$pending$get = this.pending.get(item.revid)) === null || _this$pending$get === void 0 ? void 0 : _this$pending$get.prior; prior !== null && prior !== void 0 ? prior : prior = item.old_revid || item.parentid; return { item, prior }; }); const parsed = await ws.api.parseEdits(items, simple, this.ws.store.settings.queue.ores_bias, bypass); for (const temp of parsed) { var _data$user$contributi; const {item, prior, data} = temp; const mentions = { comment: false, diff: false }; if (username) if (data.edit.diff) { const $temp = document.createElement("div"); $temp.innerHTML = data.edit.diff; if ($temp.textContent) mentions.diff = ws.util.match(username, $temp.textContent); } this.watchlist.set(item.title, data.page.watched); this.histories.set(item.title, data.page.history); this.contributions.set(item.user, data.user.contributions); this.blocks.set(item.user, data.user.blocks); this.blocked.set(item.user, data.user.blocked); const levels = [ "0", "1", "2", "3", "4", "4im" ]; const warning = this.getWarningLevel(data.user.talk || ""); if (levels.indexOf(warning) > levels.indexOf(this.warnings.get(item.user) || "0")) this.warnings.set(item.user, warning); const object = { page: { namespace: item.ns, title: item.title, get history() { var _ws$queue$histories$g; return (_ws$queue$histories$g = ws.queue.histories.get(item.title)) !== null && _ws$queue$histories$g !== void 0 ? _ws$queue$histories$g : data.page.history; }, get watched() { var _ws$queue$watchlist$g; return (_ws$queue$watchlist$g = ws.queue.watchlist.get(item.title)) !== null && _ws$queue$watchlist$g !== void 0 ? _ws$queue$watchlist$g : data.page.watched; }, metadata: data.page.metadata, categories: data.page.categories, protection: data.page.protection }, user: { name: item.user, ip: ws.util.isIPAddress(item.user), temp: ws.util.isTempAccount(item.user), anon: ws.util.isIPAddress(item.user) || ws.util.isTempAccount(item.user), edits: Math.max(data.user.edits, ((_data$user$contributi = data.user.contributions) === null || _data$user$contributi === void 0 ? void 0 : _data$user$contributi.length) || 0), get contributions() { var _ws$queue$contributio; return (_ws$queue$contributio = ws.queue.contributions.get(item.user)) !== null && _ws$queue$contributio !== void 0 ? _ws$queue$contributio : data.user.contributions; }, warning: this.getWarningLevel(data.user.talk || ""), warnings: this.getWarningHistory(data.user.talk || ""), get blocked() { var _ws$queue$blocked$get; return (_ws$queue$blocked$get = ws.queue.blocked.get(item.user)) !== null && _ws$queue$blocked$get !== void 0 ? _ws$queue$blocked$get : data.user.blocked; }, get blocks() { var _ws$queue$blocks$get; return (_ws$queue$blocks$get = ws.queue.blocks.get(item.user)) !== null && _ws$queue$blocks$get !== void 0 ? _ws$queue$blocks$get : data.user.blocks; }, get talk() { var _ws$queue$talks$get; return (_ws$queue$talks$get = ws.queue.talks.get(item.user)) !== null && _ws$queue$talks$get !== void 0 ? _ws$queue$talks$get : data.user.talk; } }, mentions, AI: { // will be populated asynchronously edit: null, username: null }, id: item.revid, prior, timestamp: item.timestamp, comment: item.parsedcomment, minor: item.minor || false, diff: data.edit.diff, sizediff: ("sizediff" in item ? item.sizediff : item.newlen - item.oldlen) || 0, ores: data.edit.ores, tags: item.tags || [], reverts: data.page.reverts, consecutive: data.page.consecutive, propagating: false, reviewed: false, history: false, pending: item.pending || false, group: Queue.groups[type], type, simple, origin: item }; if (!simple && ws.AI) { if (ws.store.settings.AI.edit_analysis.enabled) ws.AI.analyze.edit(object).then(analysis => object.AI.edit = analysis).catch(error => object.AI.edit = { error: error.message }).finally(() => { var _this$current$item5; if (object.id === ((_this$current$item5 = this.current.item) === null || _this$current$item5 === void 0 ? void 0 : _this$current$item5.id)) ws.gui.updateAIAnalysisDisplay(object.AI.edit); }); if (!object.user.anon && !ws.store.whitelist.users.has(object.user.name) && ws.store.settings.AI.username_analysis.enabled) ws.AI.analyze.username(object).then(analysis => { object.AI.username = analysis; if (analysis.flag) this.promptUAA(object, analysis); }).catch(error => object.AI.username = { error: error.message }); } result.push(object); if (simple) this.cache.simple.set(item.revid, object); else { this.cache.full.set(item.revid, object); if (this.cache.simple.has(item.revid)) this.cache.simple.delete(item.revid); } } } break; case "logevent": { const parsed = await ws.api.parseUsers(items.map(item => item.title.replace(/^(User|User talk):/, "")), simple, bypass); const performers = await ws.api.parseUsers(items.map(item => item.user), simple, bypass); for (let i = 0; i < items.length; i++) { var _data$user$contributi2, _performer$user$contr; const item = items[i]; const data = parsed[i]; const performer = performers[i]; const user = item.title.replace(/^(User|User talk):/, ""); const mentions = { username: false, comment: false }; if (username) if (user) mentions.username = ws.util.match(username, user); this.contributions.set(user, data.user.contributions); this.contributions.set(item.user, performer.user.contributions); this.blocks.set(user, data.user.blocks); this.blocks.set(item.user, performer.user.blocks); this.blocked.set(user, data.user.blocked); this.blocked.set(item.user, performer.user.blocked); const levels = [ "0", "1", "2", "3", "4", "4im" ]; const warning = this.getWarningLevel(data.user.talk || ""); if (levels.indexOf(warning) > levels.indexOf(this.warnings.get(user) || "0")) this.warnings.set(user, warning); const performerWarning = this.getWarningLevel(performer.user.talk || ""); if (levels.indexOf(performerWarning) > levels.indexOf(this.warnings.get(item.user) || "0")) this.warnings.set(item.user, performerWarning); const userProfanity = _profanity.profanity.evaluate(user); const object = { page: { namespace: item.ns, title: item.title, history: [], get watched() { return false; }, metadata: [], categories: [], protection: {} }, user: { name: user, ip: ws.util.isIPAddress(user), temp: ws.util.isTempAccount(user), anon: ws.util.isIPAddress(user) || ws.util.isTempAccount(user), edits: Math.max(data.user.edits, ((_data$user$contributi2 = data.user.contributions) === null || _data$user$contributi2 === void 0 ? void 0 : _data$user$contributi2.length) || 0), get contributions() { var _ws$queue$contributio2; return (_ws$queue$contributio2 = ws.queue.contributions.get(user)) !== null && _ws$queue$contributio2 !== void 0 ? _ws$queue$contributio2 : data.user.contributions; }, warning: this.getWarningLevel(data.user.talk || ""), warnings: this.getWarningHistory(data.user.talk || ""), get blocked() { var _ws$queue$blocked$get2; return (_ws$queue$blocked$get2 = ws.queue.blocked.get(user)) !== null && _ws$queue$blocked$get2 !== void 0 ? _ws$queue$blocked$get2 : data.user.blocked; }, get blocks() { var _ws$queue$blocks$get2; return (_ws$queue$blocks$get2 = ws.queue.blocks.get(user)) !== null && _ws$queue$blocks$get2 !== void 0 ? _ws$queue$blocks$get2 : data.user.blocks; }, get talk() { var _ws$queue$talks$get2; return (_ws$queue$talks$get2 = ws.queue.talks.get(user)) !== null && _ws$queue$talks$get2 !== void 0 ? _ws$queue$talks$get2 : data.user.talk; }, profanity: userProfanity }, performer: { name: item.user, ip: ws.util.isIPAddress(item.user), temp: ws.util.isTempAccount(item.user), anon: ws.util.isIPAddress(item.user) || ws.util.isTempAccount(item.user), edits: Math.max(performer.user.edits, ((_performer$user$contr = performer.user.contributions) === null || _performer$user$contr === void 0 ? void 0 : _performer$user$contr.length) || 0), get contributions() { var _ws$queue$contributio3; return (_ws$queue$contributio3 = ws.queue.contributions.get(item.user)) !== null && _ws$queue$contributio3 !== void 0 ? _ws$queue$contributio3 : performer.user.contributions; }, warning: this.getWarningLevel(performer.user.talk || ""), warnings: this.getWarningHistory(performer.user.talk || ""), get blocked() { var _ws$queue$blocked$get3; return (_ws$queue$blocked$get3 = ws.queue.blocked.get(item.user)) !== null && _ws$queue$blocked$get3 !== void 0 ? _ws$queue$blocked$get3 : performer.user.blocked; }, get blocks() { var _ws$queue$blocks$get3; return (_ws$queue$blocks$get3 = ws.queue.blocks.get(item.user)) !== null && _ws$queue$blocks$get3 !== void 0 ? _ws$queue$blocks$get3 : performer.user.blocks; }, get talk() { var _ws$queue$talks$get3; return (_ws$queue$talks$get3 = ws.queue.talks.get(item.user)) !== null && _ws$queue$talks$get3 !== void 0 ? _ws$queue$talks$get3 : performer.user.talk; } }, mentions, AI: { // will be populated asynchronously username: null }, id: item.logid, timestamp: item.timestamp, comment: item.parsedcomment, ores: userProfanity.clamped || 0, filters: userProfanity.matches.map(match => ({ filter: match.name, id: match.match })), propagating: false, reviewed: false, history: false, group: Queue.groups[type], type, simple, origin: item }; if (!simple && ws.AI) { if (!object.user.anon && !ws.store.whitelist.users.has(object.user.name) && ws.store.settings.AI.username_analysis.enabled) ws.AI.analyze.username(object).then(analysis => { object.AI.username = analysis; if (analysis.flag) this.promptUAA(object, analysis); }).catch(error => object.AI.username = { error: error.message }); } result.push(object); } } break; case "abuselog": { const parsed = await ws.api.parseAbuselogs(items, simple, bypass); for (const temp of parsed) { var _data$user$contributi3, _item$diff; const {item, data} = temp; const mentions = { comment: false, diff: false }; if (username) if (data.edit.diff) { const $temp = document.createElement("div"); $temp.innerHTML = data.edit.diff; if ($temp.textContent) mentions.diff = ws.util.match(username, $temp.textContent); } this.watchlist.set(item.title, data.page.watched); this.histories.set(item.title, data.page.history); this.contributions.set(item.user, data.user.contributions); this.blocks.set(item.user, data.user.blocks); this.blocked.set(item.user, data.user.blocked); const levels = [ "0", "1", "2", "3", "4", "4im" ]; const warning = this.getWarningLevel(data.user.talk || ""); if (levels.indexOf(warning) > levels.indexOf(this.warnings.get(item.user) || "0")) this.warnings.set(item.user, warning); const results = [ "disallow", "warn", "showcaptcha", "tag", "none" ]; const len = results.length; let action = len - 1; for (let i = 0; i < len; i++) if (item.result.has(results[i])) { action = i; break; } const object = { page: { namespace: item.ns, title: item.title, get history() { var _ws$queue$histories$g2; return (_ws$queue$histories$g2 = ws.queue.histories.get(item.title)) !== null && _ws$queue$histories$g2 !== void 0 ? _ws$queue$histories$g2 : data.page.history; }, get watched() { var _ws$queue$watchlist$g2; return (_ws$queue$watchlist$g2 = ws.queue.watchlist.get(item.title)) !== null && _ws$queue$watchlist$g2 !== void 0 ? _ws$queue$watchlist$g2 : data.page.watched; }, metadata: data.page.metadata, categories: data.page.categories, protection: data.page.protection }, user: { name: item.user, ip: ws.util.isIPAddress(item.user), temp: ws.util.isTempAccount(item.user), anon: ws.util.isIPAddress(item.user) || ws.util.isTempAccount(item.user), edits: Math.max(data.user.edits, ((_data$user$contributi3 = data.user.contributions) === null || _data$user$contributi3 === void 0 ? void 0 : _data$user$contributi3.length) || 0), get contributions() { var _ws$queue$contributio4; return (_ws$queue$contributio4 = ws.queue.contributions.get(item.user)) !== null && _ws$queue$contributio4 !== void 0 ? _ws$queue$contributio4 : data.user.contributions; }, warning: this.getWarningLevel(data.user.talk || ""), warnings: this.getWarningHistory(data.user.talk || ""), get blocked() { var _ws$queue$blocked$get4; return (_ws$queue$blocked$get4 = ws.queue.blocked.get(item.user)) !== null && _ws$queue$blocked$get4 !== void 0 ? _ws$queue$blocked$get4 : data.user.blocked; }, get blocks() { var _ws$queue$blocks$get4; return (_ws$queue$blocks$get4 = ws.queue.blocks.get(item.user)) !== null && _ws$queue$blocks$get4 !== void 0 ? _ws$queue$blocks$get4 : data.user.blocks; }, get talk() { var _ws$queue$talks$get4; return (_ws$queue$talks$get4 = ws.queue.talks.get(item.user)) !== null && _ws$queue$talks$get4 !== void 0 ? _ws$queue$talks$get4 : data.user.talk; } }, mentions, AI: { // will be populated asynchronously edit: null, username: null }, id: item.id, revid: item.revid, timestamp: item.timestamp, comment: data.parsedcomment, minor: false, diff: data.edit.diff, sizediff: (_item$diff = item.diff) === null || _item$diff === void 0 ? void 0 : _item$diff.size, ores: +(1 - action / (len - 1)).toFixed(2), filters: item.entries.map(entry => ({ id: (entry === null || entry === void 0 ? void 0 : entry.filter_id) || "-1", filter: entry === null || entry === void 0 ? void 0 : entry.filter })) || [], reverts: data.page.reverts, propagating: false, reviewed: false, history: false, group: Queue.groups[type], type, simple, origin: item }; if (!simple && ws.AI) { if (ws.store.settings.AI.edit_analysis.enabled && data.edit.diff) // only analyze if diff exists ws.AI.analyze.edit(object).then(analysis => object.AI.edit = analysis).catch(error => object.AI.edit = { error: error.message }).finally(() => { var _this$current$item6; if (object.id === ((_this$current$item6 = this.current.item) === null || _this$current$item6 === void 0 ? void 0 : _this$current$item6.id)) ws.gui.updateAIAnalysisDisplay(object.AI.edit); }); if (!object.user.anon && !ws.store.whitelist.users.has(object.user.name) && ws.store.settings.AI.username_analysis.enabled) ws.AI.analyze.username(object).then(analysis => { object.AI.username = analysis; if (analysis.flag) this.promptUAA(object, analysis); }).catch(error => object.AI.username = { error: error.message }); } result.push(object); } } break; } result.forEach(item => { if (item.comment) { const parser = new DOMParser; const doc = parser.parseFromString(item.comment, "text/html"); const $preview = doc.body; $preview.querySelectorAll("[href]").forEach($link => { const href = $link.getAttribute("href"); $link.setAttribute("href", new URL(href, `https://${this.ws.server}`).href); }); $preview.querySelectorAll("[src]").forEach($img => { const src = $img.getAttribute("src"); $img.setAttribute("src", new URL(src, `https://${this.ws.server}`).href); }); $preview.querySelectorAll("[srcset]").forEach($img => { const srcset = $img.getAttribute("srcset"); const newSrcset = srcset.split(",").map(part => { const [url, descriptor] = part.trim().split(/\s+/, 2); const newUrl = new URL(url, `https://${this.ws.server}`).href; return descriptor ? `${newUrl} ${descriptor}` : newUrl; }).join(", "); $img.setAttribute("srcset", newSrcset); }); item.comment = $preview.innerHTML; const textContent = ($preview.textContent || "").trim(); item.has_comment = Boolean(textContent); if (item.mentions.comment === false) item.mentions.comment = ws.util.match(username, textContent); if (item.mentions) item.mentions.has = Object.values(item.mentions).some(v => v); } else item.has_comment = false; }); return result; } previous() { const i = this.current.queue.findIndex(item => { var _this$current$item7; return item.id === ((_this$current$item7 = this.current.item) === null || _this$current$item7 === void 0 ? void 0 : _this$current$item7.id); }); if (this.current.type === "pending") { this.current.item = this.current.queue[Math.max(i - 1, 0)]; return this.ws.gui.renderQueue(); } if (i <= 0) { if (this.current.history.length === 0) return; this.current.queue.unshift(this.current.history.pop()); this.current.item = this.current.queue[0]; return this.ws.gui.renderQueue(); } this.current.item = this.current.queue[i - 1]; this.ws.gui.renderQueue(); } next() { const i = this.current.queue.findIndex(item => { var _this$current$item8; return item.id === ((_this$current$item8 = this.current.item) === null || _this$current$item8 === void 0 ? void 0 : _this$current$item8.id); }); if (i === -1) { this.current.item = this.current.queue[0]; return this.ws.gui.renderQueue(); } if (this.current.type === "pending") { this.current.item = this.current.queue[Math.min(i + 1, this.current.queue.length - 1)]; return this.ws.gui.renderQueue(); } const leaving = this.current.item; const group = Queue.groups[leaving.type]; if (!leaving.reviewed && (group === "edit" || group === "abuselog" && leaving.revid)) { if (leaving.type === "watchlist") this.ws.api.markWatchlistSeen(leaving.page.title, leaving.id); const id = leaving.type === "abuselog" ? leaving.revid : leaving.id; [ "recent", "watchlist", "abuselog" ].filter(t => t !== leaving.type).forEach(t => { if (t === "abuselog") this.queues[t].queue = this.queues[t].queue.filter(item => { if (item.revid === id) { this.queues[t].history.push({ ...item, history: performance.now() }); return false; } return true; }); else this.queues[t].queue = this.queues[t].queue.filter(item => { if (item.id === id) { this.queues[t].history.push({ ...item, history: performance.now() }); if (t === "watchlist") this.ws.api.markWatchlistSeen(item.page.title, item.id); return false; } return true; }); }); if (group !== "abuselog") { let toRemove = this.queues.abuselog.queue.filter(item => leaving.user.name === item.user.name && leaving.page.title === item.page.title && Math.abs(new Date(leaving.timestamp).getTime() - new Date(item.timestamp).getTime()) < 10 * 1e3); if (toRemove.length > 0) { Promise.allSettled(toRemove.map(async item => { let revid = item.revid; if (!revid) revid = await this.ws.api.getAbuseLogRevid(item.id); if (revid) { item.revid = revid; return { id: item.id, revid }; } return null; })).then(result => { const remove = result.map(r => r.status === "fulfilled" ? r.value : null).filter(v => v); this.queues.abuselog.queue = this.queues.abuselog.queue.filter(item => !remove.some(r => r.revid === item.revid)); if (this.current.type === "abuselog") { remove.forEach(r => this.ws.gui.removeQueueItem("abuselog", r.id)); this.ws.gui.renderQueue(this.queues.abuselog.queue, this.queues.abuselog.item, "abuselog"); } }).catch(() => {}); } } } leaving.reviewed = true; if (leaving && this.ws.AI) this.ws.AI.cancel.edit(leaving.id); this.current.queue.splice(i, 1); this.ws.gui.removeQueueItem(this.current.type, leaving.id); if (this.current.queue.length === 0) this.current.item = null; else { if (i < this.current.queue.length) this.current.item = this.current.queue[i]; else this.current.item = this.current.queue[this.current.queue.length - 1]; } if (leaving && Queue.groups[this.current.type] === "edit") this.promptWelcome(leaving); this.current.history.push({ ...leaving, history: performance.now() }); this.ws.gui.renderQueue(); } canGoPrevious() { const i = this.current.queue.findIndex(item => { var _this$current$item9; return item.id === ((_this$current$item9 = this.current.item) === null || _this$current$item9 === void 0 ? void 0 : _this$current$item9.id); }); if (i === -1) return this.current.history.length > 0; if (this.current.type === "pending") return i > 0; else if (i === 0) return this.current.history.length > 0; else return true; } canGoNext() { const i = this.current.queue.findIndex(item => { var _this$current$item0; return item.id === ((_this$current$item0 = this.current.item) === null || _this$current$item0 === void 0 ? void 0 : _this$current$item0.id); }); if (i === -1) return Boolean(this.current.queue[0]); if (this.current.type === "pending") return i < this.current.queue.length - 1; else return true; } clear(type) { if (type === "pending") return; this.queues[type].item = null; this.queues[type].queue = []; if (this.current.type === type) { this.ws.gui.newCurrentItem(null); this.ws.gui.clearQueueItems(); } } async promptWelcome(item) { if (this.ws.store.settings.auto_welcome.enabled) return; else if (!item.user.anon) return; else if ((item.user.edits || 0) === 0) // don't welcome users with 0 edits return; else if (item.user.talk === undefined) return; else if (this.noWelcome.has(item.user.name)) return; try { var _this$talks$set; const title = `User talk:${item.user.name}`; const exists = await this.ws.api.pagesExist([ title ]); if (exists[title] !== undefined) return (_this$talks$set = void this.talks.set(item.user.name, exists[title])) !== null && _this$talks$set !== void 0 ? _this$talks$set : exists[title]; await this.ws.gui.settings.waitForClose(); const confirmed = await this.ws.gui.dialog.confirm("Auto-Welcome User", `Would you like to welcome <span class="confirmation-modal-username">${this.ws.util.escape(item.user.name)}</span>?<br><br>\n\t\t\t\t\t<span style="font-size: 0.9em; color: #888;">Editing: <strong>${this.ws.util.escape(item.page.title)}</strong></span>`, { username: item.user.name, hideUAA: false }); this.noWelcome.add(item.user.name); if (confirmed) this.ws.execute({ actions: [ { name: "welcome-user", params: { template: "Auto" } } ] }, void 0, void 0, item); } catch (error) { console.error("Error during auto-welcome check:", error); } } promptUAA(item, analysis) { _classPrivateFieldSet(_uaaQueue, this, _classPrivateFieldGet(_uaaQueue, this).then(() => _assertClassBrand(_Queue_brand, this, _promptUAAInternal).call(this, item, analysis)).catch(() => {})); return _classPrivateFieldGet(_uaaQueue, this); } async propagate(item, bypass) { if (item.propagating) return await item.propagating; if (item.simple) { let resolve; item.propagating = new Promise(res => resolve = res); const [loaded] = await this.generate(item.type, [ item.origin ], false, { bypass }); loaded.history = item.history; Object.assign(item, loaded); resolve(); item.propagating = false; } else this.generate(item.type, [ item.origin ], false, { bypass }).then(([loaded]) => { const revid = item.revid; loaded.history = item.history; Object.assign(item, loaded); item.revid = revid; }); } loadFromItem(item) { const type = this.current.type; if (Queue.areSameGroup(type, "edit") && !(type === "pending" && item.type === "edit")) { this.queues[type].queue = this.queues[type].queue.filter(i => i.id !== item.id); const i = this.queues[type].queue.findIndex(i => { var _this$current$item1; return i.id === ((_this$current$item1 = this.current.item) === null || _this$current$item1 === void 0 ? void 0 : _this$current$item1.id); }); if (i > -1) this.queues[type].queue[i] = item; } this.queues[type].item = this.queues[type].queue.find(i => i.id === item.id) || item; this.ws.gui.renderQueue(); } async loadFromRevision(title, revid) { try { this.ws.gui.updateDiffDisplay("loading"); let item; if (this.cache.full.has(revid)) item = this.cache.full.get(revid); else { let object; if (this.cache.simple.has(revid)) { const simple = this.cache.simple.get(revid); object = { revid: simple.id, parentid: simple.prior, ns: simple.page.namespace, title: simple.page.title, user: simple.user.name, timestamp: simple.timestamp, parsedcomment: simple.comment, tags: simple.origin.tags, sizediff: simple.sizediff, minor: simple.minor }; } else { const rev = await this.ws.api.getRevision(title, revid, true); if (!rev) throw new Error("Revision not found"); object = { revid: rev.revid, parentid: rev.parentid, ns: rev.ns, title, user: rev.user, timestamp: rev.timestamp, parsedcomment: rev.parsedcomment, tags: rev.tags, size: rev.size, oldlen: rev.oldlen || 0, newlen: rev.size, minor: rev.minor }; } [item] = await this.generate("edit", [ object ], false, { bypass: true }); } const type = this.current.type; if (Queue.areSameGroup(type, "edit") && type !== "pending" && type !== "abuselog") { this.queues[type].queue = this.queues[type].queue.filter(i => i.id !== item.id); const i = this.queues[type].queue.findIndex(i => { var _this$current$item10; return i.id === ((_this$current$item10 = this.current.item) === null || _this$current$item10 === void 0 ? void 0 : _this$current$item10.id); }); if (i > -1) this.queues[type].queue[i] = item; } this.queues[type].item = item; this.ws.gui.renderQueue(); } catch (error) { console.error("Error loading from revision:", error); document.querySelector("#diff-container").innerHTML = `<div class="error">Failed to load revision: ${this.ws.util.escape(error.message)}</div>`; } } getWarningLevel(text) { const levels = [ "0", "1", "2", "3", "4", "4im" ]; let highestLevel = "0"; const month = this.ws.util.monthSectionName(); const sections = this.ws.util.getPageSections(text); for (const section of sections) if (section.title === month) { const templates = section.content.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/g); if (templates === null) break; const filtered = [ ...templates.map(t => { const match = t.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/); return match ? match[1].toString() : "0"; }), highestLevel ].map(level => [ level, levels.indexOf(level) ]); highestLevel = filtered.sort((a, b) => b[1] - a[1])[0][0]; } return highestLevel; } getWarningHistory(text) { const warnings = []; const month = this.ws.util.monthSectionName(); const sections = this.ws.util.getPageSections(text); for (const section of sections) if (section.title === month) { const templateMatches = section.content.matchAll(/<!-- Template:([\w-]+?)(\d(?:i?m)?) -->([^]+?)(?=<!-- Template:|$)/g); for (let match of templateMatches) { const templateName = match[1]; const level = match[2]; const content = match[3]; const timestampMatch = content.match(/(\d{2}:\d{2}.*?\d{4} \(UTC\))/); let timestamp = timestampMatch ? timestampMatch[1] : null; if (timestamp) timestamp = timestamp.replace(/<[^>]*>/g, ""); if (timestamp) { const [, time, day, monthName, year] = timestamp.match(/(\d{2}:\d{2}), (\d{1,2}) ([A-Za-z]+) (\d{4})/); const i = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ].indexOf(monthName); timestamp = new Date(Date.UTC(year, i, day, ...time.split(":"))).toUTCString(); } else timestamp = null; let username = null; const userLinkMatch = content.match(/\[\[User(?:[ _]talk)?:([^\]|]+)/i); if (userLinkMatch) username = userLinkMatch[1].trim(); const articleMatch = content.match(/\[\[([^\]]+?)\]\]/); const article = articleMatch ? articleMatch[1] : null; warnings.push({ template: templateName, level, timestamp, username, article, section: section.title }); } } return warnings; } } exports.Queue = Queue; async function _promptUAAInternal(item, analysis) { if (item.user.anon) return; else if (this.ws.store.whitelist.users.has(item.user.name)) return; else if (!analysis.issues || analysis.issues.length === 0) // if u don't have any issue, why tf would u report 😭 return; else if (!analysis.explanation) // once again, if u don't have reasoning, why report return; const violation = analysis.issues.map(issue => `${issue.severity} ${issue.policy} violation`).join(", "); const confidence = Math.round(analysis.confidence * 100); const username = item.user.name; await this.ws.gui.settings.waitForClose(); const confirmed = await this.ws.gui.dialog.confirm("Report Username to UAA", `\n\t\t\t\tThe username <span class="confirmation-modal-username">${this.ws.util.escape(username)}</span> for ${violation}.<br><br>\n\t\t\t\t<strong>AI Confidence:</strong> ${confidence}%<br>\n\t\t\t\t<strong>Reasoning:</strong> ${analysis.explanation}<br>\n\t\t\t`, username); if (confirmed) { await this.ws.gui.settings.waitForClose(); const reason = await this.ws.gui.dialog.UAA(item.user.name); if (reason) this.ws.execute({ actions: [ { name: "report-user-to-uaa", params: { reason } } ] }, void 0, void 0, item); } } _defineProperty(Queue, "refresh", 1e3); _defineProperty(Queue, "types", [ "recent", "pending", "watchlist", "abuselog", "users" ]); _defineProperty(Queue, "groups", { void: "void", recent: "edit", pending: "edit", watchlist: "edit", edit: "edit", abuselog: "abuselog", users: "logevent" }); /***/ }, /***/ 7054(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.WikiShield = void 0; var _helpers = __webpack_require__(3241); var _manager = __webpack_require__(8169); var _api = __webpack_require__(2535); var _notifications = __webpack_require__(4674); var _progressBar = __webpack_require__(6151); var _queue = __webpack_require__(372); var _gui = __webpack_require__(8469); var _class = __webpack_require__(8678); var _manager2 = __webpack_require__(9501); var _controlKeys = __webpack_require__(9808); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _events = new WeakMap; var _WikiShield_brand = new WeakSet; class WikiShield { constructor(server, username, pendingChangesServers, dev) { _classPrivateMethodInitSpec(this, _WikiShield_brand); _classPrivateFieldInitSpec(this, _events, { ready: [] }); this.__DEV__ = dev; this.started = false; this.server = server; this.storage = new _manager2.StorageManager; this.defaultStorage = new _manager2.StorageManager; this.defaultStorage.load(); this.util = new _helpers.Utility(this); this.api = new _api.API(this, server, username, pendingChangesServers); this.notifications = new _notifications.Notifications(this); this.rights = {}; this.groups = {}; this.api.account().then(async info => { this.rights = info.rights.reduce((acc, right) => ({ ...acc, [right]: true }), {}); this.groups = info.groups.reduce((acc, group) => ({ ...acc, [group]: true }), {}); { // pending changes const allowed = this.rights.review && this.api.hasPendingChanges; document.querySelector("#queue-tab-pending").classList.toggle("hidden", !allowed); if (!allowed && this.queue.current.type === "pending") this.queue.switch("recent"); } await _assertClassBrand(_WikiShield_brand, this, _import).call(this); this.cleanup(); setInterval(() => this.cleanup(), 10 * 1e3); _assertClassBrand(_WikiShield_brand, this, _emit).call(this, "ready"); }); this.gui = new _gui.GUI(this); this.queue = new _queue.Queue(this); this.audio = new _manager.AudioManager(this); this.time = { load: null, save: null }; } get store() { return this.storage.data; } disable(title, message) { electron.disable(title, message); } on(event, callback, options = {}) { if (_classPrivateFieldGet(_events, this)[event]) _classPrivateFieldGet(_events, this)[event].push({ callback, options }); return this; } async init(override = null) { this.gui.build(); await this.audio.init(); return await _assertClassBrand(_WikiShield_brand, this, _import).call(this, override); } async noinit(override = null) { var _this$AI; const logs = await _assertClassBrand(_WikiShield_brand, this, _import).call(this, override); (_this$AI = this.AI) === null || _this$AI === void 0 || _this$AI.cancel.all(); if (this.store.settings.AI.enabled) switch (this.store.settings.AI.provider) { case "Ollama": { this.AI = new _class.AI.providers.Ollama(this, this.store.settings.AI.Ollama); } break; default: { this.AI = null; } break; } else this.AI = null; { // queue const width = this.store.UI.queue.width; document.body.querySelector("#queue").style.width = width; document.body.querySelector("#right-container").style.width = `calc(100% - ${width})`; } { // details const width = this.store.UI.details.width; document.body.querySelector("#right-details").style.width = width; document.body.querySelector("#right-top").style.width = width; document.body.querySelector("#main-container").style.width = `calc(100% - ${width})`; // document.body.querySelector("#middle-top").style.right = `calc(${width} + 1vmin)`; } this.gui.settings.update(); return logs; } async start() { this.gui.start(); this.update(); this.queue.fetch(); this.started = true; } async update() { const start = performance.now(); const target = 2500; try { await this.api.account().then(info => { this.rights = info.rights.reduce((acc, right) => ({ ...acc, [right]: true }), {}); this.groups = info.groups.reduce((acc, group) => ({ ...acc, [group]: true }), {}); }); await this.api.getGlobalUserInfo(this.api.username).then(info => { var _this$rights; (_this$rights = this.rights).rollback || (_this$rights.rollback = info.rights.includes("rollback")); }); if (!this.rights.rollback && this.api.username !== "LuniZunie") this.disable("Rollback required", "Your account no longer has rollback rights, which are required to use WikiShield."); { // pending changes const allowed = this.rights.review && this.api.hasPendingChanges; document.querySelector("#queue-tab-pending").classList.toggle("hidden", !allowed); if (!allowed && this.queue.current.type === "pending") this.queue.switch("recent"); } { // backup this.backup(); } } catch (error) { console.error("Update error:", error); } setTimeout(() => this.update(), Math.max(0, target - (performance.now() - start))); // Aim for 1 second intervals, but don't pile up calls } cleanup() { const now = Date.now(); let changed = false; for (const [, value] of Object.entries(this.store.highlight)) for (const [name, time] of value.entries()) if (now >= time[1]) { value.delete(name); changed = true; } for (const [, value] of Object.entries(this.store.whitelist)) for (const [name, time] of value.entries()) if (now >= time[1]) { value.delete(name); changed = true; } if (changed) if (this.queue.current.item && this.gui) this.gui.renderQueue(this.queue.current.queue, this.queue.current.item); } controller(event) { var _event$target, _event$target2, _event$target3; if (!this.started) return; if (this.gui.dialog.dialogs.active) return this.gui.dialog.controller(event); else if (this.gui.settings.active) return this.gui.settings.controller(event); if (((_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.tagName) === "INPUT" || ((_event$target2 = event.target) === null || _event$target2 === void 0 ? void 0 : _event$target2.tagName) === "TEXTAREA" || (_event$target3 = event.target) !== null && _event$target3 !== void 0 && _event$target3.isContentEditable) return; // keydown bc we want speedy response if (event.type === "keydown") { if (event.repeat && !this.store.settings.repeat_control_scripts) return; const shortcut = (0, _controlKeys.buildShortcut)(event); for (const script of this.store.control_scripts) if (script.keys.every(key => key === shortcut)) { event.preventDefault(); this.execute(script); } } } async execute(script, continuity = true, updateProgress = null, item = null) { const base = updateProgress === null; const checker = (action, item) => { if (!action.name) return true; else if (action.name === "if") return this.gui.events.conditions[action.condition.name].check(this, item, action.condition.params); else if (action.name === "if not") return !this.gui.events.conditions[action.condition.name].check(this, item, action.condition.params); return false; }; if (base) { item !== null && item !== void 0 ? item : item = this.queue.current.item || 1; const allScripts = [ script ]; let totalActions = 0; while (allScripts.length > 0) { const current = allScripts[0]; if (checker(current, item)) { if (!current.actions) { allScripts.splice(0, 1); continue; } allScripts.push(...current.actions); } if (current.name && !(current.name === "if" || current.name === "if not") && this.gui.events.events[current.name].progress) totalActions++; allScripts.splice(0, 1); } if (totalActions > 0) { let actionsCompleted = 0; const progressBar = new _progressBar.ProgressBar; updateProgress = (text, error) => { const portion = text === "Done" ? 1 : actionsCompleted / totalActions; progressBar.set(text, portion, error); actionsCompleted++; }; } else updateProgress = _ => {}; } if (checker(script, item)) { for (const action of script.actions) { if (!("name" in action)) continue; // Create a copy of params to avoid mutating the original action object const params = { ...action.params }; for (const param of ((_this$gui$events$even = this.gui.events.events[action.name]) === null || _this$gui$events$even === void 0 || (_this$gui$events$even2 = _this$gui$events$even.parameters) === null || _this$gui$events$even2 === void 0 ? void 0 : _this$gui$events$even2.call(_this$gui$events$even, this, item)) || []) { var _this$gui$events$even, _this$gui$events$even2; if (param.id && !(param.id in params) && "default" in param) params[param.id] = param.default; } if (action.name === "if" || action.name === "if not") continuity = await this.execute(action, continuity, updateProgress, item); else { const event = this.gui.events.events[action.name]; const fail = () => { continuity = false; this.audio.playSound([ "action", "failed" ]); if (event.progress) updateProgress(event.progress, true); }; try { if (continuity || !event.continuity) { var _event$valid, _event$valid2; const validity = (_event$valid = (_event$valid2 = event.valid) === null || _event$valid2 === void 0 ? void 0 : _event$valid2.call(event, this, item, params)) !== null && _event$valid !== void 0 ? _event$valid : { valid: true }; if (validity.valid) { if (event.progress) { updateProgress(event.progress, false); this.audio.playSound([ "action", "default" ]); } this.store.statistics.actions_executed.total++; const result = await event.script(this, item, params); if (result.valid === false) { fail(); if ("reason" in result) this.gui.dialog.toast("Action failed", result.reason, "error"); } else { var _event$successful; this.store.statistics.actions_executed.successful++; (_event$successful = event.successful) === null || _event$successful === void 0 || _event$successful.call(event, this, item, params); } } else { fail(); if ("reason" in validity) this.gui.dialog.toast("Action skipped", validity.reason, "error"); } } } catch (error) { fail(); this.gui.dialog.toast("Please report to developer", `An error occurred while executing action "${action.name}". Check the console for details.`, "error"); console.error(`Error executing action "${action.name}":`, error.message || String(error)); } } } } if (!script.name) updateProgress("Done", !continuity); return continuity; } async getDEFCON() { const page = "User:EnterpriseyBot/defcon"; const content = (await this.api.getPagesContent([ page ]))[page]; const level = content.match(/level\s*=\s*(\d+)/); const info = content.match(/info\s*=\s*([\d.]+)/); return { level: level ? Number(level[1]).toLocaleString() : null, info: info ? Number(info[1]).toLocaleString() : null }; } export() { this.time.save = performance.now(); this.store.statistics.session_time += this.time.save - this.time.load; const {string, logs} = this.storage.encode(); _manager2.StorageManager.output(logs); return string; } backup() { this.time.save = performance.now(); this.store.statistics.session_time += this.time.save - this.time.load; this.time.load = this.time.save; const {string} = this.storage.encode(); electron.localStorage.set(`WikiShield:BackupStorage-${this.api.username}`, `${Date.now()};${string}`); return true; } async save() { this.backup(); const data = `${Date.now()};${this.export()}`, username = this.api.username; if (window.isFinite) electron.saveAccount(username, data); else { try { const result = await this.api.postWithToken({ action: "options", optionname: "userjs-wikishield-storage", optionvalue: data }); if ((result === null || result === void 0 ? void 0 : result.options) === "success") console.debug(`[WikiShield] Successfully saved account data for ${username}.`); else console.error(`[WikiShield] Failed to save account data for ${username}:`, result); } catch (err) { console.error(`[WikiShield] Failed to save account data for ${username}:`, err); } } } async load() { try { var _reduce$data, _reduce; const save = (_reduce$data = (_reduce = [ electron.localStorage.get(`WikiShield:BackupStorage-${this.api.username}`), (await this.api.post({ action: "query", meta: "userinfo", uiprop: "options", format: "json" })).query.userinfo.options[`userjs-wikishield-storage`] ].reduce((latest, current) => { var _latest$timestamp; current !== null && current !== void 0 ? current : current = "0;e30="; let timestamp = 0, data = current; if (current.includes(";")) { [timestamp, data] = current.split(";", 2); timestamp = parseInt(timestamp, 10); } if (timestamp > 0 && timestamp > ((_latest$timestamp = latest === null || latest === void 0 ? void 0 : latest.timestamp) !== null && _latest$timestamp !== void 0 ? _latest$timestamp : 0)) return { timestamp, data }; return latest; }, null)) === null || _reduce === void 0 ? void 0 : _reduce.data) !== null && _reduce$data !== void 0 ? _reduce$data : "e30="; return save; } catch (err) { var _console$error; return (_console$error = void console.error("Failed to load storage from wiki:", err)) !== null && _console$error !== void 0 ? _console$error : "e30="; } } page(title, php, encode = true) { return `https://${this.server}/${php ? `w/index.php${title}` : `wiki/${encode ? encodeURIComponent(title) : title}`}`; } open(href, external) { if (external === "force") external = false; else external || (external = !this.store.settings.wikipedia_popups.enabled); if (external) electron.openExternal(href); else { electron.openInBrowser(href).then(popupId => { if (popupId) requestAnimationFrame(() => { this.gui.dialog.popups.push(popupId); if (!document.getElementById("popup-blocker")) { const $popupBlock = document.createElement("div"); $popupBlock.id = "popup-blocker"; $popupBlock.innerText = "Please close the popup or click anywhere on this page to continue using WikiShield."; document.body.appendChild($popupBlock); this.gui.dialog.check(); } }); }); } } } exports.WikiShield = WikiShield; function _emit(event) { if (_classPrivateFieldGet(_events, this)[event]) for (const listener of _classPrivateFieldGet(_events, this)[event]) try { listener.callback(); } catch (_unused) {} finally { var _listener$options; if (((_listener$options = listener.options) === null || _listener$options === void 0 ? void 0 : _listener$options.once) === true) { _classPrivateFieldGet(_events, this)[event] = _classPrivateFieldGet(_events, this)[event].filter(l => l !== listener); } } return this; } async function _import(override = null) { const logs = this.storage.decode(override !== null && override !== void 0 ? override : await this.load()).logs; this.time.load = performance.now(); if (this.store.settings.AI.enabled) { switch (this.store.settings.AI.provider) { case "Ollama": { var _AI$providers; if (typeof ((_AI$providers = _class.AI.providers) === null || _AI$providers === void 0 ? void 0 : _AI$providers.Ollama) === "function") this.AI = new _class.AI.providers.Ollama(this, this.store.settings.AI.Ollama); else { console.error("AI.providers.Ollama is not available. Falling back to null."); this.AI = null; } } break; default: { var _this$AI2; (_this$AI2 = this.AI) === null || _this$AI2 === void 0 || _this$AI2.cancel.all(); this.AI = null; } break; } } else { var _this$AI3; (_this$AI3 = this.AI) === null || _this$AI3 === void 0 || _this$AI3.cancel.all(); this.AI = null; } return logs; } _defineProperty(WikiShield, "config", { version: "2.0.0", changelog: { version: "6", HTML: fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/CHANGELOG.html").then(res => res.text()).catch(() => "<em>Could not fetch changelog.</em>") }, pages: { AIV: "Wikipedia:Administrator intervention against vandalism", UAA: "Wikipedia:Usernames for administrator attention", RFPP: "Wikipedia:Requests for page protection/Increase", SRG: "Steward requests/Global" }, config: { refresh: { recent: 2e3, pending: 2e3, watchlist: 2e3, users: 2e3 }, historyCount: 10 } }); /***/ }, /***/ 4018(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.namespaces = void 0; const namespaces = exports.namespaces = [ { name: "Main", id: 0, analysis_description: { edit: "", username: "" } }, { name: "Talk", id: 1, analysis_description: { edit: "", username: "" } }, { name: "User", id: 2, analysis_description: { edit: "Flag content unrelated to Wikipedia, such as self-promotion. If the page looks like a Wikipedia article, check that it isn't an obvious hoax, and that it is a subpage. Do not follow strict standards for these pages.", username: "Check whether the username matches the base page title. Most often, a user page should only be edited by that user. Consider alternative accounts, like User:Example creating User:Example (alt)." } }, { name: "User talk", id: 3, analysis_description: { edit: "", username: "" } }, { name: "Project", id: 4, analysis_description: { edit: "", username: "" } }, { name: "Project talk", id: 5, analysis_description: { edit: "", username: "" } }, { name: "File", id: 6, analysis_description: { edit: "", username: "" } }, { name: "File talk", id: 7, analysis_description: { edit: "", username: "" } }, { name: "MediaWiki", id: 8, analysis_description: { edit: "", username: "" } }, { name: "MediaWiki talk", id: 9, analysis_description: { edit: "", username: "" } }, { name: "Template", id: 10, analysis_description: { edit: "", username: "" } }, { name: "Template talk", id: 11, analysis_description: { edit: "", username: "" } }, { name: "Help", id: 12, analysis_description: { edit: "", username: "" } }, { name: "Help talk", id: 13, analysis_description: { edit: "", username: "" } }, { name: "Category", id: 14, analysis_description: { edit: "", username: "" } }, { name: "Category talk", id: 15, analysis_description: { edit: "", username: "" } }, { name: "Portal", id: 100, analysis_description: { edit: "", username: "" } }, { name: "Portal talk", id: 101, analysis_description: { edit: "", username: "" } }, { name: "Draft", id: 118, analysis_description: { edit: "", username: "" } }, { name: "Draft talk", id: 119, analysis_description: { edit: "", username: "" } }, { name: "MOS", id: 126, analysis_description: { edit: "", username: "" } }, { name: "MOS talk", id: 127, analysis_description: { edit: "", username: "" } }, { name: "TimedText", id: 710, analysis_description: { edit: "", username: "" } }, { name: "TimedText talk", id: 711, analysis_description: { edit: "", username: "" } }, { name: "Module", id: 828, analysis_description: { edit: "Check whether the edit is meaningful Lua code. In this namespace, anything that isn't written in Lua can be safely assumed to be vandalism. Be careful about multi-line strings, as they might contain non-Lua code: check the context of the edit to make sure. Additionally, check if the edit introduces any obvious Lua syntax errors.", username: "" } }, { name: "Module talk", id: 829, analysis_description: { edit: "", username: "" } }, { name: "Event", id: 1728, analysis_description: { edit: "", username: "" } }, { name: "Event talk", id: 1729, analysis_description: { edit: "", username: "" } } ]; /***/ }, /***/ 6400(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.profanity = void 0; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } const any = "\\*#\\-"; const a = `[${any}a4]`; const b = `[${any}b6]`; const c = `[${any}ck]`; const d = `[${any}d6]`; const e = `[${any}e3]`; const f = `[${any}f]`; const g = `[${any}g9]`; const h = `[${any}h]`; const i = `[${any}i1y]`; const j = `[${any}j]`; const k = `[${any}k]`; const l = `[${any}l1]`; const m = `[${any}m]`; const n = `[${any}n]`; const o = `[${any}o0]`; const p = `[${any}p9]`; const q = `[${any}q9]`; const r = `[${any}r]`; const s = `[${any}sz526]`; const t = `[${any}t7]`; const u = `[${any}uv]`; const v = `[${any}vu]`; const w = `[${any}w]`; const x = `[${any}x]`; const y = `[${any}y]`; const z = `[${any}zs25]`; const zero = `[${any}0]`; const one = `[${any}1]`; const two = `[${any}2]`; const three = `[${any}3]`; const four = `[${any}4]`; const five = `[${any}5]`; const six = `[${any}6]`; const seven = `[${any}7]`; const eight = `[${any}8]`; const nine = `[${any}9]`; const _ = { a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0: zero, 1: one, 2: two, 3: three, 4: four, 5: five, 6: six, 7: seven, 8: eight, 9: nine }; const or = (...patterns) => new RegExp(patterns.map(p => p.source).join("|")); class Profanity { constructor(lookalikes = {}) { this.conversion = {}; for (const [key, variants] of Object.entries(lookalikes)) for (const variant of variants) { if (this.conversion[variant]) console.warn(`Profanity lookalike collision: ${variant} is already mapped to ${this.conversion[variant]}, remapping to ${key}`); this.conversion[variant] = key; } } removeAccents(str) { return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); } obscureReplacements(str) { return str.replace(/(\/[|\\]\/|\\[|\\]\\)/g, "n").replace(/&/g, "and").replace(/zero/g, "0").replace(/one/g, "1").replace(/two/g, "2").replace(/three/g, "3").replace(/four/g, "4").replace(/five/g, "5").replace(/six/g, "6").replace(/seven/g, "7").replace(/eight/g, "8").replace(/nine/g, "9"); // nine => 9 } parseString(str, preserveSpaces = false) { if (preserveSpaces) str = str.replace(/[._,;:|]/g, " ").replace(/\s+/g, " ").toLowerCase(); else str = str.replace(/[\s._,;:|]/g, "").toLowerCase(); str = this.removeAccents(str); let result = ""; for (const char of str) if (this.conversion[char]) result += this.conversion[char]; else result += char; str = this.obscureReplacements(result); return str; } analyzeObfuscation(originalText, matchStart, matchEnd, matchedWord, isMultiWord = false) { const segment = originalText.substring(matchStart, matchEnd); let obfuscation = 0, indicators = 0; const hasInternalSpaces = /\s/.test(segment); if (hasInternalSpaces && !isMultiWord) return -.95; const caseChanges = this.countCaseChanges(segment); if (caseChanges > 0) { const irregularCaseRatio = caseChanges / Math.max(1, segment.length - 1); if (irregularCaseRatio > .3) { obfuscation += .3; indicators++; } } const hasInternalSeparators = /[._,;:|]/.test(segment); if (hasInternalSeparators) { const separatorCount = (segment.match(/[._,;:|]/g) || []).length; const letterCount = (segment.match(/[a-zA-Z0-9]/g) || []).length; if (letterCount > 0) { const separatorRatio = separatorCount / letterCount; if (separatorRatio > .3) { obfuscation += Math.min(.5, separatorRatio * .7); indicators++; } } } const wordBoundaryScore = this.checkWordBoundaries(originalText, matchStart, matchEnd, matchedWord, isMultiWord); obfuscation += wordBoundaryScore; if (wordBoundaryScore !== 0) indicators++; const substitutionScore = this.checkSubstitution(segment, matchedWord); if (substitutionScore > 0) { obfuscation += substitutionScore; indicators++; } if (wordBoundaryScore < 0) { const isStandalone = this.isStandaloneWord(originalText, matchStart, matchEnd); if (!isStandalone) { const isCamelCaseBoundary = this.isCamelCaseBoundary(originalText, matchStart, matchEnd); if (isCamelCaseBoundary) { obfuscation += .2; indicators++; } else { obfuscation -= .2; indicators++; } } } return Math.max(-1, Math.min(1, obfuscation)); } countCaseChanges(str) { let changes = 0; for (let i = 1; i < str.length; i++) { const prev = str[i - 1]; const curr = str[i]; if (/[a-zA-Z]/.test(prev) && /[a-zA-Z]/.test(curr)) { const prevUpper = prev === prev.toUpperCase(); const currUpper = curr === curr.toUpperCase(); if (prevUpper !== currUpper) changes++; } } return changes; } checkWordBoundaries(text, start, end, matchedWord, isMultiWord = false) { const before = start > 0 ? text[start - 1] : ""; const after = end < text.length ? text[end] : ""; const segment = text.substring(Math.max(0, start - 8), Math.min(text.length, end + 8)).toLowerCase(); const legitimatePatterns = [ /WMF/, /pass(word|phrase|port|enger|ion|ive|ed|ing|es|key|code|over|by|able)/i, /class(room|mate|ified|es|ic|y|ification)/i, /grass(land|hopper|y|es)/i, /bass(ist|oon|line|es)/i, /mass(ive|acre|age|es|achusetts)/i, /assign(ment|ed|ing|s|ee|or)/i, /assess(ment|ed|ing|or|s)/i, /assemble|assembly|assertion|asset|assist|assume|assure|associate|association/i, /brass|crass|harass|morass|surpass|trespass|compass|embassy|embarrass/i, /cock(pit|tail|roach|ade|atoo|le|ney)/i, /scunthorpe|penistone|shitterton|lightwater|middlesex|sussex|essex|wessex/i, /dick(ens|inson|son|ey|ie)/i, /analyst|analytics|analyze|canal|banal/i, /therapist|therapeutic|therapy/i, /cumul(ative|us|at)|circum(stance|ference|cise|vent|navigate|scribe)/i, /butter(cup|fly|milk|scotch|fingers|nut)|buttress|button|rebuttal/i, /count(ry|er|ess|down|ing|ed|able|enance|erfeit|erpart)/i, /grape|drape|scrape|landscape|escapade/i, /shell(fish|fire|ter|ed)|eggshell|nutshell|bombshell|seashell/i, /whole(sale|some|hearted)/i, /exchange|exchequer/i, /title|titled|subtitle|entitle/i, /sextant|sextet|bisect|insect|intersect|section|sector/i, /cocktail|peacock|hancock|hitchcock|babcock|woodcock/i, /niger(ia|ian)|montenegro/i, /penisten|penetrat|penal(ty|ize|ise)|penchant|pencil|pendant|penguin|peninsula/i, /manslaughter|slaughterhouse/i, /shitake|shiitake/i, /arsenic|arsenal/i, /cummings|scumble/i, /smother|another|mother(board|land|hood)/i, /wanton|wanting|wanted|warrant/i, /trigger|bigger|digger|jigger|rigger|vigor|figure/i, /ballad|ball(room|park|istic|oon|et|ot|ard|ast)/i, /grape(fruit|vine|shot)/i, /raptor|rapport|rapid|rapier|rapture/i, /killed|killer|skill(ed|ful|s)|killjoy|kiln|kilo(gram|meter|byte|watt)/i, /bomb(ard|astic|shell|er|ing|ay)/i, /hellenic|hello|shell|othello/i, /crack(down|le|ed|ing|erjack)|firecracker/i, /jewel{1,2}/i, /skill/i ]; for (const pattern of legitimatePatterns) if (pattern.test(segment)) return -.8; const beforeIsAlpha = /[a-zA-Z]/.test(before); const afterIsAlpha = /[a-zA-Z]/.test(after); if (beforeIsAlpha && afterIsAlpha) { const beforeText = text.substring(Math.max(0, start - 8), start).toLowerCase(); const afterText = text.substring(end, Math.min(text.length, end + 8)).toLowerCase(); const fullContext = text.substring(Math.max(0, start - 8), Math.min(text.length, end + 8)).toLowerCase(); const paddingScore = this.analyzePaddingLikelihood(beforeText, afterText, matchedWord); if (paddingScore >= .4) return 0; if (fullContext.length > 15 && fullContext === fullContext.toLowerCase() && !/\s/.test(fullContext)) return 0; return -.5; } if (beforeIsAlpha || afterIsAlpha) { const beforeText = text.substring(Math.max(0, start - 8), start).toLowerCase(); const afterText = text.substring(end, Math.min(text.length, end + 8)).toLowerCase(); const paddingScore = this.analyzePaddingLikelihood(beforeText, afterText, matchedWord); if (paddingScore >= .4) return 0; return 0; } const matchSegment = text.substring(start, end); const hasInternalSpaces = /\s/.test(matchSegment); if (hasInternalSpaces && !isMultiWord) return -.9; return 0; } analyzePaddingLikelihood(beforeText, afterText, matchedWord) { let paddingScore = 0; let indicators = 0; const consonantCluster = /[bcdfghjklmnpqrstvwxyz]{3,}/i; if (consonantCluster.test(beforeText) || consonantCluster.test(afterText)) { paddingScore += .4; indicators++; } const suspiciousRepeats = /([a-z])\1{1,}/i; const afterRepeats = afterText.match(suspiciousRepeats); if (afterRepeats && afterRepeats[0].length >= 2) { const repeatPos = afterText.indexOf(afterRepeats[0]); if (repeatPos >= afterText.length - 3) { const commonDoubles = /\b(ll|ss|tt|nn|mm|pp|dd|bb|gg|ff)$/i; if (!commonDoubles.test(afterRepeats[0]) || afterText.length <= 3) { paddingScore += .35; indicators++; } } } if (beforeText.length <= 2 && beforeText.length > 0) { paddingScore += .25; indicators++; } if (afterText.length <= 3 && afterText.length > 0) { const commonSuffixes = /^(er|ed|ing|ion|ly|al|ful|less|ness|ment|s)$/i; if (!commonSuffixes.test(afterText)) { paddingScore += .2; indicators++; } } const uncommonPatterns = /([qx][^u]|[jqxz]{2}|[bcdfghjklmnpqrstvwxz]{4,})/i; if (uncommonPatterns.test(beforeText + afterText)) { paddingScore += .3; indicators++; } const combined = beforeText + afterText; if (combined.length > 0) { const vowels = (combined.match(/[aeiou]/gi) || []).length; const ratio = vowels / combined.length; if (ratio < .2) { paddingScore += .3; indicators++; } } return Math.min(1, paddingScore); } checkSubstitution(segment, matchedWord) { const substitutionChars = /[0-9@$!]/; const hasSubstitution = substitutionChars.test(segment); if (!hasSubstitution) return 0; let subCount = 0; for (const char of segment) if (substitutionChars.test(char)) subCount++; const subRatio = subCount / segment.length; return Math.min(.3, subRatio * .6); } isStandaloneWord(text, start, end) { const before = start > 0 ? text[start - 1] : " "; const after = end < text.length ? text[end] : " "; const wordBoundary = /[\s.,;:!?()[\]{}"'`~\-_]/; return wordBoundary.test(before) && wordBoundary.test(after); } isCamelCaseBoundary(text, start, end) { if (start === 0 || end === text.length) return false; const before = text[start - 1]; const firstChar = text[start]; const lastChar = text[end - 1]; const after = text[end]; const startsWithCapital = /[A-Z]/.test(firstChar); const beforeIsLower = /[a-z]/.test(before); const afterIsLower = /[a-z]/.test(after); const endsWithLower = /[a-z]/.test(lastChar); if (beforeIsLower && startsWithCapital || endsWithLower && /[A-Z]/.test(after)) return true; return false; } findMatchPosition(originalText, matchedText, parsedOriginal, parsedMatch) { const lowerOriginal = originalText.toLowerCase(); let bestStart = -1; let bestEnd = -1; let bestScore = -1; for (let i = 0; i <= lowerOriginal.length - matchedText.length; i++) { const candidate = this.parseString(originalText.substring(i, i + matchedText.length + 10)); if (candidate.includes(parsedMatch)) { const score = this.calculateSimilarity(parsedMatch, candidate.substring(0, parsedMatch.length)); if (score > bestScore) { bestScore = score; bestStart = i; bestEnd = i + matchedText.length; } } } return { start: bestStart, end: bestEnd }; } calculateSimilarity(str1, str2) { const len = Math.min(str1.length, str2.length); let matches = 0; for (let i = 0; i < len; i++) if (str1[i] === str2[i]) matches++; return matches / Math.max(str1.length, str2.length); } match(raw) { const str = this.parseString(raw); const found = []; for (const hit of Profanity.hits) { if (hit.term) { const term = hit.term; const severity = hit.severity || .5; const note = hit.note || null; const isMultiWord = hit.multiWord || false; if (term.length === 1 && /[^\x00-\x7F]/.test(term)) continue; const searchString = isMultiWord ? this.parseString(raw, true) : str; const pattern = term.split("").reduce((acc, char) => { var _$char; if (isMultiWord && char === " ") return acc + " *"; const charPattern = (_$char = _[char]) !== null && _$char !== void 0 ? _$char : char; return acc + charPattern; }, ""); const regex = new RegExp(pattern, "gi"); let match; const positionMap = this.buildPositionMap(raw, isMultiWord); while ((match = regex.exec(searchString)) !== null) { const matchedText = match[0]; const parsedStart = match.index; const parsedEnd = parsedStart + matchedText.length; const originalStart = positionMap[parsedStart] || parsedStart; const originalEnd = positionMap[parsedEnd - 1] !== undefined ? positionMap[parsedEnd - 1] + 1 : parsedEnd; const obfuscation = this.analyzeObfuscation(raw, originalStart, originalEnd, term, isMultiWord); let matchConfidence = this.calculateMatchConfidence(matchedText, term); if (obfuscation < -.5) matchConfidence *= Math.max(.01, 1 + obfuscation * 4); else if (obfuscation < -.2) matchConfidence *= Math.max(.05, 1 + obfuscation * 2.5); else if (obfuscation > .5) matchConfidence = Math.min(1, matchConfidence + obfuscation * .08); const threshold = Math.max(.05, .2 - term.length * .015); if (matchConfidence >= threshold) { const originalSegment = raw.substring(originalStart, originalEnd); if (hit.ignore && Array.isArray(hit.ignore)) if (hit.ignore.includes(originalSegment)) continue; found.push({ name: term, match: matchedText, confidence: matchConfidence, obfuscation, severity, note, originalSegment }); } } } else if (hit.regex) { const matches = raw.match(new RegExp(hit.regex.source, "g")); if (matches) for (const match of matches) found.push({ name: hit.name, match, confidence: 1, obfuscation: .5, severity: hit.severity || .5, note: hit.note || "Pattern-based detection with high confidence. Obfuscation is moderate for formatted data.", originalSegment: match }); } else if (hit.test) { if (hit.test(raw)) found.push({ name: hit.name, match: raw, confidence: 1, obfuscation: .5, severity: hit.severity || .5, note: hit.note || "Test-based detection with high confidence.", originalSegment: raw }); } } return found; } buildPositionMap(original, preserveSpaces = false) { const map = {}; let parsedIndex = 0; for (let i = 0; i < original.length; i++) { const char = original[i]; if (preserveSpaces) { if (/[\s._,;:|]/.test(char)) { if (i === 0 || !/[\s._,;:|]/.test(original[i - 1])) { map[parsedIndex] = i; parsedIndex++; } } else { map[parsedIndex] = i; parsedIndex++; } } else { if (!/[\s._,;:|]/.test(char)) { map[parsedIndex] = i; parsedIndex++; } } } return map; } findOriginalPosition(original, normalizedIndex) { let count = 0; for (let i = 0; i < original.length; i++) { const char = original[i]; if (!/\s/.test(char)) { if (count === normalizedIndex) { return i; } count++; } } return normalizedIndex; } calculateMatchConfidence(matchedString, originalWord) { const fillerPattern = /[\*#_\-]/; let genuineChars = 0; let fillerChars = 0; let consecutiveFillers = 0; let maxConsecutiveFillers = 0; for (const char of matchedString) { if (fillerPattern.test(char)) { fillerChars++; consecutiveFillers++; maxConsecutiveFillers = Math.max(maxConsecutiveFillers, consecutiveFillers); } else { genuineChars++; consecutiveFillers = 0; } } const totalChars = genuineChars + fillerChars; if (totalChars === 0) return 0; const genuineRatio = genuineChars / totalChars; // Hard cutoffs: matches dominated by wildcard/filler chars are noise if (genuineRatio < .3) return 0; if (genuineRatio < .5) return genuineRatio * .1; // Consecutive filler clusters — runs of wildcards indicate noise const clusterPenalty = maxConsecutiveFillers > 1 ? Math.max(.2, 1 - maxConsecutiveFillers * .2) : 1; // Character repetition in genuine chars const charCounts = {}; for (const char of matchedString) if (!fillerPattern.test(char)) charCounts[char] = (charCounts[char] || 0) + 1; let repetitionPenalty = 1; for (const count of Object.values(charCounts)) if (count > 2) repetitionPenalty *= Math.max(.4, 1 - (count - 2) * .15); // Length inflation — match significantly longer than the term is suspicious const lengthRatio = totalChars / originalWord.length; const lengthPenalty = lengthRatio > 1.5 ? Math.max(.2, 1 - (lengthRatio - 1) * .4) : 1; // Genuine ratio is the dominant confidence signal return Math.max(0, Math.min(1, genuineRatio * clusterPenalty * repetitionPenalty * lengthPenalty)); } score(raw) { const matches = this.match(raw); let totalScore = 0; for (const match of matches) totalScore += match.confidence; return totalScore; } evaluate(raw) { const matches = this.match(raw); const str = this.parseString(raw); if (matches.length === 0) return { finalScore: 0, risk: "No", matches: [], details: { baseScore: 0, weightedScore: 0, severityScore: 0, matchCount: 0, averageConfidence: 0, averageObfuscation: 0, averageSeverity: 0, textLength: raw.length, densityPenalty: 0, repetitionPenalty: 0, diversityBonus: 0, lengthModifier: 1, highConfidenceMatches: 0, mediumConfidenceMatches: 0, lowConfidenceMatches: 0 } }; let highConfidenceMatches = 0; let mediumConfidenceMatches = 0; let lowConfidenceMatches = 0; let totalConfidence = 0; let totalObfuscation = 0; let weightedSeverity = 0; const uniqueMatches = new Set; for (const match of matches) { const severity = match.severity || .5; const conf = match.confidence; // Use confidence^1.5 so low-confidence matches contribute very little const effectiveConf = Math.pow(conf, 1.5); totalConfidence += conf; weightedSeverity += effectiveConf * severity; totalObfuscation += match.obfuscation || 0; uniqueMatches.add(match.name); if (conf >= .7) highConfidenceMatches++; else if (conf >= .4) mediumConfidenceMatches++; else lowConfidenceMatches++; } const averageConfidence = totalConfidence / matches.length; const averageObfuscation = totalObfuscation / matches.length; const averageSeverity = totalConfidence > 0 ? weightedSeverity / totalConfidence : 0; // Base score: tier weights emphasize high-confidence matches const baseScore = highConfidenceMatches * 1 + mediumConfidenceMatches * .35 + lowConfidenceMatches * .08; // Text density penalty const textLength = str.length; const matchDensity = matches.length / Math.max(textLength / 5, 1); const densityPenalty = Math.tanh(matchDensity * .3) * .6; // Character repetition penalty const charFrequency = {}; for (const char of str) if (/[a-z0-9]/.test(char)) charFrequency[char] = (charFrequency[char] || 0) + 1; let repetitionScore = 0; const totalChars = Object.values(charFrequency).reduce((a, b) => a + b, 0); for (const count of Object.values(charFrequency)) if (count > 3) repetitionScore += Math.pow((count - 3) / totalChars, 1.5); const repetitionPenalty = Math.min(.8, repetitionScore * 2); // Diversity bonus — more unique terms is more concerning const uniqueMatchRatio = uniqueMatches.size / matches.length; const diversityBonus = uniqueMatchRatio > .6 ? (uniqueMatchRatio - .6) * 1 : 0; // Length modifier const lengthModifier = Math.max(.5, Math.min(1.5, 1 + Math.log10(Math.max(10, textLength)) / 10)); // Obfuscation penalty — high obfuscation means less certainty, not more const obfuscationPenalty = averageObfuscation > .4 ? (averageObfuscation - .4) * .5 : averageObfuscation < -.2 ? Math.abs(averageObfuscation) * .4 : 0; // Critical patterns only count if backed by decent confidence const criticalPatterns = matches.filter(m => m.severity >= 1 && m.confidence >= .5 || m.confidence >= .9).length; const criticalBonus = criticalPatterns * .8; // Compose final score const weightedBase = baseScore * averageSeverity * lengthModifier; const penalties = densityPenalty + repetitionPenalty + obfuscationPenalty; let finalScore = weightedBase + weightedSeverity * .5 + diversityBonus + criticalBonus - penalties; // Confidence gate: if average confidence is low, scale everything down if (averageConfidence < .5) finalScore *= Math.max(.1, averageConfidence * 1.5); // Soft cap if (finalScore > 3) finalScore = 3 + Math.log10(finalScore - 2) * 1.5; else if (finalScore > 1.5) finalScore = 1.5 + Math.sqrt(finalScore - 1.5) * .8; finalScore = Math.max(0, finalScore); let risk = "No"; if (finalScore >= 4 || criticalPatterns >= 2) risk = "Critical"; else if (finalScore >= 2.5) risk = "High"; else if (finalScore >= 1.5) risk = "Medium"; else if (finalScore >= .5) risk = "Low"; return { clamped: Math.max(0, Math.min(1, finalScore / 5)), finalScore: Math.round(finalScore * 100) / 100, risk, matches, details: { baseScore: Math.round(baseScore * 100) / 100, weightedScore: Math.round(weightedBase * 100) / 100, severityScore: Math.round(weightedSeverity * 100) / 100, matchCount: matches.length, uniqueMatches: uniqueMatches.size, averageConfidence: Math.round(averageConfidence * 100) / 100, averageObfuscation: Math.round(averageObfuscation * 100) / 100, averageSeverity: Math.round(averageSeverity * 100) / 100, textLength: raw.length, densityPenalty: Math.round(densityPenalty * 100) / 100, repetitionPenalty: Math.round(repetitionPenalty * 100) / 100, diversityBonus: Math.round(diversityBonus * 100) / 100, lengthModifier: Math.round(lengthModifier * 100) / 100, obfuscationPenalty: Math.round(obfuscationPenalty * 100) / 100, criticalPatterns, highConfidenceMatches, mediumConfidenceMatches, lowConfidenceMatches } }; } } _defineProperty(Profanity, "hits", [ { name: "URL", regex: /(?:https?:\/\/(?:www\.)?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*(?:\/[^\s]*)?|(?:www\.)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:\/[^\s]*)?|[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.(?:com|org|net|edu|gov|mil|int|co|io|ai|app|dev|info|biz|name|pro|museum|aero|coop|jobs|mobi|travel|xxx|ac|ad|ae|af|ag|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(?:\/[^\s]*)?)/i, severity: .1, note: "URLs in usernames may indicate spam or advertising." }, { name: "Phone number", regex: /(\+?\d{1,3}[-.\s]?|\(\+?\d{1,3}\)\s?)?(\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\d{4}[-.\s]?\d{3}[-.\s]?\d{3})/, severity: .3, note: "The pattern of numbers in this username resemble a phone number. Usernames containing personal information may be considered disruptive." }, { name: "Email address", regex: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/, severity: .3, note: "Email addresses in usernames can indicate spam or contact sharing." }, { term: "base64", severity: .2, note: "Base64 encoding may be used to obfuscate content to bypass filters." }, { term: "fromhex", severity: .2, note: "Hex encoding may be used to obfuscate content to bypass filters." }, { term: "1488", severity: .5, note: "Well-known Neo-Nazi symbol, however the number itself can appear in innocent contexts." }, { term: "nazi", severity: 1 }, { term: "swastika", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "卍", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "卐", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "࿕", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "࿖", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "࿗", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "࿘", severity: .8, note: "Symbol often associated with Nazism, however it has historical significance in other cultures." }, { term: "aryan", severity: .7, note: "Associated with white supremacist ideology, though it can also be in reference to the self-designation of Indo-Iranian peoples." }, { term: "fascism", severity: .5 }, { term: "fascist", severity: .5 }, { term: "facist", severity: .5 }, { term: "☭", severity: .5, note: "Hammer and sickle symbol, politically charged but context-dependent." }, { term: "✡", severity: .4, note: "Star of David, can be used respectfully or in antisemitic contexts." }, { term: "44", severity: .1, note: "Obfuscated symbol of the Nazi SS division. If appears as 'ᛋᛋ' or similar, indicates intent to reference the SS." }, { term: "imbo wales", severity: .2, multiWord: true, note: "Play on 'Jimbo Wales' name, may indicate mockery or impersonation." }, { term: "sock", severity: .3, note: "May reference sockpuppet accounts but has innocent meanings." }, { term: "puppet", severity: .3, note: "May reference sockpuppet accounts but has innocent meanings." }, { term: "sock puppet", severity: .6, multiWord: true, note: "Often used in usernames by sockpuppeteers." }, { term: "return", severity: .2, note: "Often used in usernames by sockpuppeteers." }, { term: "is back", severity: .6, multiWord: true, note: "Often used in usernames by sockpuppeteers." }, { term: "are back", severity: .6, multiWord: true, note: "Often used in usernames by sockpuppeteers." }, { term: "timelash", severity: 1, note: 'Well-known sockpuppeteer ("Timelash") on Wikipedia.' }, { term: "my little", severity: .8, multiWord: true, note: "If related to 'my little pony', indicates sockpuppeteer." }, { term: "my little pony", severity: 1, multiWord: true, note: "Well-known sockpuppeteer on Wikipedia." }, { term: "friendship is magic", severity: 1, multiWord: true, note: "Well-known sockpuppeteer on Wikipedia." }, { term: "anal", severity: .7 }, { term: "anus", severity: .5 }, { term: "sex", severity: .3 }, { term: "secs", severity: .05, note: "Obfuscated form of 'sex'." }, { term: "seggs", severity: .2, note: "Obfuscated form of 'sex'." }, { term: "willy", severity: .2, note: "Slang for penis." }, { term: "wank", severity: .6, note: "British sexual slang for masturbation." }, { term: "barf", severity: .3 }, { term: "bastard", severity: .5 }, { term: "batty boy", severity: .7, multiWord: true, note: "Homophobic slur in British/Caribbean English." }, { name: "bitch", regex: new RegExp(`${b + i}(${o}|${a})?${t}?${c + h}`), severity: .7 }, { term: "blow job", severity: .8, multiWord: true }, { term: "blowing", severity: .2, note: "Sexual innuendo but common verb." }, { term: "boner", severity: .4 }, { term: "boob", severity: .4 }, { term: "booty", severity: .3 }, { term: "breast", severity: .4, note: "Anatomical term, but can be used inappropriately." }, { term: "butt", severity: .2 }, { term: "bite me", severity: .5, multiWord: true, note: "Often has defiant or provocative connotation." }, { term: "butt plug", severity: .7, multiWord: true }, { term: "bollock", severity: .5, note: "British slang for testicles." }, { term: "bollox", severity: .5, note: "Variant spelling of 'bollocks'." }, { term: "bollix", severity: .5, note: "Variant spelling of 'bollocks'." }, { term: "clit", severity: .7 }, { term: "cock", severity: .7 }, { term: "cum", severity: .7 }, { term: "brain dead", severity: .5, multiWord: true, note: "Derogatory medical reference." }, { term: "bukake", severity: .7 }, { term: "bully", severity: .5, note: "Indicates harassment behavior." }, { term: "bullies", severity: .5, note: "Indicates harassment behavior." }, { term: "bullied", severity: .3, note: "May indicate victimhood or boasting." }, { term: "versus", severity: .4, note: "Combat/conflict framing, but legitimate word." }, { term: "bumming", severity: .5, note: "British slang for anal sex or begging." }, { term: "bunghole", severity: .5 }, { term: "cesspool", severity: .3, note: "Derogatory term for filthy place." }, { term: "cesspit", severity: .3, note: "Variant of cesspool." }, { term: "dick", severity: .7 }, { term: "prick", severity: .7 }, { term: "dildo", severity: .7 }, { term: "censor", severity: .1, note: "May indicate anti-censorship stance." }, { term: "ching", severity: .8, note: "Part of racial slur against Asians." }, { term: "ching chong", severity: .9, multiWord: true, note: "Racist mockery of Asian languages." }, { term: "ching chang", severity: .9, multiWord: true, note: "Racist mockery of Asian languages." }, { term: "wing wong", severity: .9, multiWord: true, note: "Racist mockery of Asian languages." }, { term: "bot", severity: .4, note: "May indicate automated account claim." }, { term: "ox long", severity: .5, multiWord: true, note: "Phonetic sexual innuendo for 'cock's long'." }, { term: "douche", severity: .5 }, { term: "cunt", severity: .7 }, { term: "cuck", severity: .4, note: "Derogatory term from manosphere." }, { term: "curry munch", severity: .9, multiWord: true, note: "Racist slur against South Asians." }, { term: "crime", severity: .3, note: "Negative connotation but legitimate word." }, { term: "pussy", severity: .7 }, { term: "deeznuts", severity: .3, note: "Crude joke phrase." }, { term: "destroy", severity: .3, note: "Aggressive language." }, { term: "destruction", severity: .3, note: "Aggressive language." }, { term: "diaper", severity: .3, note: "Infantilization or fetish reference." }, { term: "diarrhea", severity: .3 }, { term: "throbbing", severity: .5, note: "Sexual innuendo term." }, { term: "dimwit", severity: .3 }, { term: "doo doo", severity: .3, multiWord: true }, { term: "dookie", severity: .3 }, { term: "fart", severity: .3 }, { term: "ejaculat", severity: .7 }, { term: "erect", severity: .5, note: "Sexual context or legitimate word." }, { term: "erotic", severity: .5 }, { term: "fuck", severity: .8 }, { term: "phuck", severity: .8, note: 'Alternative spelling of "fuck" to bypass detection.' }, { term: "orgasm", severity: .7 }, { term: "rape", severity: 1 }, { term: "lawsuit", severity: .3, note: "Legal threat implication." }, { term: "fraud", severity: .5, note: "Accusation of criminal behavior." }, { term: "tard", severity: .5, note: "Ableist slur suffix." }, { term: "terror", severity: .7, note: "Violence/terrorism reference." }, { term: "mike hunt", severity: .5, multiWord: true, note: "Phonetic sexual innuendo for 'my cunt'." }, { term: "mike ox", severity: .5, multiWord: true, note: "Phonetic sexual innuendo for 'my cock's'." }, { term: "masturbat", severity: .7 }, { term: "nutsack", severity: .5 }, { term: "ophile", severity: 1, note: "Suffix for sexual predator terms like pedophile." }, { term: "pedo", severity: .6 }, { term: "peeing", severity: .3 }, { term: "peanus", severity: .5, note: "Intentional misspelling of 'penis'." }, { term: "penis", severity: .5, note: "Anatomical term, inappropriate in usernames." }, { term: "porn", severity: .7 }, { term: "piss", severity: .5 }, { term: "poop", severity: .3 }, { term: "prison", severity: .3, note: "Criminal context, but legitimate word." }, { term: "prostitute", severity: .5, note: "Sexual work reference or insult." }, { term: "queer", severity: .5, note: "Can be slur or reclaimed identity." }, { term: "rectum", severity: .3, note: "Anatomical term." }, { term: "report me", severity: .3, multiWord: true, note: "Defiant/trolling phrase." }, { term: "rimming", severity: .7 }, { term: "scrotum", severity: .5, note: "Anatomical term, inappropriate in usernames." }, { term: "semen", severity: .7 }, { term: "slut", severity: .7 }, { term: "sucks", severity: .3, note: "Mild profanity or legitimate verb." }, { term: "sux", severity: .3, note: "Intentional misspelling of 'sucks'." }, { term: "vagina", severity: .5, note: "Anatomical term, inappropriate in usernames." }, { term: "vadge", severity: .5, note: "Slang for vagina." }, { term: "vomit", severity: .3 }, { term: "vulva", severity: .5, note: "Anatomical term, inappropriate in usernames." }, { term: "whore", severity: .7 }, { term: "chink", severity: 1 }, { term: "jew", severity: .3, note: "Legitimate religious/ethnic term but tracked for antisemitic usage patterns." }, { term: "nigger", severity: 1 }, { term: "nigga", severity: 1 }, { term: "nigguh", severity: 1, note: "Phonetic spelling of racial slur." }, { term: "niglet", severity: 1 }, { term: "pajeet", severity: .7, note: "Derogatory term for South Asians." }, { term: "slave", severity: .6, note: "Dehumanizing term with historical trauma, but legitimate historical uses." }, { term: "master race", severity: 1, multiWord: true, note: "Nazi supremacist ideology phrase." }, { term: "inferior race", severity: 1, multiWord: true }, { term: "superior race", severity: 1, multiWord: true, note: "White supremacist ideology." }, { term: "racist", severity: .8 }, { term: "racism", severity: .7 }, { term: "racial", severity: .3, note: "Neutral term but tracked for context in discriminatory language." }, { term: "bigot", severity: .7 }, { term: "fag", severity: .7 }, { term: "taliban", severity: .7, note: "Terrorist organization reference." }, { term: "antisemit", severity: 1 }, { term: "bleed", severity: .3, note: "Can indicate violence or be medical." }, { term: "bloody", severity: .3, note: "British profanity or literal blood reference." }, { term: "hell", severity: .5, note: "Religious reference used as mild profanity, but legitimate uses." }, { term: "damn", severity: .3 }, { term: "crap", severity: .3 }, { term: "darn", severity: .1, note: "Mild euphemism for 'damn'." }, { term: "shutup", severity: .3, note: "Rude command indicating hostility." }, { term: "spastic", severity: .5, note: "Ableist slur in British English, medical term in US." }, { term: "disabled", severity: .1, note: "Legitimate disability term but tracked for ableist patterns." }, { term: "loser", severity: .3 }, { term: "abuse", severity: .5, note: "Indicates harmful behavior or accusations." }, { term: "spam", severity: .3, note: "Indicates unwanted content or disruption." }, { term: "abusi", severity: .5, note: "Variant of 'abuse/abusive'." }, { term: "hitler", severity: 1 }, { term: "adolf", severity: .4, note: "Common name but often used in Hitler references." }, { term: "gestapo", severity: 1 }, { term: "heil", severity: .8, note: "Nazi salute reference." }, { term: "final solution", severity: 1, multiWord: true, note: "Nazi euphemism for genocide." }, { term: "death camp", severity: 1, multiWord: true }, { term: "concentration camp", severity: 1, multiWord: true, note: "Holocaust reference, legitimate historical use but concerning in usernames." }, { term: "gas chamber", severity: 1, multiWord: true }, { term: "holocaust", severity: .5, note: "Historical tragedy reference, legitimate historical use." }, { term: "zionis", severity: .5, note: "Political term stem, can be antisemitic depending on context." }, { term: "fuhrer", severity: 1 }, { term: "reich", severity: .7, note: "Nazi Germany reference, though legitimate German word." }, { term: "massacre", severity: .7 }, { term: "slaughter", severity: .7 }, { term: "torture", severity: .7 }, { term: "lynch", severity: 1, note: "Racist mob killing reference, though also a surname." }, { term: "killer", severity: .5 }, { term: "mobster", severity: .5, note: "Organized crime reference." }, { term: "gangster", severity: .3, note: "Criminal reference or slang." }, { term: "druglord", severity: .5, note: "Drug trafficking reference." }, { term: "drugs", severity: .3, note: "General term that can be legitimate or problematic." }, { term: "meth", severity: .5, note: "Reference to illegal drug, though also shorthand for 'method'." }, { term: "cocaine", severity: .5 }, { term: "heroin", severity: .5 }, { term: "weed", severity: .3, note: "Marijuana reference with varying legal status, also refers to plants." }, { term: "marijuana", severity: .3, note: "Cannabis reference with complex legal status." }, { term: "crack", severity: .5, note: "Drug reference or legitimate verb." }, { term: "amphetamine", severity: .5 }, { term: "benzo", severity: .3, note: "Drug abbreviation or name prefix." }, { term: "benzodiazepine", severity: .5 }, { term: "opioid", severity: .3, note: "Drug class, medical term." }, { term: "opiate", severity: .3, note: "Drug class, medical term." }, { term: "ketamine", severity: .5, note: "Drug reference or medical use." }, { term: "rohypnol", severity: .7, note: "Date rape drug reference." }, { term: "i like", severity: .2, multiWord: true, note: "Flagged to detect inappropriate statements when combined with other terms." }, { term: "i love", severity: .3, multiWord: true, note: "Flagged to detect inappropriate statements when combined with other terms." }, { term: "i hate", severity: .5, multiWord: true, note: "Flagged to detect inappropriate statements when combined with other terms." }, { term: "young", severity: .2, note: "Age reference with legitimate uses but flagged in combination." }, { term: "underage", severity: .8, note: "Age reference with concerning implications in certain contexts." }, { term: "teen", severity: .3, note: "Age reference, concerning in some contexts." }, { term: "adolescent", severity: .2, note: "Age term, concerning in some contexts." }, { term: "preteen", severity: .4, note: "Age reference with concerning implications in certain contexts." }, { term: "rapist", severity: 1 }, { term: "raping", severity: 1 }, { term: "incest", severity: 1 }, { term: "cult", severity: .3, note: "Religious/social group term with negative connotation." }, { term: "sekt", severity: .3, note: "German for 'sect', cult reference." }, { term: "disembowel", severity: 1 }, { term: "behead", severity: 1 }, { term: "traitor", severity: .5, note: "Accusatory term." }, { term: "genocide", severity: 1 }, { term: "ethnic clean", severity: 1, multiWord: true, note: "Euphemism for genocide." }, { term: "klan", severity: 1 }, { term: "klux", severity: 1 }, { term: "kkk", severity: 1 }, { term: "kill", severity: .5, note: "Violent language, but common word." }, { term: "bomb", severity: .7, note: "Terrorism/violence reference." }, { term: "organi", severity: .1, note: "Word stem for organization." }, { term: "blog", severity: .1, note: "External site reference." }, { term: "group", severity: .1, note: "Organizational term." }, { term: "compan", severity: .1, note: "Company stem, spam indicator." }, { term: "associat", severity: .1, note: "Association stem." }, { term: "industr", severity: .1, note: "Industry stem, spam indicator." }, { term: "corporate", severity: .1, note: "Business term, spam indicator." }, { term: "famil", severity: .1, note: "Family stem, group indicator." }, { term: "task", severity: .1, note: "Organizational term." }, { term: "alliance", severity: .1, note: "Group term." }, { term: "entertain", severity: .1, note: "Entertainment stem, promotional." }, { term: "public", severity: .1, note: "Common term, promotional context." }, { term: "private", severity: .1, note: "Common term, organizational." }, { term: "troll", severity: .3, note: "Disruptive behavior indicator." }, { term: "trolol", severity: .3, note: "Trolling variant/meme." }, { term: "grief", severity: .3, note: "Gaming term for harassment." }, { term: "password", severity: .3, note: "Security term, suspicious in username." }, { term: "admin", severity: .7, note: "Role impersonation." }, { term: "sysop", severity: .4, note: "Wikipedia role impersonation." }, { term: "bureaucrat", severity: .5, note: "Wikipedia role impersonation." }, { term: "moderator", severity: .5, note: "Role impersonation." }, { term: "staff", severity: .5, note: "Role impersonation." }, { term: "developer", severity: .5, note: "Role impersonation." }, { term: "owner", severity: .4, note: "Role impersonation." }, { term: "founder", severity: .3, note: "Role impersonation." }, { term: "wmf", severity: .2, note: "Wikimedia Foundation impersonation." }, { term: "foundation", severity: .3, note: "Organizational impersonation." }, { term: "unblock", severity: .1, note: "Suggests blocked user." }, { term: "4chan", severity: .5, note: "Imageboard site, trolling association." }, { term: "8chan", severity: .3, note: "Controversial imageboard." }, { term: "reddit", severity: .3, note: "External site reference." }, { term: "plague", severity: .3, note: "Disease/attack term." }, { term: "skibidi", severity: .1, note: "Internet meme reference." }, { term: "milf", severity: .5 }, { term: "dilf", severity: .5 }, { term: "sext", severity: .5, note: "Sending sexual messages." }, { term: "thot", severity: .3, note: "Derogatory sexual slang." }, { term: "rizz", severity: .1, note: "Gen Z slang for charisma." }, { term: "gyatt", severity: .1, note: "Sexualized Gen Z slang." }, { term: "noob", severity: .1 }, { term: "lyric", severity: .1, note: "Possible lyrics website spammer." }, { term: "propaganda", severity: .5, note: "Misinformation term." }, { term: "asshole", severity: .7 }, { term: "fucktard", severity: .7 }, { term: "retard", severity: .7 }, { term: "imbecile", severity: .5 }, { term: "moron", severity: .5 }, { term: "chigga", severity: 1 }, { term: "chigger", severity: 1 }, { term: "wigga", severity: 1 }, { term: "wigger", severity: 1 }, { term: "igga", severity: .7, note: "Potential variant of racial slur.", ignore: [ "1994", "ig94" ] }, { term: "igger", severity: .7, note: "Potential variant of racial slur." }, { term: "mother fuck", severity: .7, multiWord: true }, { term: "bull shit", severity: .6, multiWord: true }, { term: "dumb ass", severity: .5, multiWord: true }, { term: "dumb fuck", severity: .7, multiWord: true }, { term: "goon", severity: .2, multiWord: false } ]); const profanity = exports.profanity = new Profanity({ a: [ "ɑ", "𝑎", "𝗮", "𝕒", "𝖆", "𝓪", "𝚊", "𝞪", "А", "а", "𝔞", "𝒂", "𝘢", "𝛼", "𝒶", "𝙖", "𝜶", "𝐚", "𝖺", "🄰", "🅰️", "🅰", "Ⓐ", "ⓐ", "@" ], b: [ "b", "𝑏", "𝗯", "𝕓", "𝖇", "𝓫", "𝚋", "𝞫", "Ь", "в", "𝔟", "𝒃", "𝘣", "𝛃", "𝒷", "𝙗", "𝜷", "𝐛", "𝖻", "🄱", "🅱️", "🅱", "Ⓑ", "ⓑ" ], c: [ "c", "𝑐", "𝗰", "𝕔", "𝖈", "𝓬", "𝚌", "ϲ", "с", "𝔠", "𝒄", "𝘤", "𝒸", "𝙘", "𝐜", "𝖼", "🄲", "Ⓒ", "ⓒ" ], d: [ "d", "𝑑", "𝗱", "𝕕", "𝖉", "𝓭", "𝚍", "𝞭", "ԁ", "ԃ", "𝔡", "𝒅", "𝘥", "𝛿", "𝒹", "𝙙", "𝜹", "𝐝", "𝖽", "𝝏", "🄳", "Ⓓ", "ⓓ" ], e: [ "e", "𝑒", "𝗲", "𝕖", "𝖊", "𝓮", "𝚎", "𝞮", "е", "𝔢", "𝒆", "𝘦", "𝛆", "𝒺", "𝙚", "𝜺", "𝐞", "𝖾", "з", "𝝐", "🄴", "Ⓔ", "ⓔ", "€" ], f: [ "f", "𝑓", "𝗳", "𝕗", "𝖋", "𝓯", "𝚏", "𝞯", "ғ", "ƒ", "𝔣", "𝒇", "𝘧", "𝒻", "𝙛", "𝜻", "𝐟", "𝖿", "🄵", "Ⓕ", "ⓕ" ], g: [ "g", "𝑔", "𝗴", "𝕘", "𝖌", "𝓰", "𝚐", "ɡ", "Ԍ", "ԍ", "𝔤", "𝒈", "𝘨", "𝙜", "𝐠", "𝗀", "🄶", "Ⓖ", "ⓖ" ], h: [ "h", "𝗵", "𝕙", "𝖍", "𝓱", "𝚑", "һ", "н", "𝔥", "𝒉", "𝘩", "ℎ", "𝒽", "𝙝", "𝐡", "𝗁", "🄷", "Ⓗ", "ⓗ" ], i: [ "i", "𝑖", "𝗶", "𝕚", "𝖎", "𝓲", "𝚒", "𝞲", "і", "𝔦", "𝒊", "𝘪", "𝒾", "𝙞", "𝜾", "𝐢", "𝗂", "🄸", "ℹ️", "ℹ", "Ⓘ", "ⓘ", "!" ], j: [ "j", "𝑗", "𝗷", "𝕛", "𝖏", "𝓳", "𝚳", "ј", "𝔧", "𝒋", "𝘫", "𝒿", "𝙟", "𝐣", "𝗃", "🄹", "Ⓙ", "ⓙ" ], k: [ "k", "𝑘", "𝗸", "𝕜", "𝖐", "𝓴", "κ", "к", "𝔨", "𝒌", "𝘬", "𝓀", "𝙠", "𝝀", "𝐤", "𝗄", "𝞳", "𝜿", "қ", "🄺", "Ⓚ", "ⓚ" ], l: [ "l", "𝑙", "𝗹", "𝕝", "𝖑", "𝓵", "ⅼ", "ӏ", "𝔩", "𝒍", "𝘭", "𝓁", "𝙡", "𝐥", "𝗅", "🄻", "Ⓛ", "ⓛ", "|" ], m: [ "m", "𝑚", "𝗺", "𝕞", "𝖒", "𝓶", "𝚖", "м", "𝔪", "𝒎", "𝘮", "𝓂", "𝙢", "𝐦", "𝗆", "🄼", "Ⓜ️", "Ⓜ", "ⓜ" ], n: [ "n", "𝑛", "𝗻", "𝕟", "𝖓", "𝓷", "𝚗", "ո", "п", "𝔫", "𝒏", "𝘯", "𝓃", "𝙣", "𝐧", "𝗇", "𝞰", "𝜼", "🄽", "Ⓝ", "ⓝ" ], o: [ "o", "𝑜", "𝗼", "𝕠", "𝖔", "𝓸", "𝚘", "ο", "о", "𝔬", "𝒐", "𝘰", "𝙤", "𝝈", "𝐨", "𝗈", "𝜽", "𝝄", "𝝓", "𝝑", "𝝋", "🄾", "🅾️", "🅾", "Ⓞ", "ⓞ" ], p: [ "p", "𝑝", "𝗽", "𝕡", "𝖕", "𝓹", "𝚙", "ρ", "р", "𝔭", "𝒑", "𝘱", "𝓅", "𝙥", "𝐩", "𝗉", "𝝆", "🄿", "🅿️", "🅿", "Ⓟ", "ⓟ" ], q: [ "q", "𝑞", "𝗾", "𝕢", "𝖖", "𝓺", "𝚚", "ԛ", "𝔮", "𝒒", "𝘲", "𝓆", "𝙦", "𝐪", "𝗊", "🅀", "Ⓠ", "ⓠ" ], r: [ "r", "𝑟", "𝗿", "𝕣", "𝖗", "𝓻", "𝚛", "г", "𝔯", "𝒓", "𝘳", "𝓇", "𝙧", "𝐫", "𝗋", "𝞽", "🅁", "Ⓡ", "ⓡ" ], s: [ "s", "𝑠", "𝗌", "𝕤", "𝖘", "𝓼", "𝚜", "ѕ", "𝔰", "𝒔", "𝘴", "𝓈", "𝙨", "𝐬", "🅂", "Ⓢ", "ⓢ", "$" ], t: [ "t", "𝑡", "𝗍", "𝕥", "𝖙", "𝓽", "𝚝", "τ", "т", "𝔱", "𝒕", "𝘵", "𝓉", "𝙩", "𝐭", "𝝉", "🅃", "Ⓣ", "ⓣ", "+" ], u: [ "u", "𝑢", "𝗎", "𝕦", "𝖚", "𝓾", "𝚞", "υ", "𝔲", "𝒖", "𝘶", "𝓊", "𝙪", "𝐮", "𝛍", "🅄", "Ⓤ", "ⓤ" ], v: [ "v", "𝑣", "𝗏", "𝕧", "𝖛", "𝓿", "𝚟", "ν", "𝔳", "𝒗", "𝘷", "𝓋", "𝙫", "𝐯", "𝞶", "𝝂", "𝝊", "🅅", "Ⓥ", "ⓥ" ], w: [ "w", "𝑤", "𝗐", "𝕨", "𝖜", "𝔀", "𝚠", "ω", "ш", "𝔴", "𝒘", "𝘸", "𝓌", "𝙬", "𝐰", "𝝎", "𝝍", "🅆", "Ⓦ", "ⓦ" ], x: [ "x", "𝑥", "𝗑", "𝕩", "𝖝", "𝔁", "𝚡", "χ", "х", "𝔵", "𝒙", "𝘹", "𝓍", "𝙭", "𝐱", "𝝒", "𝝌", "🅇", "Ⓧ", "ⓧ" ], y: [ "y", "𝑦", "𝗒", "𝕪", "𝖞", "𝔂", "𝚢", "у", "𝔶", "𝒚", "𝘺", "𝓎", "𝙮", "𝐲", "𝞬", "𝜸", "𝞴", "🅈", "Ⓨ", "ⓨ" ], z: [ "z", "𝑧", "𝗓", "𝕫", "𝖟", "𝔃", "𝚣", "ζ", "𝔷", "𝒛", "𝘻", "𝓏", "𝙯", "𝐳", "🅉", "Ⓩ", "ⓩ" ], 0: [ "0", "𝟎", "𝟬", "𝟢" ], 1: [ "1", "𝟏", "𝟭", "𝟣", "①", "➀", "❶", "➊", "⓵" ], 2: [ "2", "𝟐", "𝟮", "𝟤", "②", "➁", "❷", "➋", "⓶" ], 3: [ "3", "𝟑", "𝟯", "𝟥", "③", "➂", "❸", "➌", "⓷" ], 4: [ "4", "𝟒", "𝟰", "𝟦", "④", "➃", "❹", "➍", "⓸", "ᛋ" ], 5: [ "5", "𝟓", "𝟱", "𝟧", "⑤", "➄", "❺", "➎", "⓹" ], 6: [ "6", "𝟔", "𝟲", "𝟨", "⑥", "➅", "❻", "➏", "⓺" ], 7: [ "7", "𝟕", "𝟳", "𝟩", "⑦", "➆", "❼", "➐", "⓻" ], 8: [ "8", "𝟖", "𝟴", "𝟪", "⑧", "➇", "❽", "➑", "⓼" ], 9: [ "9", "𝟗", "𝟵", "𝟫", "⑨", "➈", "❾", "➒", "⓽" ] }); /***/ }, /***/ 4712(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Logger = void 0; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _Logger_brand = new WeakSet; class Logger { constructor() { _classPrivateMethodInitSpec(this, _Logger_brand); this.logs = []; } getLogs() { return [ ...this.logs ]; } log(message, expected) { _assertClassBrand(_Logger_brand, this, _log).call(this, "log", message, expected); } warn(message, expected) { _assertClassBrand(_Logger_brand, this, _log).call(this, "warn", message, expected); } error(message, expected) { _assertClassBrand(_Logger_brand, this, _log).call(this, "error", message, expected); } dev(message, expected) { _assertClassBrand(_Logger_brand, this, _log).call(this, "dev", message, expected); } } exports.Logger = Logger; function _log(type, message, expected = false) { const timestamp = (new Date).toISOString(); this.logs.push({ type, timestamp, message, expected }); } /***/ }, /***/ 9501(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.StorageManager = void 0; var _logger = __webpack_require__(4712); var _versions = __webpack_require__(4029); __webpack_require__(9458); __webpack_require__(7345); __webpack_require__(7704); __webpack_require__(8415); function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class StorageManager { static get versions() { return new Map([ [ 0, _versions.Version.v0 ], [ 1, _versions.Version.v1 ], [ 2, _versions.Version.v2 ], [ 3, _versions.Version.v3 ] ]); } constructor() { this.reset(new _logger.Logger); } reset(logger) { logger === null || logger === void 0 || logger.log(`Resetting storage to default.`); this.data = StorageManager.version.default; StorageManager.version.init(logger, this.data); StorageManager.version.validate(); StorageManager.version.construct(); return this.data; } load(data = {}) { var _data, _data$version; const logger = new _logger.Logger; let version = (_data$version = (_data = data).version) !== null && _data$version !== void 0 ? _data$version : _data.version = 0; if (StorageManager.versions.has(version)) { const expectedVersion = StorageManager.version.number; while (version !== expectedVersion) { const StorageClass = StorageManager.versions.get(version + 1); if (typeof (StorageClass === null || StorageClass === void 0 ? void 0 : StorageClass.constructor) === "function" && new StorageClass instanceof _versions.Version) { logger.log(`Upgrading storage from version ${version} to ${version + 1}`, true); try { if (!StorageClass.init(logger, data)) { data = this.reset(logger); break; } data = StorageClass.upgrade(); data.version = ++version; // we do this here to avoid infinite loops in case of upgrade failure } catch (err) { logger.error(`Error upgrading storage from version ${version} to ${version + 1}: ${err}`); data = this.reset(logger); break; } } else { logger.dev(`[MISSING_UPGRADE_METHOD] Uh oh! Something has gone wrong; this message should never appear. Please report this to the WikiShield developers.`); data = this.reset(logger); break; } } version = data.version; logger.log(`Initializing storage at version ${version}.`, true); StorageManager.version.init(logger, data); logger.log(`Validating storage at version ${version}.`, true); StorageManager.version.validate(); logger.log(`Constructing storage at version ${version}.`, true); data = StorageManager.version.construct(); logger.log(`Storage loaded successfully at version ${version}.`, true); this.data = data; } else { logger.error(`Storage version ${version} is corrupted or unsupported.`); this.reset(logger); } return { data: this.data, logs: logger.getLogs() }; } save() { const logger = new _logger.Logger; const version = StorageManager.version.number; logger.log(`Initializing storage at version ${version}.`, true); StorageManager.version.init(logger, this.data); logger.log(`Deconstructing storage at version ${version}.`, true); const data = StorageManager.version.deconstruct(); logger.log(`Storage saved successfully at version ${version}.`, true); return { data, logs: logger.getLogs() }; } decode(string) { try { return this.load(JSON.parse(atob(string.trim() || "e30="))); } catch (err) { return this.load({}); } } encode() { const {data, logs} = this.save(); const string = btoa(JSON.stringify(data)); return { string, logs }; } static output(logs, name = "<unknown>", logger = console) { var _logger$log; const allExpected = !logs.some(log => !log.expected); logger === null || logger === void 0 || (_logger$log = logger.log) === null || _logger$log === void 0 || _logger$log.call(logger, `[${allExpected ? " " : "X"}] WikiShield Storage Logs: ${name}`); for (const log of logs) { var _logger$type; let prefix = `[${log.expected ? " " : "X"}][${log.timestamp}][Storage]`; let type = log.type; if (type === "dev") { type = "error"; prefix = `#DEV# ${prefix}`; } logger === null || logger === void 0 || (_logger$type = logger[type]) === null || _logger$type === void 0 || _logger$type.call(logger, `${prefix} ${log.message}`); } } static okay(data, logger = console) { var _data$logs$some, _data$logs, _data$logs$some2, _StorageManager$outpu; data !== null && data !== void 0 ? data : data = (new StorageManager).load(StorageManager.versions.get(0).default); const okay = !((_data$logs$some = (_data$logs = data.logs) === null || _data$logs === void 0 || (_data$logs$some2 = _data$logs.some) === null || _data$logs$some2 === void 0 ? void 0 : _data$logs$some2.call(_data$logs, log => !log.expected)) !== null && _data$logs$some !== void 0 ? _data$logs$some : true); if (okay) return okay; else return (_StorageManager$outpu = void StorageManager.output(data.logs, "Storage Check", logger)) !== null && _StorageManager$outpu !== void 0 ? _StorageManager$outpu : okay; } } exports.StorageManager = StorageManager; _defineProperty(StorageManager, "version", _versions.Version.v3); /***/ }, /***/ 330(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.isURL = exports.isObject = void 0; const isObject = v => v !== null && typeof v === "object" && !Array.isArray(v); exports.isObject = isObject; const isURL = str => { try { new URL(str); return true; } catch (_unused) { return false; } }; exports.isURL = isURL; /***/ }, /***/ 4029(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Version = void 0; var _logger = __webpack_require__(4712); var _utility = __webpack_require__(330); function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class Version { static sanitize(path, fallback, callback = null) { var _this$loadedLogger$wa; const value = path.reduce((scope, key) => (scope === null || scope === void 0 ? void 0 : scope[key]) !== undefined ? scope[key] : undefined, this.loadedData); if (value === undefined) return (_this$loadedLogger$wa = void this.loadedLogger.warn(`Missing expected key path [ ${path.join(" -> ")} ] in stored data, defaulting to fallback value.`)) !== null && _this$loadedLogger$wa !== void 0 ? _this$loadedLogger$wa : fallback; if (typeof callback === "function") { var _this$loadedLogger$wa2; const modValue = callback(value); if (modValue === undefined) return (_this$loadedLogger$wa2 = void this.loadedLogger.warn(`Invalid value at key path [ ${path.join(" -> ")} ] in stored data, defaulting to fallback value.`)) !== null && _this$loadedLogger$wa2 !== void 0 ? _this$loadedLogger$wa2 : fallback; return modValue; } return value; } static exists(...path) { return path.reduce((scope, key) => (scope === null || scope === void 0 ? void 0 : scope[key]) !== undefined ? scope[key] : undefined, this.loadedData) !== undefined; } static deprecated(...path) { var _this$loadedLogger$wa3; if (this.exists(...path)) return (_this$loadedLogger$wa3 = void this.loadedLogger.warn(`Skipped deprecated key path [ ${path.join(" -> ")} ] in stored data.`, true)) !== null && _this$loadedLogger$wa3 !== void 0 ? _this$loadedLogger$wa3 : true; return false; } static reset(...path) { this.loadedLogger.warn(`Resetting key path [ ${path.join(" -> ")} ] in stored data to default value.`); const value = path.reduce((scope, key) => (scope === null || scope === void 0 ? void 0 : scope[key]) !== undefined ? scope[key] : undefined, this.default); if (value === undefined) return void this.loadedLogger.dev(`Could not find default value for key path [ ${path.join(" -> ")} ] in stored data.`); const final = path.pop(); const scope = path.reduce((scope, key) => { if (scope[key] === undefined) scope[key] = {}; return scope[key]; }, this.loadedData); scope[final] = value; } static restrictObject(obj, ...path) { var _this$reset; if (!(0, _utility.isObject)(obj)) return (_this$reset = void this.reset(...path)) !== null && _this$reset !== void 0 ? _this$reset : false; const keys = Object.keys(path.reduce((scope, key) => (scope === null || scope === void 0 ? void 0 : scope[key]) !== undefined ? scope[key] : undefined, this.default)); Object.keys(obj).forEach(key => { if (!keys.includes(key)) { this.loadedLogger.warn(`Removing unexpected key [ ${[ ...path, key ].join(" -> ")} ] from stored data.`); delete obj[key]; // remove unexpected keys } }); return true; } static get default() { return {}; } static init(logger, data) { this.loadedLogger = logger; this.loadedData = data; return true; } static upgrade() { if (this.loadedData.version !== this.number - 1) { this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number - 1}.`); throw new Error("INVALID_UPGRADE_ATTEMPT"); } return {}; } static validate() { var _this$loadedLogger$er; const root = this.loadedData; this.restrictObject(root); if (root.version !== this.number) return (_this$loadedLogger$er = void this.loadedLogger.error(`Stored data version ${root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er !== void 0 ? _this$loadedLogger$er : false; return true; } } exports.Version = Version; _defineProperty(Version, "loadedLogger", new _logger.Logger); _defineProperty(Version, "loadedData", {}); _defineProperty(Version, "number", 0); /***/ }, /***/ 9458(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _versions = __webpack_require__(4029); var _V; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // DO NOT CHANGE THIS FILE _versions.Version.v0 = (_V = class V0 extends _versions.Version { static get default() { return { version: 0, changelog: "0", options: { maxQueueSize: 50, maxEditCount: 50, minimumORESScore: 0, enableSoundAlerts: true, soundAlertORESScore: .95, enableUsernameHighlighting: true, enableWelcomeLatin: false, enableAutoWelcome: false, enableEditAnalysis: false, enableUsernameAnalysis: false, enableAutoReporting: true, selectedAutoReportReasons: { Vandalism: true, "Subtle vandalism": true, "Image vandalism": true, Sandbox: true, Unsourced: true, "Unsourced (BLP)": true, "Unsourced genre": true, POV: false, Commentary: true, "AI-generated": true, "AI-generated (talk)": true, "MOS violation": false, Censoring: false, Disruption: true, Deleting: true, Errors: true, "Editing tests": true, Chatting: false, Jokes: true, Owning: false, Advertising: true, "Spam links": true, "Personal attacks": true, TPO: true, "AfD removal": true }, zen: { enabled: false, sounds: true, watchlist: false, notifications: true, editCount: false, toasts: false }, enableCloudStorage: true, masterVolume: .5, volumes: { click: .5, notification: .5, watchlist: .5, alert: .5, whoosh: .5, warn: .5, rollback: .5, report: .5, thank: .5, protection: .5, block: .5, sparkle: .5, success: .5, error: .5 }, soundMappings: { click: "click", notification: "notify", watchlist: "ping", alert: "alert", whoosh: "whoosh", warn: "warn", rollback: "rollback", report: "report", thank: "thank", protection: "protection", block: "block", sparkle: "sparkle", success: "success", error: "error" }, watchlistExpiry: "1 week", whitelistExpiry: { users: "indefinite", pages: "indefinite", tags: "indefinite" }, highlightedExpiry: { users: "1 week", pages: "1 week", tags: "1 week" }, wiki: "en", namespacesShown: [ 0 ], showTemps: true, showUsers: true, sortQueueItems: true, enableOllamaAI: false, ollamaServerUrl: "http://localhost:11434", ollamaModel: "", controlScripts: [ { keys: [ "arrowright" ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ " " ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ "q" ], actions: [ { name: "nextEdit", params: {} }, { name: "rollback", params: {} }, { name: "warn", params: { warningType: "Vandalism", level: "auto" } }, { name: "if", condition: "atFinalWarning", actions: [ { name: "if", condition: "operatorNonAdmin", actions: [ { name: "reportToAIV", params: { reportMessage: "Vandalism past final warning" } } ] } ] }, { name: "highlightUser", 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: "Mentor" } } ] } ], selectedPalette: 0, theme: "theme-light" }, statistics: { reviewed: 0, reverts: 0, reverts: 0, reports: 0, warnings: 0, welcomes: 0, whitelisted: 0, highlighted: 0, blocks: 0, sessionStart: Date.now() }, whitelist: { users: [], pages: [], tags: [] }, highlighted: { users: [], pages: [], tags: [] }, queueWidth: "15vw", detailsWidth: "15vw" }; } /* You might be wondering, where are the upgrade and validate functions? 1. This is the first version, so there is no previous version to upgrade from. 2. I didn't feel like validating the first version, if you somehow go back in time and mess up your data, that's on you. */ }, _defineProperty(_V, "number", 0), _V); /***/ }, /***/ 7345(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _utility = __webpack_require__(330); var _namespaces = __webpack_require__(4018); var _warnings = __webpack_require__(955); var _events = __webpack_require__(985); var _conditions = __webpack_require__(870); var _controlKeys = __webpack_require__(9808); var _versions = __webpack_require__(4029); var _V; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // DO NOT CHANGE THIS FILE _versions.Version.v1 = (_V = class V1 extends _versions.Version { static get default() { return { version: 1, changelog: "3", settings: { performance: { startup: "adaptive" }, namespaces: [ 0 ], queue: { max_size: 100, max_edits: 50, min_ores: 0, recent: { enabled: true, order: 0 }, flagged: { enabled: true, order: 1 }, users: { enabled: true, order: 2 }, watchlist: { enabled: true, order: 3 } }, cloud_storage: { enabled: true }, username_highlighting: { enabled: true, fuzzy: true }, auto_welcome: { enabled: true }, expiry: { watchlist: "1 week", whitelist: { users: "indefinite", pages: "indefinite", tags: "indefinite" }, highlight: { users: "1 week", pages: "1 week", tags: "1 week" } }, auto_report: { enabled: true, for: [ "Vandalism", "Subtle vandalism", "Image vandalism", "Sandbox", "Unsourced", "Unsourced (BLP)", "Unsourced genre", /* "POV", */ "Commentary", "AI-generated", "AI-generated (talk)", /* "MOS violation", */ "Censoring", /* "Not English" */ , "Disruption", "Deleting", "Errors", "Editing tests", /* "Chatting", */ "Jokes", /* "Owning", */ "Advertising", "Spam links", "Personal attacks", "TPO", "AfD removal" ] }, AI: { enabled: false, provider: "Ollama", edit_analysis: { enabled: true }, username_analysis: { enabled: true }, Ollama: { server: "http://localhost:11434", model: "" } }, audio: { ores_alert: { enabled: true, threshold: .95 }, volume: { master: 1, "master.startup": 1, "master.music": 1, "master.music.zen_mode": 1, "master.ui": 1, "master.ui.click": .05, "master.queue": 1, "master.queue.ores": 1, "master.queue.mention": 1, "master.notification": 1, "master.notification.alert": .7, "master.notification.notice": .5, "master.notification.toast": .5, "master.action": 1, "master.action.default": .6, "master.action.failed": .85, "master.action.report": 1, "master.action.block": 1, "master.action.protect": 1 } }, zen_mode: { enabled: false, sound: { enabled: true }, music: { enabled: true }, alerts: { enabled: true }, notices: { enabled: false }, toasts: { enabled: false }, badges: { enabled: false } } }, UI: { theme: { palette: 0 }, queue: { width: "15vw" }, details: { width: "15vw" } }, control_scripts: [ { keys: [ "arrowright" ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ " " ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ "q" ], actions: [ { name: "nextEdit", params: {} }, { name: "rollback", params: {} }, { name: "warn", params: { warningType: "Vandalism", level: "auto" } }, { name: "if", condition: "atFinalWarning", actions: [ { name: "if", condition: "operatorNonAdmin", actions: [ { name: "reportToAIV", params: { reportMessage: "Vandalism past final warning" } } ] } ] }, { name: "highlightUser", 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: "Auto" } } ] } ], statistics: { edits_reviewed: { total: 0, thanked: 0 }, recent_changes_reviewed: { total: 0 }, pending_changes_reviewed: { total: 0, accepted: 0, rejected: 0 }, watchlist_changes_reviewed: { total: 0 }, users_reviewed: { total: 0 }, reverts_made: { total: 0, good_faith: 0, from_recent_changes: 0, from_pending_changes: 0, from_watchlist: 0, from_loaded_edits: 0 }, users_welcomed: { total: 0 }, warnings_issued: { total: 0, level_1: 0, level_2: 0, level_3: 0, level_4: 0, level_4im: 0 }, reports_filed: { total: 0, AIV: 0, UAA: 0, RFPP: 0 }, watchlist: { watched: 0, unwatched: 0 }, items_whitelisted: { total: 0, users: 0, pages: 0, tags: 0 }, items_highlighted: { total: 0, users: 0, pages: 0, tags: 0 }, blocks_issued: { total: 0 }, pages_protected: { total: 0 }, actions_executed: { total: 0, successful: 0 }, session_time: 0 }, highlight: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, whitelist: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] } }; } static upgrade() { if (this.loadedData.version !== this.number - 1) { this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number - 1}.`); throw new Error("INVALID_UPGRADE_ATTEMPT"); } this.deprecated("options", "enableWelcomeLatin"); this.deprecated("options", "volumes", "whoosh"); this.deprecated("options", "volumes", "warn"); this.deprecated("options", "volumes", "rollback"); this.deprecated("options", "volumes", "thank"); this.deprecated("options", "volumes", "sparkle"); this.deprecated("options", "volumes", "watchlist"); this.deprecated("options", "volumes", "success"); this.deprecated("options", "volumes", "error"); this.deprecated("options", "soundMappings"); this.deprecated("options", "wiki"); this.deprecated("options", "showTemps"); this.deprecated("options", "showUsers"); this.deprecated("options", "sortQueueItems"); this.deprecated("options", "theme"); this.deprecated("options", "zen", "editCount"); this.deprecated("options", "zen", "watchlist"); // properties without sanitization did not exist in the previous version const defaults = this.default; return { changelog: this.sanitize([ "changelog" ], defaults.changelog), settings: { performance: { startup: defaults.settings.performance.startup }, namespaces: this.sanitize([ "options", "namespacesShown" ], defaults.settings.namespaces), queue: { max_size: this.sanitize([ "options", "maxQueueSize" ], defaults.settings.queue.max_size), max_edits: this.sanitize([ "options", "maxEditCount" ], defaults.settings.queue.max_edits), min_ores: this.sanitize([ "options", "minimumORESScore" ], defaults.settings.queue.min_ores), recent: { enabled: defaults.settings.queue.recent.enabled, order: defaults.settings.queue.recent.order }, flagged: { enabled: defaults.settings.queue.flagged.enabled, order: defaults.settings.queue.flagged.order }, users: { enabled: defaults.settings.queue.users.enabled, order: defaults.settings.queue.users.order }, watchlist: { enabled: defaults.settings.queue.watchlist.enabled, order: defaults.settings.queue.watchlist.order } }, cloud_storage: { enabled: this.sanitize([ "options", "enableCloudStorage" ], defaults.settings.cloud_storage.enabled) }, username_highlighting: { enabled: this.sanitize([ "options", "enableUsernameHighlighting" ], defaults.settings.username_highlighting.enabled), fuzzy: defaults.settings.username_highlighting.fuzzy }, auto_welcome: { enabled: this.sanitize([ "options", "enableAutoWelcome" ], defaults.settings.auto_welcome.enabled) }, expiry: { watchlist: this.sanitize([ "options", "watchlistExpiry" ], defaults.settings.expiry.watchlist), whitelist: { users: this.sanitize([ "options", "whitelistExpiry", "users" ], defaults.settings.expiry.whitelist.users), pages: this.sanitize([ "options", "whitelistExpiry", "pages" ], defaults.settings.expiry.whitelist.pages), tags: this.sanitize([ "options", "whitelistExpiry", "tags" ], defaults.settings.expiry.whitelist.tags) }, highlight: { users: this.sanitize([ "options", "highlightedExpiry", "users" ], defaults.settings.expiry.highlight.users), pages: this.sanitize([ "options", "highlightedExpiry", "pages" ], defaults.settings.expiry.highlight.pages), tags: this.sanitize([ "options", "highlightedExpiry", "tags" ], defaults.settings.expiry.highlight.tags) } }, auto_report: { enabled: this.sanitize([ "options", "enableAutoReporting" ], defaults.settings.auto_report.enabled), for: this.sanitize([ "options", "selectedAutoReportReasons" ], defaults.settings.auto_report.for, value => { if ((0, _utility.isObject)(value)) { value["AI-generated"] = value["AI-Generated"]; delete value["AI-Generated"]; value["AI-generated (talk)"] = value["AI-Generated (talk)"]; delete value["AI-Generated (talk)"]; return Object.keys(value).filter(key => (value === null || value === void 0 ? void 0 : value[key]) === true); } return undefined; }) }, AI: { enabled: this.sanitize([ "options", "enableOllamaAI" ], defaults.settings.AI.enabled), provider: defaults.settings.AI.provider, edit_analysis: { enabled: this.sanitize([ "options", "enableEditAnalysis" ], defaults.settings.AI.edit_analysis.enabled) }, username_analysis: { enabled: this.sanitize([ "options", "enableUsernameAnalysis" ], defaults.settings.AI.username_analysis.enabled) }, Ollama: { server: this.sanitize([ "options", "ollamaServerUrl" ], defaults.settings.AI.Ollama.server), model: this.sanitize([ "options", "ollamaModel" ], defaults.settings.AI.Ollama.model) } }, audio: { ores_alert: { enabled: this.sanitize([ "options", "enableSoundAlerts" ], defaults.settings.audio.ores_alert.enabled), threshold: this.sanitize([ "options", "soundAlertORESScore" ], defaults.settings.audio.ores_alert.threshold) }, volume: { master: this.sanitize([ "options", "masterVolume" ], defaults.settings.audio.volume.master), "master.startup": defaults.settings.audio.volume["master.startup"], "master.music": defaults.settings.audio.volume["master.music"], "master.music.zen_mode": defaults.settings.audio.volume["master.music.zen_mode"], "master.ui": defaults.settings.audio.volume["master.ui"], "master.ui.click": this.sanitize([ "options", "volumes", "click" ], defaults.settings.audio.volume["master.ui.click"]), "master.queue": defaults.settings.audio.volume["master.queue"], "master.queue.ores": this.sanitize([ "options", "volumes", "alert" ], defaults.settings.audio.volume["master.queue.ores"]), "master.queue.mention": defaults.settings.audio.volume["master.queue.mention"], "master.notification": defaults.settings.audio.volume["master.notification"], "master.notification.alert": this.sanitize([ "options", "volumes", "notification" ], defaults.settings.audio.volume["master.notification.alert"]), "master.notification.notice": this.sanitize([ "options", "volumes", "notification" ], defaults.settings.audio.volume["master.notification.notice"]), "master.notification.toast": this.sanitize([ "options", "volumes", "notification" ], defaults.settings.audio.volume["master.notification.toast"]), "master.action": defaults.settings.audio.volume["master.action"], "master.action.default": defaults.settings.audio.volume["master.action.default"], "master.action.failed": defaults.settings.audio.volume["master.action.failed"], "master.action.report": this.sanitize([ "options", "volumes", "report" ], defaults.settings.audio.volume["master.action.report"]), "master.action.block": this.sanitize([ "options", "volumes", "block" ], defaults.settings.audio.volume["master.action.block"]), "master.action.protect": this.sanitize([ "options", "volumes", "protection" ], defaults.settings.audio.volume["master.action.protect"]) } }, zen_mode: { enabled: this.sanitize([ "options", "zen", "enabled" ], defaults.settings.zen_mode.enabled), sound: { enabled: this.sanitize([ "options", "zen", "sounds" ], defaults.settings.zen_mode.sound.enabled) }, music: { enabled: defaults.settings.zen_mode.music.enabled }, alerts: { enabled: this.sanitize([ "options", "zen", "notifications" ], defaults.settings.zen_mode.alerts.enabled) }, notices: { enabled: this.sanitize([ "options", "zen", "notifications" ], defaults.settings.zen_mode.notices.enabled) }, toasts: { enabled: this.sanitize([ "options", "zen", "toasts" ], defaults.settings.zen_mode.toasts.enabled) }, badges: { enabled: defaults.settings.zen_mode.badges.enabled } } }, UI: { theme: { palette: this.sanitize([ "options", "selectedPalette" ], defaults.UI.theme.palette) }, queue: { width: this.sanitize([ "queueWidth" ], defaults.UI.queue.width) }, details: { width: this.sanitize([ "detailsWidth" ], defaults.UI.details.width) } }, control_scripts: this.sanitize([ "options", "controlScripts" ], defaults.control_scripts, value => { if (Array.isArray(value)) { function updateActions(actions, ...path) { return actions.filter((action, index) => { index = +index; if (!(0, _utility.isObject)(action)) return true; // malformed but don't care here if (action.name === "if") { if (!(action.condition in _conditions.conditions)) return true; // malformed but don't care here if (!Array.isArray(action.actions)) return true; // malformed but don't care here action.actions = updateActions.call(this, action.actions, ...path, index, "actions"); } else { switch (action.name) { case "welcome": { if (!(0, _utility.isObject)(action.params)) return true; // malformed but don't care here switch (action.params.template) { case "Links": { action.params.template = "Graphical"; } break; case "Latin": { action.params.template = "Non-Latin"; } break; case "Mentor": { // deprecated =( this.loadedLogger.warn(`Skipped deprecated "Mentor" welcome template at key [${[ ...path, index, "params", "template" ].join(" -> ")}].`, true); return false; } // removed by dead control flow } } break; case "warn": { if (!(0, _utility.isObject)(action.params)) return true; // malformed but don't care here switch (action.params.warningType) { case "AI-Generated": { action.params.warningType = "AI-generated"; } break; case "AI-Generated (talk)": { action.params.warningType = "AI-generated (talk)"; } break; } } break; } } return true; }); } value.forEach((scope2, index) => { index = +index; if (!(0, _utility.isObject)(scope2)) return; if (!Array.isArray(scope2.keys)) return; if (!Array.isArray(scope2.actions)) return; scope2.actions = updateActions.call(this, scope2.actions, "control_scripts", index, "actions"); }); return value; } return undefined; }), statistics: { edits_reviewed: { total: defaults.statistics.edits_reviewed.total, thanked: defaults.statistics.edits_reviewed.thanked }, recent_changes_reviewed: { total: defaults.statistics.recent_changes_reviewed.total }, pending_changes_reviewed: { total: defaults.statistics.pending_changes_reviewed.total, accepted: defaults.statistics.pending_changes_reviewed.accepted, rejected: defaults.statistics.pending_changes_reviewed.rejected }, watchlist_changes_reviewed: { total: defaults.statistics.watchlist_changes_reviewed.total }, users_reviewed: { total: defaults.statistics.users_reviewed.total }, reverts_made: { total: defaults.statistics.reverts_made.total, good_faith: defaults.statistics.reverts_made.good_faith, from_recent_changes: defaults.statistics.reverts_made.from_recent_changes, from_pending_changes: defaults.statistics.reverts_made.from_pending_changes, from_watchlist: defaults.statistics.reverts_made.from_watchlist, from_loaded_edits: defaults.statistics.reverts_made.from_loaded_edits }, users_welcomed: { total: defaults.statistics.users_welcomed.total }, warnings_issued: { total: defaults.statistics.warnings_issued.total, level_1: defaults.statistics.warnings_issued.level_1, level_2: defaults.statistics.warnings_issued.level_2, level_3: defaults.statistics.warnings_issued.level_3, level_4: defaults.statistics.warnings_issued.level_4, level_4im: defaults.statistics.warnings_issued.level_4im }, reports_filed: { total: defaults.statistics.reports_filed.total, AIV: defaults.statistics.reports_filed.AIV, UAA: defaults.statistics.reports_filed.UAA, RFPP: defaults.statistics.reports_filed.RFPP }, watchlist: { watched: defaults.statistics.watchlist.watched, unwatched: defaults.statistics.watchlist.unwatched }, items_whitelisted: { total: defaults.statistics.items_whitelisted.total, users: defaults.statistics.items_whitelisted.users, pages: defaults.statistics.items_whitelisted.pages, tags: defaults.statistics.items_whitelisted.tags }, items_highlighted: { total: defaults.statistics.items_highlighted.total, users: defaults.statistics.items_highlighted.users, pages: defaults.statistics.items_highlighted.pages, tags: defaults.statistics.items_highlighted.tags }, blocks_issued: { total: defaults.statistics.blocks_issued.total }, pages_protected: { total: defaults.statistics.pages_protected.total }, actions_executed: { total: defaults.statistics.actions_executed.total, successful: defaults.statistics.actions_executed.successful }, session_time: defaults.statistics.session_time }, highlight: { users: this.sanitize([ "highlighted", "users" ], defaults.highlight.users), pages: this.sanitize([ "highlighted", "pages" ], defaults.highlight.pages), tags: this.sanitize([ "highlighted", "tags" ], defaults.highlight.tags) }, whitelist: { users: this.sanitize([ "whitelist", "users" ], defaults.whitelist.users), pages: this.sanitize([ "whitelist", "pages" ], defaults.whitelist.pages), tags: this.sanitize([ "whitelist", "tags" ], defaults.whitelist.tags) } }; } static validate() { var _this$loadedLogger$er; const root = this.loadedData; this.restrictObject(root); if (root.version !== this.number) return (_this$loadedLogger$er = void this.loadedLogger.error(`Stored data version ${root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er !== void 0 ? _this$loadedLogger$er : false; if (typeof root.changelog !== "string") this.reset("changelog"); { // root.settings const scope = root.settings; this.restrictObject(scope, "settings"); { // root.settings.performance const scope = root.settings.performance; this.restrictObject(scope, "settings", "performance"); { // root.settings.performance.startup const validValues = new Set([ "always_off", "adaptive", "always_on" ]); const value = root.settings.performance.startup; if (!validValues.has(value)) this.reset("settings", "performance", "startup"); } } { // root.settings.namespaces const value = root.settings.namespaces; if (!Array.isArray(value)) this.reset("settings", "namespaces"); root.settings.namespaces = [ ...new Set(root.settings.namespaces) ].filter(v => { const valid = _namespaces.namespaces.some(ns => ns.id === v); if (!valid) this.loadedLogger.warn(`Removing invalid namespace ID [ ${v} ] from stored data.`); return valid; }); } { // root.settings.queue const scope = root.settings.queue; this.restrictObject(scope, "settings", "queue"); { // root.settings.queue.max_size const value = root.settings.queue.max_size; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_size"); } { // root.settings.queue.max_edits const value = root.settings.queue.max_edits; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_edits"); } { // root.settings.queue.min_ores const value = root.settings.queue.min_ores; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "queue", "min_ores"); } [ "recent", "flagged", "users", "watchlist" ].forEach((section, _, queues) => { { // root.settings.queue[section] const scope = root.settings.queue[section]; this.restrictObject(scope, "settings", "queue", section); { // root.settings.queue[section].enabled const value = root.settings.queue[section].enabled; if (typeof value !== "boolean") this.reset("settings", "queue", section, "enabled"); } { // root.settings.queue[section].order const value = root.settings.queue[section].order; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value < queues.length)) this.reset("settings", "queue", section, "order"); } } }); } { // root.settings.cloud_storage const scope = root.settings.cloud_storage; this.restrictObject(scope, "settings", "cloud_storage"); { // root.settings.cloud_storage.enabled const value = root.settings.cloud_storage.enabled; if (typeof value !== "boolean") this.reset("settings", "cloud_storage", "enabled"); } } { // root.settings.username_highlighting const scope = root.settings.username_highlighting; this.restrictObject(scope, "settings", "username_highlighting"); { // root.settings.username_highlighting.enabled const value = root.settings.username_highlighting.enabled; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "enabled"); } { // root.settings.username_highlighting.fuzzy const value = root.settings.username_highlighting.fuzzy; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "fuzzy"); } } { // root.settings.auto_welcome const scope = root.settings.auto_welcome; this.restrictObject(scope, "settings", "auto_welcome"); { // root.settings.auto_welcome.enabled const value = root.settings.auto_welcome.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_welcome", "enabled"); } } { // root.settings.expiry const expiries = new Set([ "none", "1 hour", "1 day", "1 week", "1 month", "3 months", "6 months", "indefinite" ]); const scope = root.settings.expiry; this.restrictObject(scope, "settings", "expiry"); { // root.settings.expiry.watchlist const value = root.settings.expiry.watchlist; if (!expiries.has(value)) this.reset("settings", "expiry", "watchlist"); } { // root.settings.expiry.whitelist const scope = root.settings.expiry.whitelist; this.restrictObject(scope, "settings", "expiry", "whitelist"); { // root.settings.expiry.whitelist.users const value = root.settings.expiry.whitelist.users; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "users"); } { // root.settings.expiry.whitelist.pages const value = root.settings.expiry.whitelist.pages; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "pages"); } { // root.settings.expiry.whitelist.tags const value = root.settings.expiry.whitelist.tags; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "tags"); } } { // root.settings.expiry.highlight const scope = root.settings.expiry.highlight; this.restrictObject(scope, "settings", "expiry", "highlight"); { // root.settings.expiry.highlight.users const value = root.settings.expiry.highlight.users; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "users"); } { // root.settings.expiry.highlight.pages const value = root.settings.expiry.highlight.pages; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "pages"); } { // root.settings.expiry.highlight.tags const value = root.settings.expiry.highlight.tags; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "tags"); } } } { // root.settings.auto_report const scope = root.settings.auto_report; this.restrictObject(scope, "settings", "auto_report"); { // root.settings.auto_report.enabled const value = root.settings.auto_report.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_report", "enabled"); } { // root.settings.auto_report.for const value = root.settings.auto_report.for; if (!Array.isArray(value)) this.reset("settings", "auto_report", "for"); root.settings.auto_report.for = [ ...new Set(root.settings.auto_report.for) ].filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid auto-report reason [ ${v} ] from stored data.`); return valid; }); } } { // root.settings.AI const scope = root.settings.AI; this.restrictObject(scope, "settings", "AI"); { // root.settings.AI.enabled const value = root.settings.AI.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "enabled"); } { // root.settings.AI.provider const value = root.settings.AI.provider; if (value !== "Ollama") this.reset("settings", "AI", "provider"); } { // root.settings.AI.edit_analysis const scope = root.settings.AI.edit_analysis; this.restrictObject(scope, "settings", "AI", "edit_analysis"); { // root.settings.AI.edit_analysis.enabled const value = root.settings.AI.edit_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "edit_analysis", "enabled"); } } { // root.settings.AI.username_analysis const scope = root.settings.AI.username_analysis; this.restrictObject(scope, "settings", "AI", "username_analysis"); { // root.settings.AI.username_analysis.enabled const value = root.settings.AI.username_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "username_analysis", "enabled"); } } { // root.settings.AI.Ollama const scope = root.settings.AI.Ollama; this.restrictObject(scope, "settings", "AI", "Ollama"); { // root.settings.AI.Ollama.server const value = root.settings.AI.Ollama.server; if (!(0, _utility.isURL)(value)) this.reset("settings", "AI", "Ollama", "server"); } { // root.settings.AI.Ollama.model const value = root.settings.AI.Ollama.model; if (typeof value !== "string") this.reset("settings", "AI", "Ollama", "model"); } } } { // root.settings.audio const scope = root.settings.audio; this.restrictObject(scope, "settings", "audio"); { // root.settings.audio.ores_alert const scope = root.settings.audio.ores_alert; this.restrictObject(scope, "settings", "audio", "ores_alert"); { // root.settings.audio.ores_alert.enabled const value = root.settings.audio.ores_alert.enabled; if (typeof value !== "boolean") this.reset("settings", "audio", "ores_alert", "enabled"); } { // root.settings.audio.ores_alert.threshold const value = root.settings.audio.ores_alert.threshold; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "ores_alert", "threshold"); } } { // root.settings.audio.volume const scope = root.settings.audio.volume; this.restrictObject(scope, "settings", "audio", "volume"); const volumeKeys = [ "master", "master.startup", "master.music", "master.music.zen_mode", "master.ui", "master.ui.click", "master.queue", "master.queue.ores", "master.queue.mention", "master.notification", "master.notification.alert", "master.notification.notice", "master.notification.toast", "master.action", "master.action.default", "master.action.failed", "master.action.report", "master.action.block", "master.action.protect" ]; for (const key of volumeKeys) { const value = root.settings.audio.volume[key]; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "volume", key); } } } { // root.settings.zen_mode const scope = root.settings.zen_mode; this.restrictObject(scope, "settings", "zen_mode"); { // root.settings.zen_mode.enabled const value = scope.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "enabled"); } { // root.settings.zen_mode.sound const scope = root.settings.zen_mode.sound; this.restrictObject(scope, "settings", "zen_mode", "sound"); { // root.settings.zen_mode.sound.enabled const value = root.settings.zen_mode.sound.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "sound", "enabled"); } } { // root.settings.zen_mode.music const scope = root.settings.zen_mode.music; this.restrictObject(scope, "settings", "zen_mode", "music"); { // root.settings.zen_mode.music.enabled const value = root.settings.zen_mode.music.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "music", "enabled"); } } { // root.settings.zen_mode.alerts const scope = root.settings.zen_mode.alerts; this.restrictObject(scope, "settings", "zen_mode", "alerts"); { // root.settings.zen_mode.alerts.enabled const value = root.settings.zen_mode.alerts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "alerts", "enabled"); } } { // root.settings.zen_mode.notices const scope = root.settings.zen_mode.notices; this.restrictObject(scope, "settings", "zen_mode", "notices"); { // root.settings.zen_mode.notices.enabled const value = root.settings.zen_mode.notices.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "notices", "enabled"); } } { // root.settings.zen_mode.toasts const scope = root.settings.zen_mode.toasts; this.restrictObject(scope, "settings", "zen_mode", "toasts"); { // root.settings.zen_mode.toasts.enabled const value = root.settings.zen_mode.toasts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "toasts", "enabled"); } } { // root.settings.zen_mode.badges const scope = root.settings.zen_mode.badges; this.restrictObject(scope, "settings", "zen_mode", "badges"); { // root.settings.zen_mode.badges.enabled const value = root.settings.zen_mode.badges.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "badges", "enabled"); } } } } { // root.UI const scope = root.UI; this.restrictObject(scope, "UI"); { // root.UI.theme const scope = root.UI.theme; this.restrictObject(scope, "UI", "theme"); { // root.UI.theme.palette const value = root.UI.theme.palette; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 3)) this.reset("UI", "theme", "palette"); } } { // root.UI.queue const scope = root.UI.queue; this.restrictObject(scope, "UI", "queue"); { // root.UI.queue.width const value = root.UI.queue.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "queue", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "queue", "width"); } } { // root.UI.details const scope = root.UI.details; this.restrictObject(scope, "UI", "details"); { // root.UI.details.width const value = root.UI.details.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "details", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "details", "width"); } } } { // root.control_scripts const scope = root.control_scripts; if (!Array.isArray(scope)) this.reset("control_scripts"); function sanitizeActions(actions, ...path) { return actions.filter((action, index) => { var _this$loadedLogger$wa; index = +index; if (!(0, _utility.isObject)(action)) return (_this$loadedLogger$wa = void this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa !== void 0 ? _this$loadedLogger$wa : false; if (action.name === "if") { var _this$loadedLogger$wa2; if (!(action.condition in _conditions.conditions)) return (_this$loadedLogger$wa2 = void this.loadedLogger.warn(`Removing invalid condition [ ${action.condition} ] at path [ ${[ ...path, index, "condition" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa2 !== void 0 ? _this$loadedLogger$wa2 : false; if (!Array.isArray(action.actions)) { this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[ ...path, index, "actions" ].join(" -> ")} ] in stored data.`); action.actions = []; } action.actions = sanitizeActions.call(this, action.actions, ...path, index, "actions"); } else { var _events$action$name$p; if (!(action.name in _events.events)) { this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index, "name" ].join(" -> ")} ] from stored data.`); return false; } if (!(0, _utility.isObject)(action.params)) { this.loadedLogger.warn(`Resetting invalid params object at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params = {}; } const references = (_events$action$name$p = _events.events[action.name].parameters) !== null && _events$action$name$p !== void 0 ? _events$action$name$p : []; const validIds = new Set; for (const reference of references) { validIds.add(reference.id); if (reference.type === "choice") { if (!(reference.id in action.params)) { this.loadedLogger.warn(`Resetting missing choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = reference.options[0]; } if (!reference.options.includes(action.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = reference.options[0]; } } } for (const paramKey of Object.keys(action.params)) { if (!validIds.has(paramKey)) { this.loadedLogger.warn(`Removing invalid parameter [ ${paramKey} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] from stored data.`); delete action.params[paramKey]; } } } return true; }); } root.control_scripts = root.control_scripts.filter((scope, index) => { var _this$loadedLogger$wa3; index = +index; if (!(0, _utility.isObject)(scope)) return (_this$loadedLogger$wa3 = void this.loadedLogger.warn(`Removing invalid control script at path [ ${[ "control_scripts", index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa3 !== void 0 ? _this$loadedLogger$wa3 : false; if (!Array.isArray(scope.keys)) { this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].keys = []; } if (!Array.isArray(scope.actions)) { this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].actions = []; } root.control_scripts[index].keys = scope.keys.filter(key => _controlKeys.controls.has(key)); root.control_scripts[index].actions = sanitizeActions.call(this, scope.actions, "control_scripts", index, "actions"); return true; }); } { // root.statistics const isValidStatistic = v => typeof v === "number" && Number.isInteger(v) && v >= 0; const scope = root.statistics; this.restrictObject(scope, "statistics"); { // root.statistics.edits_reviewed const scope = root.statistics.edits_reviewed; this.restrictObject(scope, "statistics", "edits_reviewed"); { // root.statistics.edits_reviewed.total const value = root.statistics.edits_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "total"); } { // root.statistics.edits_reviewed.thanked const value = root.statistics.edits_reviewed.thanked; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "thanked"); } } { // root.statistics.recent_changes_reviewed const scope = root.statistics.recent_changes_reviewed; this.restrictObject(scope, "statistics", "recent_changes_reviewed"); { // root.statistics.recent_changes_reviewed.total const value = root.statistics.recent_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "recent_changes_reviewed", "total"); } } { // root.statistics.pending_changes_reviewed const scope = root.statistics.pending_changes_reviewed; this.restrictObject(scope, "statistics", "pending_changes_reviewed"); { // root.statistics.pending_changes_reviewed.total const value = root.statistics.pending_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "total"); } { // root.statistics.pending_changes_reviewed.accepted const value = root.statistics.pending_changes_reviewed.accepted; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "accepted"); } { // root.statistics.pending_changes_reviewed.rejected const value = root.statistics.pending_changes_reviewed.rejected; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "rejected"); } } { // root.statistics.watchlist_changes_reviewed const scope = root.statistics.watchlist_changes_reviewed; this.restrictObject(scope, "statistics", "watchlist_changes_reviewed"); { // root.statistics.watchlist_changes_reviewed.total const value = root.statistics.watchlist_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "watchlist_changes_reviewed", "total"); } } { // root.statistics.users_reviewed const scope = root.statistics.users_reviewed; this.restrictObject(scope, "statistics", "users_reviewed"); { // root.statistics.users_reviewed.total const value = root.statistics.users_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_reviewed", "total"); } } { // root.statistics.reverts_made const scope = root.statistics.reverts_made; this.restrictObject(scope, "statistics", "reverts_made"); { // root.statistics.reverts_made.total const value = root.statistics.reverts_made.total; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "total"); } { // root.statistics.reverts_made.good_faith const value = root.statistics.reverts_made.good_faith; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "good_faith"); } { // root.statistics.reverts_made.from_recent_changes const value = root.statistics.reverts_made.from_recent_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_recent_changes"); } { // root.statistics.reverts_made.from_pending_changes const value = root.statistics.reverts_made.from_pending_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_pending_changes"); } { // root.statistics.reverts_made.from_watchlist const value = root.statistics.reverts_made.from_watchlist; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_watchlist"); } { // root.statistics.reverts_made.from_loaded_edits const value = root.statistics.reverts_made.from_loaded_edits; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_loaded_edits"); } } { // root.statistics.users_welcomed const scope = root.statistics.users_welcomed; this.restrictObject(scope, "statistics", "users_welcomed"); { // root.statistics.users_welcomed.total const value = root.statistics.users_welcomed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_welcomed", "total"); } } { // root.statistics.warnings_issued const scope = root.statistics.warnings_issued; this.restrictObject(scope, "statistics", "warnings_issued"); { // root.statistics.warnings_issued.total const value = root.statistics.warnings_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "total"); } { // root.statistics.warnings_issued.level_1 const value = root.statistics.warnings_issued.level_1; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_1"); } { // root.statistics.warnings_issued.level_2 const value = root.statistics.warnings_issued.level_2; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_2"); } { // root.statistics.warnings_issued.level_3 const value = root.statistics.warnings_issued.level_3; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_3"); } { // root.statistics.warnings_issued.level_4 const value = root.statistics.warnings_issued.level_4; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4"); } { // root.statistics.warnings_issued.level_4im const value = root.statistics.warnings_issued.level_4im; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4im"); } } { // root.statistics.reports_filed const scope = root.statistics.reports_filed; this.restrictObject(scope, "statistics", "reports_filed"); { // root.statistics.reports_filed.total const value = root.statistics.reports_filed.total; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "total"); } { // root.statistics.reports_filed.AIV const value = root.statistics.reports_filed.AIV; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "AIV"); } { // root.statistics.reports_filed.UAA const value = root.statistics.reports_filed.UAA; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "UAA"); } { // root.statistics.reports_filed.RFPP const value = root.statistics.reports_filed.RFPP; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "RFPP"); } } { // root.statistics.watchlist const scope = root.statistics.watchlist; this.restrictObject(scope, "statistics", "watchlist"); { // root.statistics.watchlist.watched const value = root.statistics.watchlist.watched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "watched"); } { // root.statistics.watchlist.unwatched const value = root.statistics.watchlist.unwatched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "unwatched"); } } { // root.statistics.items_whitelisted const scope = root.statistics.items_whitelisted; this.restrictObject(scope, "statistics", "items_whitelisted"); { // root.statistics.items_whitelisted.total const value = root.statistics.items_whitelisted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "total"); } { // root.statistics.items_whitelisted.users const value = root.statistics.items_whitelisted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "users"); } { // root.statistics.items_whitelisted.pages const value = root.statistics.items_whitelisted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "pages"); } { // root.statistics.items_whitelisted.tags const value = root.statistics.items_whitelisted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "tags"); } } { // root.statistics.items_highlighted const scope = root.statistics.items_highlighted; this.restrictObject(scope, "statistics", "items_highlighted"); { // root.statistics.items_highlighted.total const value = root.statistics.items_highlighted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "total"); } { // root.statistics.items_highlighted.users const value = root.statistics.items_highlighted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "users"); } { // root.statistics.items_highlighted.pages const value = root.statistics.items_highlighted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "pages"); } { // root.statistics.items_highlighted.tags const value = root.statistics.items_highlighted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "tags"); } } { // root.statistics.blocks_issued const scope = root.statistics.blocks_issued; this.restrictObject(scope, "statistics", "blocks_issued"); { // root.statistics.blocks_issued.total const value = root.statistics.blocks_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "blocks_issued", "total"); } } { // root.statistics.pages_protected const scope = root.statistics.pages_protected; this.restrictObject(scope, "statistics", "pages_protected"); { // root.statistics.pages_protected.total const value = root.statistics.pages_protected.total; if (!isValidStatistic(value)) this.reset("statistics", "pages_protected", "total"); } } { // root.statistics.actions_executed const scope = root.statistics.actions_executed; this.restrictObject(scope, "statistics", "actions_executed"); { // root.statistics.actions_executed.total const value = root.statistics.actions_executed.total; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "total"); } { // root.statistics.actions_executed.successful const value = root.statistics.actions_executed.successful; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "successful"); } } { // root.statistics.session_time const value = root.statistics.session_time; if (!(typeof value === "number" && value >= 0)) this.reset("statistics", "session_time"); } } const isValidExpiryMap = root => { // [ username, [ timestamp, timestamp ] ] if (!(Array.isArray(root) && root.length === 2)) return false; else if (typeof root[0] !== "string") return false; { const scope = root[1]; if (!(Array.isArray(scope) && scope.length === 2)) return false; const isTimestamp = v => typeof v === "number" && Number.isInteger(v) && v >= 0; if (!(isTimestamp(scope[0]) && isTimestamp(scope[1]))) return false; } return true; }; { // root.highlight const scope = root.highlight; this.restrictObject(scope, "highlight"); { // root.highlight.users const value = root.highlight.users; if (!Array.isArray(value)) this.reset("highlight", "users"); root.highlight.users = root.highlight.users.filter(v => isValidExpiryMap(v)); } { // root.highlight.pages const value = root.highlight.pages; if (!Array.isArray(value)) this.reset("highlight", "pages"); root.highlight.pages = root.highlight.pages.filter(v => isValidExpiryMap(v)); } { // root.highlight.tags const value = root.highlight.tags; if (!Array.isArray(value)) this.reset("highlight", "tags"); root.highlight.tags = root.highlight.tags.filter(v => isValidExpiryMap(v)); } } { // root.whitelist const scope = root.whitelist; this.restrictObject(scope, "whitelist"); { // root.whitelist.users const value = root.whitelist.users; if (!Array.isArray(value)) this.reset("whitelist", "users"); root.whitelist.users = root.whitelist.users.filter(v => isValidExpiryMap(v)); } { // root.whitelist.pages const value = root.whitelist.pages; if (!Array.isArray(value)) this.reset("whitelist", "pages"); root.whitelist.pages = root.whitelist.pages.filter(v => isValidExpiryMap(v)); } { // root.whitelist.tags const value = root.whitelist.tags; if (!Array.isArray(value)) this.reset("whitelist", "tags"); root.whitelist.tags = root.whitelist.tags.filter(v => isValidExpiryMap(v)); } } return true; } static construct() { var _this$loadedLogger$er2; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er2 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er2 !== void 0 ? _this$loadedLogger$er2 : false; root.settings.auto_report.for = new Set(root.settings.auto_report.for); root.highlight.users = new Map(root.highlight.users); root.highlight.pages = new Map(root.highlight.pages); root.highlight.tags = new Map(root.highlight.tags); root.whitelist.users = new Map(root.whitelist.users); root.whitelist.pages = new Map(root.whitelist.pages); root.whitelist.tags = new Map(root.whitelist.tags); return root; } static deconstruct() { var _this$loadedLogger$er3; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er3 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er3 !== void 0 ? _this$loadedLogger$er3 : false; root.settings.auto_report.for = [ ...root.settings.auto_report.for ]; root.highlight.users = [ ...root.highlight.users ]; root.highlight.pages = [ ...root.highlight.pages ]; root.highlight.tags = [ ...root.highlight.tags ]; root.whitelist.users = [ ...root.whitelist.users ]; root.whitelist.pages = [ ...root.whitelist.pages ]; root.whitelist.tags = [ ...root.whitelist.tags ]; const data = structuredClone(root); // stuctureClone is safe since we have to use JSON for storage anyway this.construct(); // reconstruct to restore Maps and Sets return data; } }, _defineProperty(_V, "number", 1), _V); /***/ }, /***/ 7704(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _utility = __webpack_require__(330); var _namespaces = __webpack_require__(4018); var _warnings = __webpack_require__(955); var _events = __webpack_require__(985); var _conditions = __webpack_require__(870); var _controlKeys = __webpack_require__(9808); var _versions = __webpack_require__(4029); var _V; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // DO NOT CHANGE THIS FILE _versions.Version.v2 = (_V = class V2 extends _versions.Version { static get default() { return { version: 2, changelog: "6", settings: { performance: { startup: "adaptive" }, namespaces: [ 0 ], queue: { max_size: 100, max_edits: 50, min_ores: 0, recent: { enabled: true, order: 0 }, flagged: { enabled: true, order: 1 }, users: { enabled: true, order: 2 }, watchlist: { enabled: true, order: 3 } }, cloud_storage: { enabled: true }, username_highlighting: { enabled: true, fuzzy: true }, wikipedia_popups: { enabled: true }, auto_welcome: { enabled: false }, expiry: { watchlist: "1 week", whitelist: { users: "indefinite", pages: "indefinite", tags: "indefinite" }, highlight: { users: "1 week", pages: "1 week", tags: "1 week" } }, auto_report: { enabled: true, for: [ "Vandalism", "Subtle vandalism", "Image vandalism", "Sandbox", "Deliberate errors", "Disruptive editing", "Editing tests", "Commentary", "Inappropriate jokes", "Deleting", "Unsourced", "Unsourced (BLP)", "Unsourced genre", "Original research", /* "POV", */ "Censoring", "AI-generated", "AI-generated (talk)", /* "MOS violation", */ /* "Not English", */ "Personal attacks", "Harassment", "TPO", /* "Chatting" */ /* "Owning", */ , "AfD removal", /* "Gaming the system", */ "Advertising", "Spam links", "Inappropriate edit summary", "Misleading edit summary" ] }, AI: { enabled: false, provider: "Ollama", edit_analysis: { enabled: true }, username_analysis: { enabled: true }, Ollama: { server: "http://localhost:11434", model: "" } }, audio: { ores_alert: { enabled: true, threshold: .95 }, volume: { master: 1, "master.startup": 1, "master.music": 1, "master.music.zen_mode": 1, "master.ui": 1, "master.ui.click": .05, "master.queue": 1, "master.queue.ores": 1, "master.queue.mention": 1, "master.notification": 1, "master.notification.alert": .7, "master.notification.notice": .5, "master.notification.toast": .5, "master.action": 1, "master.action.default": .6, "master.action.failed": .85, "master.action.report": 1, "master.action.block": 1, "master.action.protect": 1 } }, zen_mode: { enabled: false, sound: { enabled: true }, music: { enabled: true }, alerts: { enabled: true }, notices: { enabled: false }, toasts: { enabled: false }, badges: { enabled: false } }, repeat_control_scripts: true }, UI: { theme: { palette: 0 }, queue: { width: "15vw" }, details: { width: "15vw" } }, control_scripts: [ { keys: [ "arrowright" ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ " " ], actions: [ { name: "nextEdit", params: {} } ] }, { keys: [ "q" ], actions: [ { name: "nextEdit", params: {} }, { name: "rollback", params: {} }, { name: "warn", params: { warning: "Vandalism", level: "auto" } }, { name: "if", condition: "atFinalWarning", actions: [ { name: "reportToAIV", params: { reportMessage: "Vandalism past final warning" } } ] }, { name: "highlightUser", 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: "Auto" } } ] } ], statistics: { edits_reviewed: { total: 0, thanked: 0 }, recent_changes_reviewed: { total: 0 }, pending_changes_reviewed: { total: 0, accepted: 0, rejected: 0 }, watchlist_changes_reviewed: { total: 0 }, users_reviewed: { total: 0 }, reverts_made: { total: 0, good_faith: 0, from_recent_changes: 0, from_pending_changes: 0, from_watchlist: 0, from_loaded_edits: 0 }, users_welcomed: { total: 0 }, warnings_issued: { total: 0, level_1: 0, level_2: 0, level_3: 0, level_4: 0, level_4im: 0 }, reports_filed: { total: 0, AIV: 0, UAA: 0, RFPP: 0 }, watchlist: { watched: 0, unwatched: 0 }, items_whitelisted: { total: 0, users: 0, pages: 0, tags: 0 }, items_highlighted: { total: 0, users: 0, pages: 0, tags: 0 }, blocks_issued: { total: 0 }, pages_protected: { total: 0 }, actions_executed: { total: 0, successful: 0 }, session_time: 0 }, highlight: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, whitelist: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, favorite: { warnings: [], reverts: [] } }; } static upgrade() { if (this.loadedData.version !== this.number - 1) { this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number - 1}.`); throw new Error("INVALID_UPGRADE_ATTEMPT"); } // properties without sanitization did not exist in the previous version const defaults = this.default; return { changelog: this.sanitize([ "changelog" ], defaults.changelog), settings: { performance: { startup: this.sanitize([ "settings", "performance", "startup" ], defaults.settings.performance.startup) }, namespaces: this.sanitize([ "settings", "namespaces" ], defaults.settings.namespaces), queue: { max_size: this.sanitize([ "settings", "queue", "max_size" ], defaults.settings.queue.max_size), max_edits: this.sanitize([ "settings", "queue", "max_edits" ], defaults.settings.queue.max_edits), min_ores: this.sanitize([ "settings", "queue", "min_ores" ], defaults.settings.queue.min_ores), recent: { enabled: this.sanitize([ "settings", "queue", "recent", "enabled" ], defaults.settings.queue.recent.enabled), order: this.sanitize([ "settings", "queue", "recent", "order" ], defaults.settings.queue.recent.order) }, flagged: { enabled: this.sanitize([ "settings", "queue", "flagged", "enabled" ], defaults.settings.queue.flagged.enabled), order: this.sanitize([ "settings", "queue", "flagged", "order" ], defaults.settings.queue.flagged.order) }, users: { enabled: this.sanitize([ "settings", "queue", "users", "enabled" ], defaults.settings.queue.users.enabled), order: this.sanitize([ "settings", "queue", "users", "order" ], defaults.settings.queue.users.order) }, watchlist: { enabled: this.sanitize([ "settings", "queue", "watchlist", "enabled" ], defaults.settings.queue.watchlist.enabled), order: this.sanitize([ "settings", "queue", "watchlist", "order" ], defaults.settings.queue.watchlist.order) } }, cloud_storage: { enabled: this.sanitize([ "settings", "cloud_storage", "enabled" ], defaults.settings.cloud_storage.enabled) }, username_highlighting: { enabled: this.sanitize([ "settings", "username_highlighting", "enabled" ], defaults.settings.username_highlighting.enabled), fuzzy: this.sanitize([ "settings", "username_highlighting", "fuzzy" ], defaults.settings.username_highlighting.fuzzy) }, wikipedia_popups: { enabled: defaults.settings.wikipedia_popups.enabled }, auto_welcome: { enabled: this.sanitize([ "settings", "auto_welcome", "enabled" ], defaults.settings.auto_welcome.enabled) }, expiry: { watchlist: this.sanitize([ "settings", "expiry", "watchlist" ], defaults.settings.expiry.watchlist), whitelist: { users: this.sanitize([ "settings", "expiry", "whitelist", "users" ], defaults.settings.expiry.whitelist.users), pages: this.sanitize([ "settings", "expiry", "whitelist", "pages" ], defaults.settings.expiry.whitelist.pages), tags: this.sanitize([ "settings", "expiry", "whitelist", "tags" ], defaults.settings.expiry.whitelist.tags) }, highlight: { users: this.sanitize([ "settings", "expiry", "highlight", "users" ], defaults.settings.expiry.highlight.users), pages: this.sanitize([ "settings", "expiry", "highlight", "pages" ], defaults.settings.expiry.highlight.pages), tags: this.sanitize([ "settings", "expiry", "highlight", "tags" ], defaults.settings.expiry.highlight.tags) } }, auto_report: { enabled: this.sanitize([ "settings", "auto_report", "enabled" ], defaults.settings.auto_report.enabled), for: this.sanitize([ "settings", "auto_report", "for" ], defaults.settings.auto_report.for, value => { if (!Array.isArray(value)) return undefined; const set = new Set([ "Harassment", "Inappropriate edit summary", "Original research" ]); // add some default reports value.forEach(v => { switch (v) { case "Errors": { set.add("Deliberate errors"); } return; case "Disruption": { set.add("Disruptive editing"); } return; case "Jokes": { set.add("Inappropriate jokes"); } return; } set.add(v); }); return [ ...set ]; }) }, AI: { enabled: this.sanitize([ "settings", "AI", "enabled" ], defaults.settings.AI.enabled), provider: this.sanitize([ "settings", "AI", "provider" ], defaults.settings.AI.provider), edit_analysis: { enabled: this.sanitize([ "settings", "AI", "edit_analysis", "enabled" ], defaults.settings.AI.edit_analysis.enabled) }, username_analysis: { enabled: this.sanitize([ "settings", "AI", "username_analysis", "enabled" ], defaults.settings.AI.username_analysis.enabled) }, Ollama: { server: this.sanitize([ "settings", "AI", "Ollama", "server" ], defaults.settings.AI.Ollama.server), model: this.sanitize([ "settings", "AI", "Ollama", "model" ], defaults.settings.AI.Ollama.model) } }, audio: { ores_alert: { enabled: this.sanitize([ "settings", "audio", "ores_alert", "enabled" ], defaults.settings.audio.ores_alert.enabled), threshold: this.sanitize([ "settings", "audio", "ores_alert", "threshold" ], defaults.settings.audio.ores_alert.threshold) }, volume: { master: this.sanitize([ "settings", "audio", "volume", "master" ], defaults.settings.audio.volume.master), "master.startup": this.sanitize([ "settings", "audio", "volume", "master.startup" ], defaults.settings.audio.volume["master.startup"]), "master.music": this.sanitize([ "settings", "audio", "volume", "master.music" ], defaults.settings.audio.volume["master.music"]), "master.music.zen_mode": this.sanitize([ "settings", "audio", "volume", "master.music.zen_mode" ], defaults.settings.audio.volume["master.music.zen_mode"]), "master.ui": this.sanitize([ "settings", "audio", "volume", "master.ui" ], defaults.settings.audio.volume["master.ui"]), "master.ui.click": this.sanitize([ "settings", "audio", "volume", "master.ui.click" ], defaults.settings.audio.volume["master.ui.click"]), "master.queue": this.sanitize([ "settings", "audio", "volume", "master.queue" ], defaults.settings.audio.volume["master.queue"]), "master.queue.ores": this.sanitize([ "settings", "audio", "volume", "master.queue.ores" ], defaults.settings.audio.volume["master.queue.ores"]), "master.queue.mention": this.sanitize([ "settings", "audio", "volume", "master.queue.mention" ], defaults.settings.audio.volume["master.queue.mention"]), "master.notification": this.sanitize([ "settings", "audio", "volume", "master.notification" ], defaults.settings.audio.volume["master.notification"]), "master.notification.alert": this.sanitize([ "settings", "audio", "volume", "master.notification.alert" ], defaults.settings.audio.volume["master.notification.alert"]), "master.notification.notice": this.sanitize([ "settings", "audio", "volume", "master.notification.notice" ], defaults.settings.audio.volume["master.notification.notice"]), "master.notification.toast": this.sanitize([ "settings", "audio", "volume", "master.notification.toast" ], defaults.settings.audio.volume["master.notification.toast"]), "master.action": this.sanitize([ "settings", "audio", "volume", "master.action" ], defaults.settings.audio.volume["master.action"]), "master.action.default": this.sanitize([ "settings", "audio", "volume", "master.action.default" ], defaults.settings.audio.volume["master.action.default"]), "master.action.failed": this.sanitize([ "settings", "audio", "volume", "master.action.failed" ], defaults.settings.audio.volume["master.action.failed"]), "master.action.report": this.sanitize([ "settings", "audio", "volume", "master.action.report" ], defaults.settings.audio.volume["master.action.report"]), "master.action.block": this.sanitize([ "settings", "audio", "volume", "master.action.block" ], defaults.settings.audio.volume["master.action.block"]), "master.action.protect": this.sanitize([ "settings", "audio", "volume", "master.action.protect" ], defaults.settings.audio.volume["master.action.protect"]) } }, zen_mode: { enabled: this.sanitize([ "settings", "zen_mode", "enabled" ], defaults.settings.zen_mode.enabled), sound: { enabled: this.sanitize([ "settings", "zen_mode", "sound", "enabled" ], defaults.settings.zen_mode.sound.enabled) }, music: { enabled: this.sanitize([ "settings", "zen_mode", "music", "enabled" ], defaults.settings.zen_mode.music.enabled) }, alerts: { enabled: this.sanitize([ "settings", "zen_mode", "alerts", "enabled" ], defaults.settings.zen_mode.alerts.enabled) }, notices: { enabled: this.sanitize([ "settings", "zen_mode", "notices", "enabled" ], defaults.settings.zen_mode.notices.enabled) }, toasts: { enabled: this.sanitize([ "settings", "zen_mode", "toasts", "enabled" ], defaults.settings.zen_mode.toasts.enabled) }, badges: { enabled: this.sanitize([ "settings", "zen_mode", "badges", "enabled" ], defaults.settings.zen_mode.badges.enabled) } }, repeat_control_scripts: defaults.settings.repeat_control_scripts }, UI: { theme: { palette: this.sanitize([ "UI", "theme", "palette" ], defaults.UI.theme.palette) }, queue: { width: this.sanitize([ "UI", "queue", "width" ], defaults.UI.queue.width) }, details: { width: this.sanitize([ "UI", "details", "width" ], defaults.UI.details.width) } }, control_scripts: this.sanitize([ "control_scripts" ], defaults.control_scripts, value => { if (Array.isArray(value)) { function updateActions(actions, ...path) { return actions.filter((action, index) => { index = +index; if (!(0, _utility.isObject)(action)) { return true; // malformed but don't care here } if (action.name === "if") { if (!(action.condition in _conditions.conditions)) { return true; // malformed but don't care here } if (!Array.isArray(action.actions)) { return true; // malformed but don't care here } action.actions = updateActions.call(this, action.actions, ...path, index, "actions"); } else { switch (action.name) { case "warn": { if (!(0, _utility.isObject)(action.params)) { return true; // malformed but don't care here } action.params.warning = action.params.warningType; delete action.params.warningType; } break; } } return true; }); } value.forEach((scope2, index) => { index = +index; if (!(0, _utility.isObject)(scope2)) { return; } if (!Array.isArray(scope2.keys)) { return; } if (!Array.isArray(scope2.actions)) { return; } scope2.actions = updateActions.call(this, scope2.actions, "control_scripts", index, "actions"); }); return value; } return undefined; }), statistics: { edits_reviewed: { total: this.sanitize([ "statistics", "edits_reviewed", "total" ], defaults.statistics.edits_reviewed.total), thanked: this.sanitize([ "statistics", "edits_reviewed", "thanked" ], defaults.statistics.edits_reviewed.thanked) }, recent_changes_reviewed: { total: this.sanitize([ "statistics", "recent_changes_reviewed", "total" ], defaults.statistics.recent_changes_reviewed.total) }, pending_changes_reviewed: { total: this.sanitize([ "statistics", "pending_changes_reviewed", "total" ], defaults.statistics.pending_changes_reviewed.total), accepted: this.sanitize([ "statistics", "pending_changes_reviewed", "accepted" ], defaults.statistics.pending_changes_reviewed.accepted), rejected: this.sanitize([ "statistics", "pending_changes_reviewed", "rejected" ], defaults.statistics.pending_changes_reviewed.rejected) }, watchlist_changes_reviewed: { total: this.sanitize([ "statistics", "watchlist_changes_reviewed", "total" ], defaults.statistics.watchlist_changes_reviewed.total) }, users_reviewed: { total: this.sanitize([ "statistics", "users_reviewed", "total" ], defaults.statistics.users_reviewed.total) }, reverts_made: { total: this.sanitize([ "statistics", "reverts_made", "total" ], defaults.statistics.reverts_made.total), good_faith: this.sanitize([ "statistics", "reverts_made", "good_faith" ], defaults.statistics.reverts_made.good_faith), from_recent_changes: this.sanitize([ "statistics", "reverts_made", "from_recent_changes" ], defaults.statistics.reverts_made.from_recent_changes), from_pending_changes: this.sanitize([ "statistics", "reverts_made", "from_pending_changes" ], defaults.statistics.reverts_made.from_pending_changes), from_watchlist: this.sanitize([ "statistics", "reverts_made", "from_watchlist" ], defaults.statistics.reverts_made.from_watchlist), from_loaded_edits: this.sanitize([ "statistics", "reverts_made", "from_loaded_edits" ], defaults.statistics.reverts_made.from_loaded_edits) }, users_welcomed: { total: this.sanitize([ "statistics", "users_welcomed", "total" ], defaults.statistics.users_welcomed.total) }, warnings_issued: { total: this.sanitize([ "statistics", "warnings_issued", "total" ], defaults.statistics.warnings_issued.total), level_1: this.sanitize([ "statistics", "warnings_issued", "level_1" ], defaults.statistics.warnings_issued.level_1), level_2: this.sanitize([ "statistics", "warnings_issued", "level_2" ], defaults.statistics.warnings_issued.level_2), level_3: this.sanitize([ "statistics", "warnings_issued", "level_3" ], defaults.statistics.warnings_issued.level_3), level_4: this.sanitize([ "statistics", "warnings_issued", "level_4" ], defaults.statistics.warnings_issued.level_4), level_4im: this.sanitize([ "statistics", "warnings_issued", "level_4im" ], defaults.statistics.warnings_issued.level_4im) }, reports_filed: { total: this.sanitize([ "statistics", "reports_filed", "total" ], defaults.statistics.reports_filed.total), AIV: this.sanitize([ "statistics", "reports_filed", "AIV" ], defaults.statistics.reports_filed.AIV), UAA: this.sanitize([ "statistics", "reports_filed", "UAA" ], defaults.statistics.reports_filed.UAA), RFPP: this.sanitize([ "statistics", "reports_filed", "RFPP" ], defaults.statistics.reports_filed.RFPP) }, watchlist: { watched: this.sanitize([ "statistics", "watchlist", "watched" ], defaults.statistics.watchlist.watched), unwatched: this.sanitize([ "statistics", "watchlist", "unwatched" ], defaults.statistics.watchlist.unwatched) }, items_whitelisted: { total: this.sanitize([ "statistics", "items_whitelisted", "total" ], defaults.statistics.items_whitelisted.total), users: this.sanitize([ "statistics", "items_whitelisted", "users" ], defaults.statistics.items_whitelisted.users), pages: this.sanitize([ "statistics", "items_whitelisted", "pages" ], defaults.statistics.items_whitelisted.pages), tags: this.sanitize([ "statistics", "items_whitelisted", "tags" ], defaults.statistics.items_whitelisted.tags) }, items_highlighted: { total: this.sanitize([ "statistics", "items_highlighted", "total" ], defaults.statistics.items_highlighted.total), users: this.sanitize([ "statistics", "items_highlighted", "users" ], defaults.statistics.items_highlighted.users), pages: this.sanitize([ "statistics", "items_highlighted", "pages" ], defaults.statistics.items_highlighted.pages), tags: this.sanitize([ "statistics", "items_highlighted", "tags" ], defaults.statistics.items_highlighted.tags) }, blocks_issued: { total: this.sanitize([ "statistics", "blocks_issued", "total" ], defaults.statistics.blocks_issued.total) }, pages_protected: { total: this.sanitize([ "statistics", "pages_protected", "total" ], defaults.statistics.pages_protected.total) }, actions_executed: { total: this.sanitize([ "statistics", "actions_executed", "total" ], defaults.statistics.actions_executed.total), successful: this.sanitize([ "statistics", "actions_executed", "successful" ], defaults.statistics.actions_executed.successful) }, session_time: this.sanitize([ "statistics", "session_time" ], defaults.statistics.session_time) }, highlight: { users: this.sanitize([ "highlight", "users" ], defaults.highlight.users), pages: this.sanitize([ "highlight", "pages" ], defaults.highlight.pages), tags: this.sanitize([ "highlight", "tags" ], defaults.highlight.tags) }, whitelist: { users: this.sanitize([ "whitelist", "users" ], defaults.whitelist.users), pages: this.sanitize([ "whitelist", "pages" ], defaults.whitelist.pages), tags: this.sanitize([ "whitelist", "tags" ], defaults.whitelist.tags) }, favorite: { warnings: defaults.favorite.warnings, reverts: defaults.favorite.reverts } }; } static validate() { var _this$loadedLogger$er; const root = this.loadedData; this.restrictObject(root); if (root.version !== this.number) return (_this$loadedLogger$er = void this.loadedLogger.error(`Stored data version ${root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er !== void 0 ? _this$loadedLogger$er : false; if (typeof root.changelog !== "string") this.reset("changelog"); { // root.settings const scope = root.settings; this.restrictObject(scope, "settings"); { // root.settings.performance const scope = root.settings.performance; this.restrictObject(scope, "settings", "performance"); { // root.settings.performance.startup const validValues = new Set([ "always_off", "adaptive", "always_on" ]); const value = root.settings.performance.startup; if (!validValues.has(value)) this.reset("settings", "performance", "startup"); } } { // root.settings.namespaces const value = root.settings.namespaces; if (!Array.isArray(value)) this.reset("settings", "namespaces"); root.settings.namespaces = [ ...new Set(root.settings.namespaces) ].filter(v => { const valid = _namespaces.namespaces.some(ns => ns.id === v); if (!valid) this.loadedLogger.warn(`Removing invalid namespace ID [ ${v} ] from stored data.`); return valid; }); } { // root.settings.queue const scope = root.settings.queue; this.restrictObject(scope, "settings", "queue"); { // root.settings.queue.max_size const value = root.settings.queue.max_size; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_size"); } { // root.settings.queue.max_edits const value = root.settings.queue.max_edits; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_edits"); } { // root.settings.queue.min_ores const value = root.settings.queue.min_ores; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "queue", "min_ores"); } [ "recent", "flagged", "users", "watchlist" ].forEach((section, _, queues) => { { // root.settings.queue[section] const scope = root.settings.queue[section]; this.restrictObject(scope, "settings", "queue", section); { // root.settings.queue[section].enabled const value = root.settings.queue[section].enabled; if (typeof value !== "boolean") this.reset("settings", "queue", section, "enabled"); } { // root.settings.queue[section].order const value = root.settings.queue[section].order; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value < queues.length)) this.reset("settings", "queue", section, "order"); } } }); } { // root.settings.cloud_storage const scope = root.settings.cloud_storage; this.restrictObject(scope, "settings", "cloud_storage"); { // root.settings.cloud_storage.enabled const value = root.settings.cloud_storage.enabled; if (typeof value !== "boolean") this.reset("settings", "cloud_storage", "enabled"); } } { // root.settings.username_highlighting const scope = root.settings.username_highlighting; this.restrictObject(scope, "settings", "username_highlighting"); { // root.settings.username_highlighting.enabled const value = root.settings.username_highlighting.enabled; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "enabled"); } { // root.settings.username_highlighting.fuzzy const value = root.settings.username_highlighting.fuzzy; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "fuzzy"); } } { // root.settings.wikipedia_popups const scope = root.settings.wikipedia_popups; this.restrictObject(scope, "settings", "wikipedia_popups"); { // root.settings.wikipedia_popups.enabled const value = root.settings.wikipedia_popups.enabled; if (typeof value !== "boolean") this.reset("settings", "wikipedia_popups", "enabled"); } } { // root.settings.auto_welcome const scope = root.settings.auto_welcome; this.restrictObject(scope, "settings", "auto_welcome"); { // root.settings.auto_welcome.enabled const value = root.settings.auto_welcome.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_welcome", "enabled"); } } { // root.settings.expiry const expiries = new Set([ "none", "1 hour", "1 day", "1 week", "1 month", "3 months", "6 months", "indefinite" ]); const scope = root.settings.expiry; this.restrictObject(scope, "settings", "expiry"); { // root.settings.expiry.watchlist const value = root.settings.expiry.watchlist; if (!expiries.has(value)) this.reset("settings", "expiry", "watchlist"); } { // root.settings.expiry.whitelist const scope = root.settings.expiry.whitelist; this.restrictObject(scope, "settings", "expiry", "whitelist"); { // root.settings.expiry.whitelist.users const value = root.settings.expiry.whitelist.users; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "users"); } { // root.settings.expiry.whitelist.pages const value = root.settings.expiry.whitelist.pages; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "pages"); } { // root.settings.expiry.whitelist.tags const value = root.settings.expiry.whitelist.tags; if (!expiries.has(value)) this.reset("settings", "expiry", "whitelist", "tags"); } } { // root.settings.expiry.highlight const scope = root.settings.expiry.highlight; this.restrictObject(scope, "settings", "expiry", "highlight"); { // root.settings.expiry.highlight.users const value = root.settings.expiry.highlight.users; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "users"); } { // root.settings.expiry.highlight.pages const value = root.settings.expiry.highlight.pages; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "pages"); } { // root.settings.expiry.highlight.tags const value = root.settings.expiry.highlight.tags; if (!expiries.has(value)) this.reset("settings", "expiry", "highlight", "tags"); } } } { // root.settings.auto_report const scope = root.settings.auto_report; this.restrictObject(scope, "settings", "auto_report"); { // root.settings.auto_report.enabled const value = root.settings.auto_report.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_report", "enabled"); } { // root.settings.auto_report.for const value = root.settings.auto_report.for; if (!Array.isArray(value)) this.reset("settings", "auto_report", "for"); root.settings.auto_report.for = [ ...new Set(root.settings.auto_report.for) ].filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid auto-report reason [ ${v} ] from stored data.`); return valid; }); } } { // root.settings.AI const scope = root.settings.AI; this.restrictObject(scope, "settings", "AI"); { // root.settings.AI.enabled const value = root.settings.AI.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "enabled"); } { // root.settings.AI.provider const value = root.settings.AI.provider; if (value !== "Ollama") this.reset("settings", "AI", "provider"); } { // root.settings.AI.edit_analysis const scope = root.settings.AI.edit_analysis; this.restrictObject(scope, "settings", "AI", "edit_analysis"); { // root.settings.AI.edit_analysis.enabled const value = root.settings.AI.edit_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "edit_analysis", "enabled"); } } { // root.settings.AI.username_analysis const scope = root.settings.AI.username_analysis; this.restrictObject(scope, "settings", "AI", "username_analysis"); { // root.settings.AI.username_analysis.enabled const value = root.settings.AI.username_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "username_analysis", "enabled"); } } { // root.settings.AI.Ollama const scope = root.settings.AI.Ollama; this.restrictObject(scope, "settings", "AI", "Ollama"); { // root.settings.AI.Ollama.server const value = root.settings.AI.Ollama.server; if (!(0, _utility.isURL)(value)) this.reset("settings", "AI", "Ollama", "server"); } { // root.settings.AI.Ollama.model const value = root.settings.AI.Ollama.model; if (typeof value !== "string") this.reset("settings", "AI", "Ollama", "model"); } } } { // root.settings.audio const scope = root.settings.audio; this.restrictObject(scope, "settings", "audio"); { // root.settings.audio.ores_alert const scope = root.settings.audio.ores_alert; this.restrictObject(scope, "settings", "audio", "ores_alert"); { // root.settings.audio.ores_alert.enabled const value = root.settings.audio.ores_alert.enabled; if (typeof value !== "boolean") this.reset("settings", "audio", "ores_alert", "enabled"); } { // root.settings.audio.ores_alert.threshold const value = root.settings.audio.ores_alert.threshold; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "ores_alert", "threshold"); } } { // root.settings.audio.volume const scope = root.settings.audio.volume; this.restrictObject(scope, "settings", "audio", "volume"); const volumeKeys = [ "master", "master.startup", "master.music", "master.music.zen_mode", "master.ui", "master.ui.click", "master.queue", "master.queue.ores", "master.queue.mention", "master.notification", "master.notification.alert", "master.notification.notice", "master.notification.toast", "master.action", "master.action.default", "master.action.failed", "master.action.report", "master.action.block", "master.action.protect" ]; for (const key of volumeKeys) { const value = root.settings.audio.volume[key]; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "volume", key); } } } { // root.settings.zen_mode const scope = root.settings.zen_mode; this.restrictObject(scope, "settings", "zen_mode"); { // root.settings.zen_mode.enabled const value = scope.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "enabled"); } { // root.settings.zen_mode.sound const scope = root.settings.zen_mode.sound; this.restrictObject(scope, "settings", "zen_mode", "sound"); { // root.settings.zen_mode.sound.enabled const value = root.settings.zen_mode.sound.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "sound", "enabled"); } } { // root.settings.zen_mode.music const scope = root.settings.zen_mode.music; this.restrictObject(scope, "settings", "zen_mode", "music"); { // root.settings.zen_mode.music.enabled const value = root.settings.zen_mode.music.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "music", "enabled"); } } { // root.settings.zen_mode.alerts const scope = root.settings.zen_mode.alerts; this.restrictObject(scope, "settings", "zen_mode", "alerts"); { // root.settings.zen_mode.alerts.enabled const value = root.settings.zen_mode.alerts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "alerts", "enabled"); } } { // root.settings.zen_mode.notices const scope = root.settings.zen_mode.notices; this.restrictObject(scope, "settings", "zen_mode", "notices"); { // root.settings.zen_mode.notices.enabled const value = root.settings.zen_mode.notices.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "notices", "enabled"); } } { // root.settings.zen_mode.toasts const scope = root.settings.zen_mode.toasts; this.restrictObject(scope, "settings", "zen_mode", "toasts"); { // root.settings.zen_mode.toasts.enabled const value = root.settings.zen_mode.toasts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "toasts", "enabled"); } } { // root.settings.zen_mode.badges const scope = root.settings.zen_mode.badges; this.restrictObject(scope, "settings", "zen_mode", "badges"); { // root.settings.zen_mode.badges.enabled const value = root.settings.zen_mode.badges.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "badges", "enabled"); } } } { // root.settings.repeat_control_scripts const value = root.settings.repeat_control_scripts; if (typeof value !== "boolean") this.reset("settings", "repeat_control_scripts"); // TODO, deal with in v3, and the other option the open in new tab thing on startup } } { // root.UI const scope = root.UI; this.restrictObject(scope, "UI"); { // root.UI.theme const scope = root.UI.theme; this.restrictObject(scope, "UI", "theme"); { // root.UI.theme.palette const value = root.UI.theme.palette; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value <= 3)) this.reset("UI", "theme", "palette"); } } { // root.UI.queue const scope = root.UI.queue; this.restrictObject(scope, "UI", "queue"); { // root.UI.queue.width const value = root.UI.queue.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "queue", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "queue", "width"); } } { // root.UI.details const scope = root.UI.details; this.restrictObject(scope, "UI", "details"); { // root.UI.details.width const value = root.UI.details.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "details", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "details", "width"); } } } { // root.control_scripts const scope = root.control_scripts; if (!Array.isArray(scope)) this.reset("control_scripts"); function sanitizeActions(actions, ...path) { return actions.filter((action, index) => { var _this$loadedLogger$wa; index = +index; if (!(0, _utility.isObject)(action)) return (_this$loadedLogger$wa = void this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa !== void 0 ? _this$loadedLogger$wa : false; if (action.name === "if") { var _this$loadedLogger$wa2; if (!(action.condition in _conditions.conditions)) return (_this$loadedLogger$wa2 = void this.loadedLogger.warn(`Removing invalid condition [ ${action.condition} ] at path [ ${[ ...path, index, "condition" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa2 !== void 0 ? _this$loadedLogger$wa2 : false; if (!Array.isArray(action.actions)) { this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[ ...path, index, "actions" ].join(" -> ")} ] in stored data.`); action.actions = []; } action.actions = sanitizeActions.call(this, action.actions, ...path, index, "actions"); } else { var _this$loadedLogger$wa3, _events$action$name$p; if (!(action.name in _events.events)) return (_this$loadedLogger$wa3 = void this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index, "name" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa3 !== void 0 ? _this$loadedLogger$wa3 : false; if (!(0, _utility.isObject)(action.params)) { this.loadedLogger.warn(`Resetting invalid params object at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params = {}; } const references = (_events$action$name$p = _events.events[action.name].parameters) !== null && _events$action$name$p !== void 0 ? _events$action$name$p : []; const validIds = new Set; for (const reference of references) { validIds.add(reference.id); if (reference.type === "choice") { if (!(reference.id in action.params)) { this.loadedLogger.warn(`Resetting missing choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = reference.options[0]; } if (!reference.options.includes(action.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = reference.options[0]; } } } for (const paramKey of Object.keys(action.params)) { if (!validIds.has(paramKey)) { this.loadedLogger.warn(`Removing invalid parameter [ ${paramKey} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] from stored data.`); delete action.params[paramKey]; } } } return true; }); } root.control_scripts = root.control_scripts.filter((scope, index) => { var _this$loadedLogger$wa4; index = +index; if (!(0, _utility.isObject)(scope)) return (_this$loadedLogger$wa4 = void this.loadedLogger.warn(`Removing invalid control script at path [ ${[ "control_scripts", index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa4 !== void 0 ? _this$loadedLogger$wa4 : false; if (!Array.isArray(scope.keys)) { this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].keys = []; } if (!Array.isArray(scope.actions)) { this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].actions = []; } root.control_scripts[index].keys = scope.keys.filter(key => _controlKeys.controls.has(key)); root.control_scripts[index].actions = sanitizeActions.call(this, scope.actions, "control_scripts", index, "actions"); return true; }); } { // root.statistics const isValidStatistic = v => typeof v === "number" && Number.isInteger(v) && v >= 0; const scope = root.statistics; this.restrictObject(scope, "statistics"); { // root.statistics.edits_reviewed const scope = root.statistics.edits_reviewed; this.restrictObject(scope, "statistics", "edits_reviewed"); { // root.statistics.edits_reviewed.total const value = root.statistics.edits_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "total"); } { // root.statistics.edits_reviewed.thanked const value = root.statistics.edits_reviewed.thanked; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "thanked"); } } { // root.statistics.recent_changes_reviewed const scope = root.statistics.recent_changes_reviewed; this.restrictObject(scope, "statistics", "recent_changes_reviewed"); { // root.statistics.recent_changes_reviewed.total const value = root.statistics.recent_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "recent_changes_reviewed", "total"); } } { // root.statistics.pending_changes_reviewed const scope = root.statistics.pending_changes_reviewed; this.restrictObject(scope, "statistics", "pending_changes_reviewed"); { // root.statistics.pending_changes_reviewed.total const value = root.statistics.pending_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "total"); } { // root.statistics.pending_changes_reviewed.accepted const value = root.statistics.pending_changes_reviewed.accepted; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "accepted"); } { // root.statistics.pending_changes_reviewed.rejected const value = root.statistics.pending_changes_reviewed.rejected; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "rejected"); } } { // root.statistics.watchlist_changes_reviewed const scope = root.statistics.watchlist_changes_reviewed; this.restrictObject(scope, "statistics", "watchlist_changes_reviewed"); { // root.statistics.watchlist_changes_reviewed.total const value = root.statistics.watchlist_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "watchlist_changes_reviewed", "total"); } } { // root.statistics.users_reviewed const scope = root.statistics.users_reviewed; this.restrictObject(scope, "statistics", "users_reviewed"); { // root.statistics.users_reviewed.total const value = root.statistics.users_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_reviewed", "total"); } } { // root.statistics.reverts_made const scope = root.statistics.reverts_made; this.restrictObject(scope, "statistics", "reverts_made"); { // root.statistics.reverts_made.total const value = root.statistics.reverts_made.total; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "total"); } { // root.statistics.reverts_made.good_faith const value = root.statistics.reverts_made.good_faith; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "good_faith"); } { // root.statistics.reverts_made.from_recent_changes const value = root.statistics.reverts_made.from_recent_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_recent_changes"); } { // root.statistics.reverts_made.from_pending_changes const value = root.statistics.reverts_made.from_pending_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_pending_changes"); } { // root.statistics.reverts_made.from_watchlist const value = root.statistics.reverts_made.from_watchlist; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_watchlist"); } { // root.statistics.reverts_made.from_loaded_edits const value = root.statistics.reverts_made.from_loaded_edits; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_loaded_edits"); } } { // root.statistics.users_welcomed const scope = root.statistics.users_welcomed; this.restrictObject(scope, "statistics", "users_welcomed"); { // root.statistics.users_welcomed.total const value = root.statistics.users_welcomed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_welcomed", "total"); } } { // root.statistics.warnings_issued const scope = root.statistics.warnings_issued; this.restrictObject(scope, "statistics", "warnings_issued"); { // root.statistics.warnings_issued.total const value = root.statistics.warnings_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "total"); } { // root.statistics.warnings_issued.level_1 const value = root.statistics.warnings_issued.level_1; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_1"); } { // root.statistics.warnings_issued.level_2 const value = root.statistics.warnings_issued.level_2; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_2"); } { // root.statistics.warnings_issued.level_3 const value = root.statistics.warnings_issued.level_3; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_3"); } { // root.statistics.warnings_issued.level_4 const value = root.statistics.warnings_issued.level_4; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4"); } { // root.statistics.warnings_issued.level_4im const value = root.statistics.warnings_issued.level_4im; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4im"); } } { // root.statistics.reports_filed const scope = root.statistics.reports_filed; this.restrictObject(scope, "statistics", "reports_filed"); { // root.statistics.reports_filed.total const value = root.statistics.reports_filed.total; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "total"); } { // root.statistics.reports_filed.AIV const value = root.statistics.reports_filed.AIV; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "AIV"); } { // root.statistics.reports_filed.UAA const value = root.statistics.reports_filed.UAA; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "UAA"); } { // root.statistics.reports_filed.RFPP const value = root.statistics.reports_filed.RFPP; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "RFPP"); } } { // root.statistics.watchlist const scope = root.statistics.watchlist; this.restrictObject(scope, "statistics", "watchlist"); { // root.statistics.watchlist.watched const value = root.statistics.watchlist.watched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "watched"); } { // root.statistics.watchlist.unwatched const value = root.statistics.watchlist.unwatched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "unwatched"); } } { // root.statistics.items_whitelisted const scope = root.statistics.items_whitelisted; this.restrictObject(scope, "statistics", "items_whitelisted"); { // root.statistics.items_whitelisted.total const value = root.statistics.items_whitelisted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "total"); } { // root.statistics.items_whitelisted.users const value = root.statistics.items_whitelisted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "users"); } { // root.statistics.items_whitelisted.pages const value = root.statistics.items_whitelisted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "pages"); } { // root.statistics.items_whitelisted.tags const value = root.statistics.items_whitelisted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "tags"); } } { // root.statistics.items_highlighted const scope = root.statistics.items_highlighted; this.restrictObject(scope, "statistics", "items_highlighted"); { // root.statistics.items_highlighted.total const value = root.statistics.items_highlighted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "total"); } { // root.statistics.items_highlighted.users const value = root.statistics.items_highlighted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "users"); } { // root.statistics.items_highlighted.pages const value = root.statistics.items_highlighted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "pages"); } { // root.statistics.items_highlighted.tags const value = root.statistics.items_highlighted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "tags"); } } { // root.statistics.blocks_issued const scope = root.statistics.blocks_issued; this.restrictObject(scope, "statistics", "blocks_issued"); { // root.statistics.blocks_issued.total const value = root.statistics.blocks_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "blocks_issued", "total"); } } { // root.statistics.pages_protected const scope = root.statistics.pages_protected; this.restrictObject(scope, "statistics", "pages_protected"); { // root.statistics.pages_protected.total const value = root.statistics.pages_protected.total; if (!isValidStatistic(value)) this.reset("statistics", "pages_protected", "total"); } } { // root.statistics.actions_executed const scope = root.statistics.actions_executed; this.restrictObject(scope, "statistics", "actions_executed"); { // root.statistics.actions_executed.total const value = root.statistics.actions_executed.total; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "total"); } { // root.statistics.actions_executed.successful const value = root.statistics.actions_executed.successful; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "successful"); } } { // root.statistics.session_time const value = root.statistics.session_time; if (!(typeof value === "number" && value >= 0)) this.reset("statistics", "session_time"); } } const isValidExpiryMap = root => { // [ username, [ timestamp, timestamp ] ] if (!(Array.isArray(root) && root.length === 2)) return false; else if (typeof root[0] !== "string") return false; { const scope = root[1]; if (!(Array.isArray(scope) && scope.length === 2)) return false; const isTimestamp = v => typeof v === "number" && Number.isInteger(v) && v >= 0; if (!(isTimestamp(scope[0]) && isTimestamp(scope[1]))) return false; } return true; }; { // root.highlight const scope = root.highlight; this.restrictObject(scope, "highlight"); { // root.highlight.users const value = root.highlight.users; if (!Array.isArray(value)) this.reset("highlight", "users"); root.highlight.users = root.highlight.users.filter(v => isValidExpiryMap(v)); } { // root.highlight.pages const value = root.highlight.pages; if (!Array.isArray(value)) this.reset("highlight", "pages"); root.highlight.pages = root.highlight.pages.filter(v => isValidExpiryMap(v)); } { // root.highlight.tags const value = root.highlight.tags; if (!Array.isArray(value)) this.reset("highlight", "tags"); root.highlight.tags = root.highlight.tags.filter(v => isValidExpiryMap(v)); } } { // root.whitelist const scope = root.whitelist; this.restrictObject(scope, "whitelist"); { // root.whitelist.users const value = root.whitelist.users; if (!Array.isArray(value)) this.reset("whitelist", "users"); root.whitelist.users = root.whitelist.users.filter(v => isValidExpiryMap(v)); } { // root.whitelist.pages const value = root.whitelist.pages; if (!Array.isArray(value)) this.reset("whitelist", "pages"); root.whitelist.pages = root.whitelist.pages.filter(v => isValidExpiryMap(v)); } { // root.whitelist.tags const value = root.whitelist.tags; if (!Array.isArray(value)) this.reset("whitelist", "tags"); root.whitelist.tags = root.whitelist.tags.filter(v => isValidExpiryMap(v)); } } { // root.favorite const scope = root.favorite; this.restrictObject(scope, "favorite"); { // root.favorite.warnings const value = root.favorite.warnings; if (!Array.isArray(value)) this.reset("favorite", "warnings"); root.favorite.warnings = root.favorite.warnings.filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid favorite warning [ ${v} ] from stored data.`); return valid; }); } { // root.favorite.reverts const value = root.favorite.reverts; if (!Array.isArray(value)) this.reset("favorite", "reverts"); root.favorite.reverts = root.favorite.reverts.filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid favorite revert [ ${v} ] from stored data.`); return valid; }); } } return true; } static construct() { var _this$loadedLogger$er2; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er2 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er2 !== void 0 ? _this$loadedLogger$er2 : false; root.settings.auto_report.for = new Set(root.settings.auto_report.for); root.highlight.users = new Map(root.highlight.users); root.highlight.pages = new Map(root.highlight.pages); root.highlight.tags = new Map(root.highlight.tags); root.whitelist.users = new Map(root.whitelist.users); root.whitelist.pages = new Map(root.whitelist.pages); root.whitelist.tags = new Map(root.whitelist.tags); return root; } static deconstruct() { var _this$loadedLogger$er3; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er3 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er3 !== void 0 ? _this$loadedLogger$er3 : false; root.settings.auto_report.for = [ ...root.settings.auto_report.for ]; root.highlight.users = [ ...root.highlight.users ]; root.highlight.pages = [ ...root.highlight.pages ]; root.highlight.tags = [ ...root.highlight.tags ]; root.whitelist.users = [ ...root.whitelist.users ]; root.whitelist.pages = [ ...root.whitelist.pages ]; root.whitelist.tags = [ ...root.whitelist.tags ]; const data = structuredClone(root); // stuctureClone is safe since we have to use JSON for storage anyway this.construct(); // reconstruct to restore Maps and Sets return data; } }, _defineProperty(_V, "number", 2), _V); /***/ }, /***/ 8415(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _utility = __webpack_require__(330); var _namespaces = __webpack_require__(4018); var _warnings = __webpack_require__(955); var _events = __webpack_require__(985); var _conditions = __webpack_require__(870); var _controlKeys = __webpack_require__(9808); var _helpers = __webpack_require__(3241); var _scripts = __webpack_require__(5564); var _gui = __webpack_require__(8469); var _versions = __webpack_require__(4029); var _V; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // DO NOT CHANGE THIS FILE _versions.Version.v3 = (_V = class V3 extends _versions.Version { static get default() { return { version: 3, changelog: "6", settings: { performance: { startup: "adaptive" }, namespaces: [ 0 ], queue: { max_size: 100, max_edits: 50, min_ores: 0, ores_bias: .5, recent: { enabled: true, order: 0 }, pending: { enabled: true, order: 1 }, users: { enabled: false, order: 2 }, watchlist: { enabled: true, order: 3 }, abuselog: { enabled: true, order: 4 } }, username_highlighting: { enabled: true, fuzzy: false }, wikipedia_popups: { enabled: true }, auto_welcome: { enabled: false }, talk_page_thanks_for_temporary_users: { enabled: true }, expiry: { watchlist: "1W", whitelist: { users: "infinity", pages: "infinity", tags: "infinity" }, highlight: { users: "1W", pages: "1W", tags: "1W" } }, auto_report: { enabled: true, for: [ "Vandalism", "Subtle vandalism", "Image vandalism", "Sandbox", "Deliberate errors", "Disruptive editing", "Editing tests", "Commentary", "Inappropriate jokes", "Deleting", "Unsourced", "Unsourced (BLP)", "Unsourced genre", "Original research", /* "POV", */ "Censoring", "AI-generated", "AI-generated (talk)", /* "MOS violation", */ /* "Not English", */ "Personal attacks", "Harassment", "TPO", /* "Chatting", */ /* "Owning", */ "AfD removal", /* "Gaming the system", */ "Advertising", "Spam links", "Attempt", "Inappropriate edit summary", "Misleading edit summary" ] }, AI: { enabled: false, provider: "Ollama", edit_analysis: { enabled: true }, username_analysis: { enabled: true }, Ollama: { server: "http://localhost:11434", model: "" } }, audio: { ores_alert: { enabled: true, threshold: .95 }, volume: { master: 1, "master.startup": 1, "master.music": 1, "master.music.zen_mode": 1, "master.ui": 1, "master.ui.click": .05, "master.queue": 1, "master.queue.ores": 1, "master.queue.mention": 1, "master.notification": 1, "master.notification.alert": .7, "master.notification.message": .5, "master.notification.toast": .5, "master.action": 1, "master.action.default": .6, "master.action.failed": .85, "master.action.report": 1, "master.action.block": 1, "master.action.protect": 1 } }, zen_mode: { enabled: false, sound: { enabled: true }, music: { enabled: true }, alerts: { enabled: true }, messages: { enabled: false }, toasts: { enabled: false }, badges: { enabled: false } }, accessibility: { colorblind: false, dyslexia: false, high_contrast: false, reduce_motion: false }, repeat_control_scripts: true }, UI: { theme: { app: "auto", palette: "traffic" }, queue: { width: "15vw" }, details: { width: "15vw" } }, control_scripts: [ { keys: [ "arrowright", " " ], actions: [ { name: "next-item", params: {} } ] }, { keys: [ "arrowleft" ], actions: [ { name: "previous-item", params: {} } ] }, { keys: [ "q" ], actions: [ { name: "next-item", params: {} }, { name: "revert", params: { warning: "Vandalism" } }, { name: "highlight-user", params: {} } ] }, { keys: [ "h" ], actions: [ { name: "open-page-history", params: {} } ] }, { keys: [ "c" ], actions: [ { name: "open-user-contributions", params: {} } ] }, { keys: [ "t" ], actions: [ { name: "thank-user", params: {} } ] }, { keys: [ "w" ], actions: [ { name: "welcome-user", params: {} } ] } ], statistics: { edits_reviewed: { total: 0, thanked: 0 }, recent_changes_reviewed: { total: 0 }, pending_changes_reviewed: { total: 0, accepted: 0, rejected: 0 }, watchlist_changes_reviewed: { total: 0 }, users_reviewed: { total: 0 }, abuselogs_reviewed: { total: 0 }, reverts_made: { total: 0, good_faith: 0, from_recent_changes: 0, from_pending_changes: 0, from_watchlist: 0, from_abuselogs: 0, from_loaded_edits: 0 }, users_welcomed: { total: 0 }, warnings_issued: { total: 0, level_1: 0, level_2: 0, level_3: 0, level_4: 0, level_4im: 0 }, reports_filed: { total: 0, AIV: 0, UAA: 0, RFPP: 0, global_blocks: 0, global_locks: 0 }, watchlist: { watched: 0, unwatched: 0 }, items_whitelisted: { total: 0, users: 0, pages: 0, tags: 0 }, items_highlighted: { total: 0, users: 0, pages: 0, tags: 0 }, blocks_issued: { total: 0 }, pages_protected: { total: 0 }, actions_executed: { total: 0, successful: 0 }, session_time: 0 }, highlight: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, whitelist: { users: [], // imported as array, stored as Map pages: [], // imported as array, stored as Map tags: [] }, favorite: { warnings: [], reverts: [] } }; } static upgrade() { if (this.loadedData.version !== this.number - 1) { this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number - 1}.`); throw new Error("INVALID_UPGRADE_ATTEMPT"); } this.deprecated("settings", "cloud_storage"); // properties without sanitization did not exist in the previous version const defaults = this.default; return { changelog: this.sanitize([ "changelog" ], defaults.changelog), settings: { performance: { startup: this.sanitize([ "settings", "performance", "startup" ], defaults.settings.performance.startup) }, namespaces: this.sanitize([ "settings", "namespaces" ], defaults.settings.namespaces), queue: { max_size: this.sanitize([ "settings", "queue", "max_size" ], defaults.settings.queue.max_size), max_edits: this.sanitize([ "settings", "queue", "max_edits" ], defaults.settings.queue.max_edits), min_ores: this.sanitize([ "settings", "queue", "min_ores" ], defaults.settings.queue.min_ores), ores_bias: defaults.settings.queue.ores_bias, recent: { enabled: this.sanitize([ "settings", "queue", "recent", "enabled" ], defaults.settings.queue.recent.enabled), order: this.sanitize([ "settings", "queue", "recent", "order" ], defaults.settings.queue.recent.order) }, pending: { enabled: this.sanitize([ "settings", "queue", "flagged", "enabled" ], defaults.settings.queue.pending.enabled), order: this.sanitize([ "settings", "queue", "flagged", "order" ], defaults.settings.queue.pending.order) }, users: { enabled: this.sanitize([ "settings", "queue", "users", "enabled" ], defaults.settings.queue.users.enabled), order: this.sanitize([ "settings", "queue", "users", "order" ], defaults.settings.queue.users.order) }, watchlist: { enabled: this.sanitize([ "settings", "queue", "watchlist", "enabled" ], defaults.settings.queue.watchlist.enabled), order: this.sanitize([ "settings", "queue", "watchlist", "order" ], defaults.settings.queue.watchlist.order) }, abuselog: { enabled: defaults.settings.queue.abuselog.enabled, order: defaults.settings.queue.abuselog.order } }, username_highlighting: { enabled: this.sanitize([ "settings", "username_highlighting", "enabled" ], defaults.settings.username_highlighting.enabled), fuzzy: this.sanitize([ "settings", "username_highlighting", "fuzzy" ], defaults.settings.username_highlighting.fuzzy) }, wikipedia_popups: { enabled: defaults.settings.wikipedia_popups.enabled }, auto_welcome: { enabled: this.sanitize([ "settings", "auto_welcome", "enabled" ], defaults.settings.auto_welcome.enabled) }, talk_page_thanks_for_temporary_users: { enabled: defaults.settings.talk_page_thanks_for_temporary_users.enabled }, expiry: { watchlist: this.sanitize([ "settings", "expiry", "watchlist" ], defaults.settings.expiry.watchlist, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), whitelist: { users: this.sanitize([ "settings", "expiry", "whitelist", "users" ], defaults.settings.expiry.whitelist.users, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), pages: this.sanitize([ "settings", "expiry", "whitelist", "pages" ], defaults.settings.expiry.whitelist.pages, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), tags: this.sanitize([ "settings", "expiry", "whitelist", "tags" ], defaults.settings.expiry.whitelist.tags, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])) }, highlight: { users: this.sanitize([ "settings", "expiry", "highlight", "users" ], defaults.settings.expiry.highlight.users, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), pages: this.sanitize([ "settings", "expiry", "highlight", "pages" ], defaults.settings.expiry.highlight.pages, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])), tags: this.sanitize([ "settings", "expiry", "highlight", "tags" ], defaults.settings.expiry.highlight.tags, value => ({ none: "", "1 hour": "1h", "1 day": "1D", "1 week": "1W", "1 month": "1M", "3 months": "3M", "6 months": "6M", indefinite: "infinity" }[value])) } }, auto_report: { enabled: this.sanitize([ "settings", "auto_report", "enabled" ], defaults.settings.auto_report.enabled), for: this.sanitize([ "settings", "auto_report", "for" ], defaults.settings.auto_report.for, value => { if (!Array.isArray(value)) return undefined; const set = new Set([ "Attempt" ]); // add some default reports value.forEach(v => set.add(v)); return [ ...set ]; }) }, AI: { enabled: this.sanitize([ "settings", "AI", "enabled" ], defaults.settings.AI.enabled), provider: this.sanitize([ "settings", "AI", "provider" ], defaults.settings.AI.provider), edit_analysis: { enabled: this.sanitize([ "settings", "AI", "edit_analysis", "enabled" ], defaults.settings.AI.edit_analysis.enabled) }, username_analysis: { enabled: this.sanitize([ "settings", "AI", "username_analysis", "enabled" ], defaults.settings.AI.username_analysis.enabled) }, Ollama: { server: this.sanitize([ "settings", "AI", "Ollama", "server" ], defaults.settings.AI.Ollama.server), model: this.sanitize([ "settings", "AI", "Ollama", "model" ], defaults.settings.AI.Ollama.model) } }, audio: { ores_alert: { enabled: this.sanitize([ "settings", "audio", "ores_alert", "enabled" ], defaults.settings.audio.ores_alert.enabled), threshold: this.sanitize([ "settings", "audio", "ores_alert", "threshold" ], defaults.settings.audio.ores_alert.threshold) }, volume: { master: this.sanitize([ "settings", "audio", "volume", "master" ], defaults.settings.audio.volume.master), "master.startup": this.sanitize([ "settings", "audio", "volume", "master.startup" ], defaults.settings.audio.volume["master.startup"]), "master.music": this.sanitize([ "settings", "audio", "volume", "master.music" ], defaults.settings.audio.volume["master.music"]), "master.music.zen_mode": this.sanitize([ "settings", "audio", "volume", "master.music.zen_mode" ], defaults.settings.audio.volume["master.music.zen_mode"]), "master.ui": this.sanitize([ "settings", "audio", "volume", "master.ui" ], defaults.settings.audio.volume["master.ui"]), "master.ui.click": this.sanitize([ "settings", "audio", "volume", "master.ui.click" ], defaults.settings.audio.volume["master.ui.click"]), "master.queue": this.sanitize([ "settings", "audio", "volume", "master.queue" ], defaults.settings.audio.volume["master.queue"]), "master.queue.ores": this.sanitize([ "settings", "audio", "volume", "master.queue.ores" ], defaults.settings.audio.volume["master.queue.ores"]), "master.queue.mention": this.sanitize([ "settings", "audio", "volume", "master.queue.mention" ], defaults.settings.audio.volume["master.queue.mention"]), "master.notification": this.sanitize([ "settings", "audio", "volume", "master.notification" ], defaults.settings.audio.volume["master.notification"]), "master.notification.alert": this.sanitize([ "settings", "audio", "volume", "master.notification.alert" ], defaults.settings.audio.volume["master.notification.alert"]), "master.notification.message": this.sanitize([ "settings", "audio", "volume", "master.notification.notice" ], defaults.settings.audio.volume["master.notification.message"]), "master.notification.toast": this.sanitize([ "settings", "audio", "volume", "master.notification.toast" ], defaults.settings.audio.volume["master.notification.toast"]), "master.action": this.sanitize([ "settings", "audio", "volume", "master.action" ], defaults.settings.audio.volume["master.action"]), "master.action.default": this.sanitize([ "settings", "audio", "volume", "master.action.default" ], defaults.settings.audio.volume["master.action.default"]), "master.action.failed": this.sanitize([ "settings", "audio", "volume", "master.action.failed" ], defaults.settings.audio.volume["master.action.failed"]), "master.action.report": this.sanitize([ "settings", "audio", "volume", "master.action.report" ], defaults.settings.audio.volume["master.action.report"]), "master.action.block": this.sanitize([ "settings", "audio", "volume", "master.action.block" ], defaults.settings.audio.volume["master.action.block"]), "master.action.protect": this.sanitize([ "settings", "audio", "volume", "master.action.protect" ], defaults.settings.audio.volume["master.action.protect"]) } }, zen_mode: { enabled: this.sanitize([ "settings", "zen_mode", "enabled" ], defaults.settings.zen_mode.enabled), sound: { enabled: this.sanitize([ "settings", "zen_mode", "sound", "enabled" ], defaults.settings.zen_mode.sound.enabled) }, music: { enabled: this.sanitize([ "settings", "zen_mode", "music", "enabled" ], defaults.settings.zen_mode.music.enabled) }, alerts: { enabled: this.sanitize([ "settings", "zen_mode", "alerts", "enabled" ], defaults.settings.zen_mode.alerts.enabled) }, messages: { enabled: this.sanitize([ "settings", "zen_mode", "notices", "enabled" ], defaults.settings.zen_mode.messages.enabled) }, toasts: { enabled: this.sanitize([ "settings", "zen_mode", "toasts", "enabled" ], defaults.settings.zen_mode.toasts.enabled) }, badges: { enabled: this.sanitize([ "settings", "zen_mode", "badges", "enabled" ], defaults.settings.zen_mode.badges.enabled) } }, accessibility: { colorblind: defaults.settings.accessibility.colorblind, dyslexia: defaults.settings.accessibility.dyslexia, high_contrast: defaults.settings.accessibility.high_contrast, reduce_motion: defaults.settings.accessibility.reduce_motion }, repeat_control_scripts: this.sanitize([ "settings", "repeat_control_scripts" ], defaults.settings.repeat_control_scripts) }, UI: { theme: { app: defaults.UI.theme.app, palette: this.sanitize([ "UI", "theme", "palette" ], defaults.UI.theme.palette, value => [ "traffic", "heat", "natural", "cool" ][value] || defaults.UI.theme.palette) }, queue: { width: this.sanitize([ "UI", "queue", "width" ], defaults.UI.queue.width) }, details: { width: this.sanitize([ "UI", "details", "width" ], defaults.UI.details.width) } }, control_scripts: this.sanitize([ "control_scripts" ], defaults.control_scripts, value => { if (Array.isArray(value)) { function updateActions(actions, ...path) { return actions.filter((action, index) => { index = +index; if (!(0, _utility.isObject)(action)) return true; // malformed but don't care here if (action.name === "if" || action.name === "if not") { var _action$condition, _action$condition$par; const not = action.name === "if not"; const swap = () => action.name = not ? "if" : "if not"; if (typeof action.condition === "string") action.condition = { name: action.condition, params: {} }; (_action$condition$par = (_action$condition = action.condition).params) !== null && _action$condition$par !== void 0 ? _action$condition$par : _action$condition.params = {}; switch (action.condition.name) { case "operatorNonAdmin": { swap(); } case "operatorAdmin": { action.condition.name = "account-admin"; } break; case "userIsHighlighted": { action.condition.name = "username-highlighted"; } break; case "userIsWhitelisted": { action.condition.name = "username-whitelisted"; } break; case "pageIsWhitelisted": { action.condition.name = "page-whitelisted"; } break; case "userIsAnon": { swap(); } case "userIsRegistered": { action.codition.name = "user-registered"; } break; case "userIsIP": { action.condition.name = "user-ip"; } break; case "userIsTemp": { action.condition.name = "user-temp"; } break; case "userHasEmptyTalkPage": { action.condition.name = "user-empty-talk"; } break; case "editIsMajor": { swap(); } case "editIsMinor": { action.condition.name = "edit-minor"; } break; case "editSizeNegative": { action.condition.name = "edit-size"; action.condition.params = { condition: "<", size: 0 }; } break; case "editSizePositive": { action.condition.name = "edit-size"; action.condition.params = { condition: ">", size: 0 }; } break; case "editSizeLarge": { action.condition.name = "abs-edit-size"; action.condition.params = { condition: "≥", size: 1e3 }; } break; case "userEditCountLow": { action.condition.name = "user-edit-count"; action.condition.params = { condition: "<", count: 10 }; } break; case "userEditCountHigh": { action.condition.name = "user-edit-count"; action.condition.params = { condition: "≥", count: 100 }; } break; case "atFinalWarning": { action.condition.name = "user-final-warning"; } break; case "userNoWarnings": { swap(); } case "userHasWarnings": { action.condition.name = "user-has-warnings"; } break; } if (!(action.condition.name in _conditions.conditions)) return true; // malformed but don't care here if (!Array.isArray(action.actions)) return true; // malformed but don't care here action.actions = updateActions.call(this, action.actions, ...path, index, "actions"); } else { var _action$params; (_action$params = action.params) !== null && _action$params !== void 0 ? _action$params : action.params = {}; switch (action.name) { case "toggleZenMode": { action.name = "toggle-zen-mode"; } break; case "acceptFlaggedEdit": { action.name = "accept-pending-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.summary = action.params.reason; delete action.params.reason; } break; case "rejectFlaggedEdit": { action.name = "reject-pending-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.summary = action.params.reason; delete action.params.reason; } break; case "prevEdit": { action.name = "previous-item"; } break; case "nextEdit": { action.name = "next-item"; } break; case "deleteQueue": { action.name = "clear-queue"; } break; case "openRevertMenu": { action.name = "open-revert-menu"; } break; case "openWarnMenu": { action.name = "open-warn-menu"; } break; case "openUserPage": { action.name = "open-user-page"; } break; case "openUserTalk": { action.name = "open-user-talk"; } break; case "openUserContribs": { action.name = "open-user-contributions"; } break; case "openFilterLog": { action.name = "open-user-filter-log"; } break; case "openPage": { action.name = "open-page"; } break; case "openTalk": { action.name = "open-page-talk"; } break; case "openHistory": { action.name = "open-page-history"; } break; case "openRevision": { action.name = "open-revision"; } break; case "openDiff": { action.name = "open-diff"; } break; case "switchToRecentQueue": { action.name = "switch-to-recent-queue"; } break; case "switchToFlaggedQueue": { action.name = "switch-to-pending-queue"; } break; case "switchToUsersQueue": { action.name = "switch-to-users-queue"; } break; case "switchToWatchlistQueue": { action.name = "switch-to-watchlist-queue"; } break; case "watchPage": { action.name = "watch-page"; } break; case "unwatchPage": { action.name = "unwatch-page"; } break; case "whitelistUser": { action.name = "whitelist-user"; } break; case "whitelistPage": { action.name = "whitelist-page"; } break; case "unwhitelistUser": { action.name = "unwhitelist-user"; } break; case "unwhitelistPage": { action.name = "unwhitelist-page"; } break; case "highlightUser": { action.name = "highlight-user"; } break; case "highlightPage": { action.name = "highlight-page"; } break; case "unwhitelistUser": { action.name = "unhighlight-user"; } break; case "unwhitelistPage": { action.name = "unhighlight-page"; } break; case "thankUser": { action.name = "thank-user"; } break; case "warn": { action.name = "warn-user"; } break; case "rollback": { action.name = "rollback-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.hide_username = "No"; } break; case "rollbackGoodFaith": { action.name = "rollback-goodfaith-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.hide_username = "No"; } break; case "undo": { action.name = "undo-edit"; if (!(0, _utility.isObject)(action.params)) return true; action.params.hide_username = "No"; } break; case "reportToAIV": { action.name = "report-user-to-aiv"; if (!(0, _utility.isObject)(action.params)) return true; action.params.reason = action.params.reportMessage; delete action.params.reportMessage; action.params.summary = action.params.comment; delete action.params.comment; } break; case "reportToUAA": { action.name = "report-user-to-uaa"; if (!(0, _utility.isObject)(action.params)) return true; action.params.reason = action.params.reportMessage; delete action.params.reportMessage; action.params.summary = action.params.comment; delete action.params.comment; } break; case "requestProtection": { action.name = "request-page-protection"; if (!(0, _utility.isObject)(action.params)) return true; action.params.summary = action.params.comment; delete action.params.comment; } break; case "welcome": { action.name = "welcome-user"; } break; case "toggleConsecutive": { action.name = "toggle-consecutive-edits"; } break; case "block": { this.loadedLogger.warn(`Skipping deprecated action 'block' in control script at ${[ ...path, index ].join(" -> ")}.`); return false; // removed } // removed by dead control flow case "protect": { this.loadedLogger.warn(`Skipping deprecated action 'protect' in control script at ${[ ...path, index ].join(" -> ")}.`); return false; // removed } // removed by dead control flow case "openSettings": { this.loadedLogger.warn(`Skipping deprecated action 'openSettings' in control script at ${[ ...path, index ].join(" -> ")}.`); return false; // removed } } } return true; }); } value.forEach((scope2, index) => { index = +index; if (!(0, _utility.isObject)(scope2)) return; if (!Array.isArray(scope2.keys)) return; if (!Array.isArray(scope2.actions)) return; scope2.actions = updateActions.call(this, scope2.actions, "control_scripts", index, "actions"); }); return value; } return undefined; }), statistics: { edits_reviewed: { total: this.sanitize([ "statistics", "edits_reviewed", "total" ], defaults.statistics.edits_reviewed.total), thanked: this.sanitize([ "statistics", "edits_reviewed", "thanked" ], defaults.statistics.edits_reviewed.thanked) }, recent_changes_reviewed: { total: this.sanitize([ "statistics", "recent_changes_reviewed", "total" ], defaults.statistics.recent_changes_reviewed.total) }, pending_changes_reviewed: { total: this.sanitize([ "statistics", "pending_changes_reviewed", "total" ], defaults.statistics.pending_changes_reviewed.total), accepted: this.sanitize([ "statistics", "pending_changes_reviewed", "accepted" ], defaults.statistics.pending_changes_reviewed.accepted), rejected: this.sanitize([ "statistics", "pending_changes_reviewed", "rejected" ], defaults.statistics.pending_changes_reviewed.rejected) }, watchlist_changes_reviewed: { total: this.sanitize([ "statistics", "watchlist_changes_reviewed", "total" ], defaults.statistics.watchlist_changes_reviewed.total) }, users_reviewed: { total: this.sanitize([ "statistics", "users_reviewed", "total" ], defaults.statistics.users_reviewed.total) }, abuselogs_reviewed: { total: defaults.statistics.abuselogs_reviewed.total }, reverts_made: { total: this.sanitize([ "statistics", "reverts_made", "total" ], defaults.statistics.reverts_made.total), good_faith: this.sanitize([ "statistics", "reverts_made", "good_faith" ], defaults.statistics.reverts_made.good_faith), from_recent_changes: this.sanitize([ "statistics", "reverts_made", "from_recent_changes" ], defaults.statistics.reverts_made.from_recent_changes), from_pending_changes: this.sanitize([ "statistics", "reverts_made", "from_pending_changes" ], defaults.statistics.reverts_made.from_pending_changes), from_watchlist: this.sanitize([ "statistics", "reverts_made", "from_watchlist" ], defaults.statistics.reverts_made.from_watchlist), from_abuselogs: defaults.statistics.reverts_made.from_abuselogs, from_loaded_edits: this.sanitize([ "statistics", "reverts_made", "from_loaded_edits" ], defaults.statistics.reverts_made.from_loaded_edits) }, users_welcomed: { total: this.sanitize([ "statistics", "users_welcomed", "total" ], defaults.statistics.users_welcomed.total) }, warnings_issued: { total: this.sanitize([ "statistics", "warnings_issued", "total" ], defaults.statistics.warnings_issued.total), level_1: this.sanitize([ "statistics", "warnings_issued", "level_1" ], defaults.statistics.warnings_issued.level_1), level_2: this.sanitize([ "statistics", "warnings_issued", "level_2" ], defaults.statistics.warnings_issued.level_2), level_3: this.sanitize([ "statistics", "warnings_issued", "level_3" ], defaults.statistics.warnings_issued.level_3), level_4: this.sanitize([ "statistics", "warnings_issued", "level_4" ], defaults.statistics.warnings_issued.level_4), level_4im: this.sanitize([ "statistics", "warnings_issued", "level_4im" ], defaults.statistics.warnings_issued.level_4im) }, reports_filed: { total: this.sanitize([ "statistics", "reports_filed", "total" ], defaults.statistics.reports_filed.total), AIV: this.sanitize([ "statistics", "reports_filed", "AIV" ], defaults.statistics.reports_filed.AIV), UAA: this.sanitize([ "statistics", "reports_filed", "UAA" ], defaults.statistics.reports_filed.UAA), RFPP: this.sanitize([ "statistics", "reports_filed", "RFPP" ], defaults.statistics.reports_filed.RFPP), global_blocks: defaults.statistics.reports_filed.global_blocks, global_locks: defaults.statistics.reports_filed.global_locks }, watchlist: { watched: this.sanitize([ "statistics", "watchlist", "watched" ], defaults.statistics.watchlist.watched), unwatched: this.sanitize([ "statistics", "watchlist", "unwatched" ], defaults.statistics.watchlist.unwatched) }, items_whitelisted: { total: this.sanitize([ "statistics", "items_whitelisted", "total" ], defaults.statistics.items_whitelisted.total), users: this.sanitize([ "statistics", "items_whitelisted", "users" ], defaults.statistics.items_whitelisted.users), pages: this.sanitize([ "statistics", "items_whitelisted", "pages" ], defaults.statistics.items_whitelisted.pages), tags: this.sanitize([ "statistics", "items_whitelisted", "tags" ], defaults.statistics.items_whitelisted.tags) }, items_highlighted: { total: this.sanitize([ "statistics", "items_highlighted", "total" ], defaults.statistics.items_highlighted.total), users: this.sanitize([ "statistics", "items_highlighted", "users" ], defaults.statistics.items_highlighted.users), pages: this.sanitize([ "statistics", "items_highlighted", "pages" ], defaults.statistics.items_highlighted.pages), tags: this.sanitize([ "statistics", "items_highlighted", "tags" ], defaults.statistics.items_highlighted.tags) }, blocks_issued: { total: this.sanitize([ "statistics", "blocks_issued", "total" ], defaults.statistics.blocks_issued.total) }, pages_protected: { total: this.sanitize([ "statistics", "pages_protected", "total" ], defaults.statistics.pages_protected.total) }, actions_executed: { total: this.sanitize([ "statistics", "actions_executed", "total" ], defaults.statistics.actions_executed.total), successful: this.sanitize([ "statistics", "actions_executed", "successful" ], defaults.statistics.actions_executed.successful) }, session_time: this.sanitize([ "statistics", "session_time" ], defaults.statistics.session_time) }, highlight: { users: this.sanitize([ "highlight", "users" ], defaults.highlight.users), pages: this.sanitize([ "highlight", "pages" ], defaults.highlight.pages), tags: this.sanitize([ "highlight", "tags" ], defaults.highlight.tags) }, whitelist: { users: this.sanitize([ "whitelist", "users" ], defaults.whitelist.users), pages: this.sanitize([ "whitelist", "pages" ], defaults.whitelist.pages), tags: this.sanitize([ "whitelist", "tags" ], defaults.whitelist.tags) }, favorite: { warnings: this.sanitize([ "favorite", "warnings" ], defaults.favorite.warnings), reverts: this.sanitize([ "favorite", "reverts" ], defaults.favorite.reverts) } }; } static validate() { var _this$loadedLogger$er; const root = this.loadedData; this.restrictObject(root); if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er !== void 0 ? _this$loadedLogger$er : false; if (typeof root.changelog !== "string") this.reset("changelog"); { // root.settings const scope = root.settings; this.restrictObject(scope, "settings"); { // root.settings.performance const scope = root.settings.performance; this.restrictObject(scope, "settings", "performance"); { // root.settings.performance.startup const validValues = new Set([ "always_off", "adaptive", "always_on" ]); const value = root.settings.performance.startup; if (!validValues.has(value)) this.reset("settings", "performance", "startup"); } } { // root.settings.namespaces const value = root.settings.namespaces; if (!Array.isArray(value)) this.reset("settings", "namespaces"); root.settings.namespaces = [ ...new Set(root.settings.namespaces) ].filter(v => { const valid = _namespaces.namespaces.some(ns => ns.id === v); if (!valid) this.loadedLogger.warn(`Removing invalid namespace ID [ ${v} ] from stored data.`); return valid; }); } { // root.settings.queue const scope = root.settings.queue; this.restrictObject(scope, "settings", "queue"); { // root.settings.queue.max_size const value = root.settings.queue.max_size; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_size"); } { // root.settings.queue.max_edits const value = root.settings.queue.max_edits; if (!(typeof value === "number" && Number.isInteger(value) && value > 0)) this.reset("settings", "queue", "max_edits"); } { // root.settings.queue.min_ores const value = root.settings.queue.min_ores; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "queue", "min_ores"); } { // root.settings.queue.ores_bias const value = root.settings.queue.ores_bias; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "queue", "ores_bias"); } [ "recent", "pending", "users", "watchlist", "abuselog" ].forEach((section, _, queues) => { { // root.settings.queue[section] const scope = root.settings.queue[section]; this.restrictObject(scope, "settings", "queue", section); { // root.settings.queue[section].enabled const value = root.settings.queue[section].enabled; if (typeof value !== "boolean") this.reset("settings", "queue", section, "enabled"); } { // root.settings.queue[section].order const value = root.settings.queue[section].order; if (!(typeof value === "number" && Number.isInteger(value) && value >= 0 && value < queues.length)) this.reset("settings", "queue", section, "order"); } } }); } { // root.settings.username_highlighting const scope = root.settings.username_highlighting; this.restrictObject(scope, "settings", "username_highlighting"); { // root.settings.username_highlighting.enabled const value = root.settings.username_highlighting.enabled; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "enabled"); } { // root.settings.username_highlighting.fuzzy const value = root.settings.username_highlighting.fuzzy; if (typeof value !== "boolean") this.reset("settings", "username_highlighting", "fuzzy"); } } { // root.settings.wikipedia_popups const scope = root.settings.wikipedia_popups; this.restrictObject(scope, "settings", "wikipedia_popups"); { // root.settings.wikipedia_popups.enabled const value = root.settings.wikipedia_popups.enabled; if (typeof value !== "boolean") this.reset("settings", "wikipedia_popups", "enabled"); } } { // root.settings.auto_welcome const scope = root.settings.auto_welcome; this.restrictObject(scope, "settings", "auto_welcome"); { // root.settings.auto_welcome.enabled const value = root.settings.auto_welcome.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_welcome", "enabled"); } } { // root.settings.talk_page_thanks_for_temporary_users const scope = root.settings.talk_page_thanks_for_temporary_users; this.restrictObject(scope, "settings", "talk_page_thanks_for_temporary_users"); { // root.settings.talk_page_thanks_for_temporary_users.enabled const value = root.settings.talk_page_thanks_for_temporary_users.enabled; if (typeof value !== "boolean") this.reset("settings", "talk_page_thanks_for_temporary_users", "enabled"); } } { // root.settings.expiry const scope = root.settings.expiry; this.restrictObject(scope, "settings", "expiry"); { // root.settings.expiry.watchlist const value = root.settings.expiry.watchlist; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "watchlist"); } { // root.settings.expiry.whitelist const scope = root.settings.expiry.whitelist; this.restrictObject(scope, "settings", "expiry", "whitelist"); { // root.settings.expiry.whitelist.users const value = root.settings.expiry.whitelist.users; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "whitelist", "users"); } { // root.settings.expiry.whitelist.pages const value = root.settings.expiry.whitelist.pages; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "whitelist", "pages"); } { // root.settings.expiry.whitelist.tags const value = root.settings.expiry.whitelist.tags; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "whitelist", "tags"); } } { // root.settings.expiry.highlight const scope = root.settings.expiry.highlight; this.restrictObject(scope, "settings", "expiry", "highlight"); { // root.settings.expiry.highlight.users const value = root.settings.expiry.highlight.users; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "highlight", "users"); } { // root.settings.expiry.highlight.pages const value = root.settings.expiry.highlight.pages; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "highlight", "pages"); } { // root.settings.expiry.highlight.tags const value = root.settings.expiry.highlight.tags; if (!_helpers.expiryRegex.test(value)) this.reset("settings", "expiry", "highlight", "tags"); } } } { // root.settings.auto_report const scope = root.settings.auto_report; this.restrictObject(scope, "settings", "auto_report"); { // root.settings.auto_report.enabled const value = root.settings.auto_report.enabled; if (typeof value !== "boolean") this.reset("settings", "auto_report", "enabled"); } { // root.settings.auto_report.for const value = root.settings.auto_report.for; if (!Array.isArray(value)) this.reset("settings", "auto_report", "for"); root.settings.auto_report.for = [ ...new Set(root.settings.auto_report.for) ].filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid auto-report reason [ ${v} ] from stored data.`); return valid; }); } } { // root.settings.AI const scope = root.settings.AI; this.restrictObject(scope, "settings", "AI"); { // root.settings.AI.enabled const value = root.settings.AI.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "enabled"); } { // root.settings.AI.provider const value = root.settings.AI.provider; if (value !== "Ollama") this.reset("settings", "AI", "provider"); } { // root.settings.AI.edit_analysis const scope = root.settings.AI.edit_analysis; this.restrictObject(scope, "settings", "AI", "edit_analysis"); { // root.settings.AI.edit_analysis.enabled const value = root.settings.AI.edit_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "edit_analysis", "enabled"); } } { // root.settings.AI.username_analysis const scope = root.settings.AI.username_analysis; this.restrictObject(scope, "settings", "AI", "username_analysis"); { // root.settings.AI.username_analysis.enabled const value = root.settings.AI.username_analysis.enabled; if (typeof value !== "boolean") this.reset("settings", "AI", "username_analysis", "enabled"); } } { // root.settings.AI.Ollama const scope = root.settings.AI.Ollama; this.restrictObject(scope, "settings", "AI", "Ollama"); { // root.settings.AI.Ollama.server const value = root.settings.AI.Ollama.server; if (!(0, _utility.isURL)(value)) this.reset("settings", "AI", "Ollama", "server"); } { // root.settings.AI.Ollama.model const value = root.settings.AI.Ollama.model; if (typeof value !== "string") this.reset("settings", "AI", "Ollama", "model"); } } } { // root.settings.audio const scope = root.settings.audio; this.restrictObject(scope, "settings", "audio"); { // root.settings.audio.ores_alert const scope = root.settings.audio.ores_alert; this.restrictObject(scope, "settings", "audio", "ores_alert"); { // root.settings.audio.ores_alert.enabled const value = root.settings.audio.ores_alert.enabled; if (typeof value !== "boolean") this.reset("settings", "audio", "ores_alert", "enabled"); } { // root.settings.audio.ores_alert.threshold const value = root.settings.audio.ores_alert.threshold; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "ores_alert", "threshold"); } } { // root.settings.audio.volume const scope = root.settings.audio.volume; this.restrictObject(scope, "settings", "audio", "volume"); const volumeKeys = [ "master", "master.startup", "master.music", "master.music.zen_mode", "master.ui", "master.ui.click", "master.queue", "master.queue.ores", "master.queue.mention", "master.notification", "master.notification.alert", "master.notification.message", "master.notification.toast", "master.action", "master.action.default", "master.action.failed", "master.action.report", "master.action.block", "master.action.protect" ]; for (const key of volumeKeys) { const value = root.settings.audio.volume[key]; if (!(typeof value === "number" && value >= 0 && value <= 1)) this.reset("settings", "audio", "volume", key); } } } { // root.settings.zen_mode const scope = root.settings.zen_mode; this.restrictObject(scope, "settings", "zen_mode"); { // root.settings.zen_mode.enabled const value = scope.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "enabled"); } { // root.settings.zen_mode.sound const scope = root.settings.zen_mode.sound; this.restrictObject(scope, "settings", "zen_mode", "sound"); { // root.settings.zen_mode.sound.enabled const value = root.settings.zen_mode.sound.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "sound", "enabled"); } } { // root.settings.zen_mode.music const scope = root.settings.zen_mode.music; this.restrictObject(scope, "settings", "zen_mode", "music"); { // root.settings.zen_mode.music.enabled const value = root.settings.zen_mode.music.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "music", "enabled"); } } { // root.settings.zen_mode.alerts const scope = root.settings.zen_mode.alerts; this.restrictObject(scope, "settings", "zen_mode", "alerts"); { // root.settings.zen_mode.alerts.enabled const value = root.settings.zen_mode.alerts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "alerts", "enabled"); } } { // root.settings.zen_mode.messages const scope = root.settings.zen_mode.messages; this.restrictObject(scope, "settings", "zen_mode", "messages"); { // root.settings.zen_mode.messages.enabled const value = root.settings.zen_mode.messages.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "messages", "enabled"); } } { // root.settings.zen_mode.toasts const scope = root.settings.zen_mode.toasts; this.restrictObject(scope, "settings", "zen_mode", "toasts"); { // root.settings.zen_mode.toasts.enabled const value = root.settings.zen_mode.toasts.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "toasts", "enabled"); } } { // root.settings.zen_mode.badges const scope = root.settings.zen_mode.badges; this.restrictObject(scope, "settings", "zen_mode", "badges"); { // root.settings.zen_mode.badges.enabled const value = root.settings.zen_mode.badges.enabled; if (typeof value !== "boolean") this.reset("settings", "zen_mode", "badges", "enabled"); } } } { // root.settings.accessibility const scope = root.settings.accessibility; this.restrictObject(scope, "settings", "accessibility"); { // root.settings.accessibility.colorblind const value = root.settings.accessibility.colorblind; if (typeof value !== "boolean") this.reset("settings", "accessibility", "colorblind"); } { // root.settings.accessibility.dyslexia const value = root.settings.accessibility.dyslexia; if (typeof value !== "boolean") this.reset("settings", "accessibility", "dyslexia"); } { // root.settings.accessibility.high_contrast const value = root.settings.accessibility.high_contrast; if (typeof value !== "boolean") this.reset("settings", "accessibility", "high_contrast"); } { // root.settings.accessibility.reduce_motion const value = root.settings.accessibility.reduce_motion; if (typeof value !== "boolean") this.reset("settings", "accessibility", "reduce_motion"); } } { // root.settings.repeat_control_scripts const value = root.settings.repeat_control_scripts; if (typeof value !== "boolean") this.reset("settings", "repeat_control_scripts"); } } { // root.UI const scope = root.UI; this.restrictObject(scope, "UI"); { // root.UI.theme const scope = root.UI.theme; this.restrictObject(scope, "UI", "theme"); { // root.UI.theme.app const value = root.UI.theme.app; if (![ "light", "dark", "auto" ].includes(value)) this.reset("UI", "theme", "app"); } { // root.UI.theme.palette const value = root.UI.theme.palette; if (!(value in _gui.GUI.palettes)) this.reset("UI", "theme", "palette"); } } { // root.UI.queue const scope = root.UI.queue; this.restrictObject(scope, "UI", "queue"); { // root.UI.queue.width const value = root.UI.queue.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "queue", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "queue", "width"); } } { // root.UI.details const scope = root.UI.details; this.restrictObject(scope, "UI", "details"); { // root.UI.details.width const value = root.UI.details.width; if (!(typeof value === "string" && value.endsWith("vw"))) this.reset("UI", "details", "width"); const numericPart = parseFloat(value.slice(0, -2)); if (!(typeof numericPart === "number" && !isNaN(numericPart) && numericPart >= 10 && numericPart <= 30)) this.reset("UI", "details", "width"); } } } { // root.control_scripts const scope = root.control_scripts; if (!Array.isArray(scope)) this.reset("control_scripts"); function sanitizeActions(actions, ...path) { return actions.filter((action, index) => { var _this$loadedLogger$wa; index = +index; if (!(0, _utility.isObject)(action)) return (_this$loadedLogger$wa = void this.loadedLogger.warn(`Removing invalid action at path [ ${[ ...path, index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa !== void 0 ? _this$loadedLogger$wa : false; if (action.name === "if" || action.name === "if not") { var _this$loadedLogger$wa2, _conditions$condition, _conditions$condition2, _conditions$condition3; const condition = action.condition; if (!(condition.name in _conditions.conditions)) return (_this$loadedLogger$wa2 = void this.loadedLogger.warn(`Removing invalid condition [ ${condition.name} ] at path [ ${[ ...path, index, "condition" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa2 !== void 0 ? _this$loadedLogger$wa2 : false; if (!Array.isArray(action.actions)) { this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[ ...path, index, "actions" ].join(" -> ")} ] in stored data.`); action.actions = []; } const references = (0, _scripts.sortDependencies)((_conditions$condition = (_conditions$condition2 = (_conditions$condition3 = _conditions.conditions[condition.name]).parameters) === null || _conditions$condition2 === void 0 ? void 0 : _conditions$condition2.call(_conditions$condition3)) !== null && _conditions$condition !== void 0 ? _conditions$condition : []); const validIds = new Set; for (const reference of references) { const dependencies = {}; for (const dependent of (_reference$dependenci = reference.dependencies) !== null && _reference$dependenci !== void 0 ? _reference$dependenci : []) { var _reference$dependenci; dependencies[dependent] = condition.params[dependent]; } const _default = typeof reference.default === "function" ? reference.default(dependencies) : reference.default; if (!(reference.id in condition.params)) if ("default" in reference) { this.loadedLogger.warn(`Resetting missing parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } validIds.add(reference.id); if (!("default" in reference)) continue; // optional if no default value switch (reference.type) { case "choice": { const options = typeof reference.options === "function" ? reference.options(dependencies) : reference.options; if (!options.includes(condition.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } } break; case "text": { if (typeof condition.params[reference.id] !== "string") { this.loadedLogger.warn(`Resetting invalid text parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } } break; case "boolean": { if (typeof condition.params[reference.id] !== "boolean") { this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } } break; case "number": { if (!(typeof condition.params[reference.id] === "number")) { this.loadedLogger.warn(`Resetting invalid number parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); condition.params[reference.id] = _default; } } } } for (const paramKey of Object.keys(condition.params)) if (!validIds.has(paramKey)) { this.loadedLogger.warn(`Removing invalid parameter [ ${paramKey} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] from stored data.`); delete condition.params[paramKey]; } action.actions = sanitizeActions.call(this, action.actions, ...path, index, "actions"); } else { var _this$loadedLogger$wa3, _events$action$name$p, _events$action$name$p2, _events$action$name; if (!(action.name in _events.events)) return (_this$loadedLogger$wa3 = void this.loadedLogger.warn(`Removing invalid action [ ${action.name} ] at path [ ${[ ...path, index, "name" ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa3 !== void 0 ? _this$loadedLogger$wa3 : false; if (!(0, _utility.isObject)(action.params)) { this.loadedLogger.warn(`Resetting invalid params object at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params = {}; } const references = (0, _scripts.sortDependencies)((_events$action$name$p = (_events$action$name$p2 = (_events$action$name = _events.events[action.name]).parameters) === null || _events$action$name$p2 === void 0 ? void 0 : _events$action$name$p2.call(_events$action$name)) !== null && _events$action$name$p !== void 0 ? _events$action$name$p : []); const validIds = new Set; for (const reference of references) { const dependencies = {}; for (const dependent of (_reference$dependenci2 = reference.dependencies) !== null && _reference$dependenci2 !== void 0 ? _reference$dependenci2 : []) { var _reference$dependenci2; dependencies[dependent] = action.params[dependent]; } const _default = typeof reference.default === "function" ? reference.default(dependencies) : reference.default; if (!(reference.id in action.params)) if ("default" in reference) { this.loadedLogger.warn(`Resetting missing parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } validIds.add(reference.id); if (!("default" in reference)) continue; // optional if no default value switch (reference.type) { case "choice": { const options = typeof reference.options === "function" ? reference.options(dependencies) : reference.options; if (!options.includes(action.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid choice parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } } break; case "text": { if (typeof action.params[reference.id] !== "string") { this.loadedLogger.warn(`Resetting invalid text parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } } break; case "boolean": { if (typeof action.params[reference.id] !== "boolean") { this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } } break; case "duration": { if (typeof action.params[reference.id] !== "string" || !_helpers.expiryRegex.test(action.params[reference.id])) { this.loadedLogger.warn(`Resetting invalid duration parameter [ ${reference.id} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] in stored data.`); action.params[reference.id] = _default; } } break; } } for (const paramKey of Object.keys(action.params)) if (!validIds.has(paramKey)) { this.loadedLogger.warn(`Removing invalid parameter [ ${paramKey} ] at path [ ${[ ...path, index, "params" ].join(" -> ")} ] from stored data.`); delete action.params[paramKey]; } } return true; }); } root.control_scripts = root.control_scripts.filter((scope, index) => { var _this$loadedLogger$wa4; index = +index; if (!(0, _utility.isObject)(scope)) return (_this$loadedLogger$wa4 = void this.loadedLogger.warn(`Removing invalid control script at path [ ${[ "control_scripts", index ].join(" -> ")} ] from stored data.`)) !== null && _this$loadedLogger$wa4 !== void 0 ? _this$loadedLogger$wa4 : false; if (!Array.isArray(scope.keys)) { this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].keys = []; } if (!Array.isArray(scope.actions)) { this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${index} ] in stored data.`); root.control_scripts[index].actions = []; } root.control_scripts[index].keys = scope.keys.filter(key => (0, _controlKeys.validateShortcut)(key)); root.control_scripts[index].actions = sanitizeActions.call(this, scope.actions, "control_scripts", index, "actions"); return true; }); } { // root.statistics const isValidStatistic = v => typeof v === "number" && Number.isInteger(v) && v >= 0; const scope = root.statistics; this.restrictObject(scope, "statistics"); { // root.statistics.edits_reviewed const scope = root.statistics.edits_reviewed; this.restrictObject(scope, "statistics", "edits_reviewed"); { // root.statistics.edits_reviewed.total const value = root.statistics.edits_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "total"); } { // root.statistics.edits_reviewed.thanked const value = root.statistics.edits_reviewed.thanked; if (!isValidStatistic(value)) this.reset("statistics", "edits_reviewed", "thanked"); } } { // root.statistics.recent_changes_reviewed const scope = root.statistics.recent_changes_reviewed; this.restrictObject(scope, "statistics", "recent_changes_reviewed"); { // root.statistics.recent_changes_reviewed.total const value = root.statistics.recent_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "recent_changes_reviewed", "total"); } } { // root.statistics.pending_changes_reviewed const scope = root.statistics.pending_changes_reviewed; this.restrictObject(scope, "statistics", "pending_changes_reviewed"); { // root.statistics.pending_changes_reviewed.total const value = root.statistics.pending_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "total"); } { // root.statistics.pending_changes_reviewed.accepted const value = root.statistics.pending_changes_reviewed.accepted; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "accepted"); } { // root.statistics.pending_changes_reviewed.rejected const value = root.statistics.pending_changes_reviewed.rejected; if (!isValidStatistic(value)) this.reset("statistics", "pending_changes_reviewed", "rejected"); } } { // root.statistics.watchlist_changes_reviewed const scope = root.statistics.watchlist_changes_reviewed; this.restrictObject(scope, "statistics", "watchlist_changes_reviewed"); { // root.statistics.watchlist_changes_reviewed.total const value = root.statistics.watchlist_changes_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "watchlist_changes_reviewed", "total"); } } { // root.statistics.users_reviewed const scope = root.statistics.users_reviewed; this.restrictObject(scope, "statistics", "users_reviewed"); { // root.statistics.users_reviewed.total const value = root.statistics.users_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_reviewed", "total"); } } { // root.statistics.abuselogs_reviewed const scope = root.statistics.abuselogs_reviewed; this.restrictObject(scope, "statistics", "abuselogs_reviewed"); { // root.statistics.abuselogs_reviewed.total const value = root.statistics.abuselogs_reviewed.total; if (!isValidStatistic(value)) this.reset("statistics", "abuselogs_reviewed", "total"); } } { // root.statistics.reverts_made const scope = root.statistics.reverts_made; this.restrictObject(scope, "statistics", "reverts_made"); { // root.statistics.reverts_made.total const value = root.statistics.reverts_made.total; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "total"); } { // root.statistics.reverts_made.good_faith const value = root.statistics.reverts_made.good_faith; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "good_faith"); } { // root.statistics.reverts_made.from_recent_changes const value = root.statistics.reverts_made.from_recent_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_recent_changes"); } { // root.statistics.reverts_made.from_pending_changes const value = root.statistics.reverts_made.from_pending_changes; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_pending_changes"); } { // root.statistics.reverts_made.from_watchlist const value = root.statistics.reverts_made.from_watchlist; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_watchlist"); } { // root.statistics.reverts_made.from_abuselogs const value = root.statistics.reverts_made.from_abuselogs; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_abuselogs"); } { // root.statistics.reverts_made.from_loaded_edits const value = root.statistics.reverts_made.from_loaded_edits; if (!isValidStatistic(value)) this.reset("statistics", "reverts_made", "from_loaded_edits"); } } { // root.statistics.users_welcomed const scope = root.statistics.users_welcomed; this.restrictObject(scope, "statistics", "users_welcomed"); { // root.statistics.users_welcomed.total const value = root.statistics.users_welcomed.total; if (!isValidStatistic(value)) this.reset("statistics", "users_welcomed", "total"); } } { // root.statistics.warnings_issued const scope = root.statistics.warnings_issued; this.restrictObject(scope, "statistics", "warnings_issued"); { // root.statistics.warnings_issued.total const value = root.statistics.warnings_issued.total; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "total"); } { // root.statistics.warnings_issued.level_1 const value = root.statistics.warnings_issued.level_1; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_1"); } { // root.statistics.warnings_issued.level_2 const value = root.statistics.warnings_issued.level_2; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_2"); } { // root.statistics.warnings_issued.level_3 const value = root.statistics.warnings_issued.level_3; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_3"); } { // root.statistics.warnings_issued.level_4 const value = root.statistics.warnings_issued.level_4; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4"); } { // root.statistics.warnings_issued.level_4im const value = root.statistics.warnings_issued.level_4im; if (!isValidStatistic(value)) this.reset("statistics", "warnings_issued", "level_4im"); } } { // root.statistics.reports_filed const scope = root.statistics.reports_filed; this.restrictObject(scope, "statistics", "reports_filed"); { // root.statistics.reports_filed.total const value = root.statistics.reports_filed.total; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "total"); } { // root.statistics.reports_filed.AIV const value = root.statistics.reports_filed.AIV; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "AIV"); } { // root.statistics.reports_filed.UAA const value = root.statistics.reports_filed.UAA; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "UAA"); } { // root.statistics.reports_filed.RFPP const value = root.statistics.reports_filed.RFPP; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "RFPP"); } { // root.statistics.reports_filed.global_blocks const value = root.statistics.reports_filed.global_blocks; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "global_blocks"); } { // root.statistics.reports_filed.global_locks const value = root.statistics.reports_filed.global_locks; if (!isValidStatistic(value)) this.reset("statistics", "reports_filed", "global_locks"); } } { // root.statistics.watchlist const scope = root.statistics.watchlist; this.restrictObject(scope, "statistics", "watchlist"); { // root.statistics.watchlist.watched const value = root.statistics.watchlist.watched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "watched"); } { // root.statistics.watchlist.unwatched const value = root.statistics.watchlist.unwatched; if (!isValidStatistic(value)) this.reset("statistics", "watchlist", "unwatched"); } } { // root.statistics.items_whitelisted const scope = root.statistics.items_whitelisted; this.restrictObject(scope, "statistics", "items_whitelisted"); { // root.statistics.items_whitelisted.total const value = root.statistics.items_whitelisted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "total"); } { // root.statistics.items_whitelisted.users const value = root.statistics.items_whitelisted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "users"); } { // root.statistics.items_whitelisted.pages const value = root.statistics.items_whitelisted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "pages"); } { // root.statistics.items_whitelisted.tags const value = root.statistics.items_whitelisted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_whitelisted", "tags"); } } { // root.statistics.items_highlighted const scope = root.statistics.items_highlighted; this.restrictObject(scope, "statistics", "items_highlighted"); { // root.statistics.items_highlighted.total const value = root.statistics.items_highlighted.total; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "total"); } { // root.statistics.items_highlighted.users const value = root.statistics.items_highlighted.users; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "users"); } { // root.statistics.items_highlighted.pages const value = root.statistics.items_highlighted.pages; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "pages"); } { // root.statistics.items_highlighted.tags const value = root.statistics.items_highlighted.tags; if (!isValidStatistic(value)) this.reset("statistics", "items_highlighted", "tags"); } } { // root.statistics.actions_executed const scope = root.statistics.actions_executed; this.restrictObject(scope, "statistics", "actions_executed"); { // root.statistics.actions_executed.total const value = root.statistics.actions_executed.total; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "total"); } { // root.statistics.actions_executed.successful const value = root.statistics.actions_executed.successful; if (!isValidStatistic(value)) this.reset("statistics", "actions_executed", "successful"); } } { // root.statistics.session_time const value = root.statistics.session_time; if (!(typeof value === "number" && value >= 0)) this.reset("statistics", "session_time"); } } const isValidExpiryMap = root => { // [ username, [ timestamp, timestamp ] ] if (!(Array.isArray(root) && root.length === 2)) return false; else if (typeof root[0] !== "string") return false; { const scope = root[1]; if (!(Array.isArray(scope) && scope.length === 2)) return false; const isTimestamp = v => typeof v === "number" && Number.isInteger(v) && v >= 0; if (!(isTimestamp(scope[0]) && isTimestamp(scope[1]))) return false; } return true; }; { // root.highlight const scope = root.highlight; this.restrictObject(scope, "highlight"); { // root.highlight.users const value = root.highlight.users; if (!Array.isArray(value)) this.reset("highlight", "users"); root.highlight.users = root.highlight.users.filter(v => isValidExpiryMap(v)); } { // root.highlight.pages const value = root.highlight.pages; if (!Array.isArray(value)) this.reset("highlight", "pages"); root.highlight.pages = root.highlight.pages.filter(v => isValidExpiryMap(v)); } { // root.highlight.tags const value = root.highlight.tags; if (!Array.isArray(value)) this.reset("highlight", "tags"); root.highlight.tags = root.highlight.tags.filter(v => isValidExpiryMap(v)); } } { // root.whitelist const scope = root.whitelist; this.restrictObject(scope, "whitelist"); { // root.whitelist.users const value = root.whitelist.users; if (!Array.isArray(value)) this.reset("whitelist", "users"); root.whitelist.users = root.whitelist.users.filter(v => isValidExpiryMap(v)); } { // root.whitelist.pages const value = root.whitelist.pages; if (!Array.isArray(value)) this.reset("whitelist", "pages"); root.whitelist.pages = root.whitelist.pages.filter(v => isValidExpiryMap(v)); } { // root.whitelist.tags const value = root.whitelist.tags; if (!Array.isArray(value)) this.reset("whitelist", "tags"); root.whitelist.tags = root.whitelist.tags.filter(v => isValidExpiryMap(v)); } } { // root.favorite const scope = root.favorite; this.restrictObject(scope, "favorite"); { // root.favorite.warnings const value = root.favorite.warnings; if (!Array.isArray(value)) this.reset("favorite", "warnings"); root.favorite.warnings = root.favorite.warnings.filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid favorite warning [ ${v} ] from stored data.`); return valid; }); } { // root.favorite.reverts const value = root.favorite.reverts; if (!Array.isArray(value)) { this.reset("favorite", "reverts"); } root.favorite.reverts = root.favorite.reverts.filter(v => { const valid = v in _warnings.warningsLookup; if (!valid) this.loadedLogger.warn(`Removing invalid favorite revert [ ${v} ] from stored data.`); return valid; }); } } return true; } static construct() { var _this$loadedLogger$er2; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er2 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er2 !== void 0 ? _this$loadedLogger$er2 : false; root.settings.auto_report.for = new Set(root.settings.auto_report.for); root.highlight.users = new Map(root.highlight.users); root.highlight.pages = new Map(root.highlight.pages); root.highlight.tags = new Map(root.highlight.tags); root.whitelist.users = new Map(root.whitelist.users); root.whitelist.pages = new Map(root.whitelist.pages); root.whitelist.tags = new Map(root.whitelist.tags); return root; } static deconstruct() { var _this$loadedLogger$er3; const root = this.loadedData; if ((root === null || root === void 0 ? void 0 : root.version) !== this.number) return (_this$loadedLogger$er3 = void this.loadedLogger.error(`Stored data version ${root === null || root === void 0 ? void 0 : root.version} does not match expected version ${this.number}.`)) !== null && _this$loadedLogger$er3 !== void 0 ? _this$loadedLogger$er3 : false; root.settings.auto_report.for = [ ...root.settings.auto_report.for ]; root.highlight.users = [ ...root.highlight.users ]; root.highlight.pages = [ ...root.highlight.pages ]; root.highlight.tags = [ ...root.highlight.tags ]; root.whitelist.users = [ ...root.whitelist.users ]; root.whitelist.pages = [ ...root.whitelist.pages ]; root.whitelist.tags = [ ...root.whitelist.tags ]; const data = structuredClone(root); // stuctureClone is safe since we have to use JSON for storage anyway this.construct(); // reconstruct to restore Maps and Sets return data; } }, _defineProperty(_V, "number", 3), _V); /***/ }, /***/ 955(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.getWarningFromLookup = getWarningFromLookup; exports.warningsLookup = exports.warnings = exports.warningTemplateColors = void 0; // Warning templates and colors const warningTemplateColors = exports.warningTemplateColors = { 0: "grey", 1: "#4169e1", 2: "#ff8c00", 3: "#ff4500", 4: "#b22222", "4im": "#000000" }; const defaultAuto = { 0: "1", 1: "2", 2: "3", 3: "4", 4: "report", "4im": "report" }; const warnings = exports.warnings = { Vandalism: { title: "Vandalism", icon: "fas fa-skull-crossbones", description: "Warnings for different types of vandalism.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Vandalism", name: "vandalism", icon: "fas fa-skull-crossbones", description: "Warning for general vandalism.", summary: "vandalism", auto: defaultAuto, templates: [ { name: "1", template: "uw-vandalism1" }, { name: "2", template: "uw-vandalism2" }, { name: "3", template: "uw-vandalism3" }, { name: "4", template: "uw-vandalism4" }, { name: "4im", template: "uw-vandalism4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Subtle vandalism", name: "subtle vandalism", icon: "fas fa-user-secret", description: "Warning for subtle vandalism.", summary: "subtle vandalism", auto: defaultAuto, templates: [ { name: "1", template: "uw-subtle1" }, { name: "2", template: "uw-subtle2" }, { name: "3", template: "uw-subtle3" }, { name: "4", template: "uw-subtle4" } ] }, { reportable: true, queueType: [ "edit" ], title: "Image vandalism", name: "image vandalism", icon: "fas fa-image", description: "Warning for image vandalism.", summary: "image vandalism", auto: defaultAuto, templates: [ { name: "1", template: "uw-image1" }, { name: "2", template: "uw-image2" }, { name: "3", template: "uw-image3" }, { name: "4", template: "uw-image4" }, { name: "4im", template: "uw-image4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Sandbox", name: "[[WP:BADSAND|inappropriate]] sandbox use", icon: "fas fa-vial", description: "Warning for vandalism, libelous, or defamatory content added to sandbox", summary: "[[WP:BADSAND|inappropriate]] sandbox use", auto: defaultAuto, templates: [ { name: "1", template: "uw-sandbox1" }, { name: "2", template: "uw-sandbox2" }, { name: "3", template: "uw-sandbox3" }, { name: "4", template: "uw-sandbox4" }, { name: "4im", template: "uw-sandbox4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Deliberate errors", name: "deliberate errors", icon: "fas fa-bug", description: "Adding deliberate errors to articles.", summary: "deliberate errors", auto: defaultAuto, templates: [ { name: "1", template: "uw-error1" }, { name: "2", template: "uw-error2" }, { name: "3", template: "uw-error3" }, { name: "4", template: "uw-error4" } ] } ] }, Disruption: { title: "Disruption", icon: "fas fa-exclamation", description: "Warnings for different types of disruptive behavior.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Disruptive editing", name: "[[WP:DE|disruptive editing]]", icon: "fas fa-exclamation", description: "Default warning for making disruptive edits but may be good faith.", summary: "[[WP:DE|disruptive editing]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-disruptive1" }, { name: "2", template: "uw-disruptive2" }, { name: "3", template: "uw-disruptive3" }, { name: "4", template: "uw-generic4", generic: "''Disruptive editing. ([[WP:WikiShield|WS]])''" } ] }, { reportable: true, queueType: [ "edit" ], title: "Editing tests", name: "editing tests", icon: "fas fa-flask", description: "Making test edits on live articles.", summary: "test edits", auto: defaultAuto, templates: [ { name: "1", template: "uw-test1" }, { name: "2", template: "uw-test2" }, { name: "3", template: "uw-test3" }, { name: "4", template: "uw-generic4", generic: "''Test edits. ([[WP:WikiShield|WS]])''" } ] }, { reportable: true, queueType: [ "edit" ], title: "Commentary", name: "commentary", icon: "fas fa-comment-alt", description: "Adding opinion or commentary to articles.", summary: "commentary / talking in article", auto: defaultAuto, templates: [ { name: "1", template: "uw-talkinarticle1" }, { name: "2", template: "uw-talkinarticle2" }, { name: "3", template: "uw-talkinarticle3" }, { name: "4", template: "uw-generic4", generic: "''Adding commentary to articles. ([[WP:WikiShield|WS]])''" } ] }, { reportable: true, queueType: [ "edit" ], title: "Inappropriate jokes", name: "inappropriate humor", icon: "fas fa-grin-squint", description: "Adding inappropriate humor to an article.", summary: "inappropriate humor", auto: defaultAuto, templates: [ { name: "1", template: "uw-joke1" }, { name: "2", template: "uw-joke2" }, { name: "3", template: "uw-joke3" }, { name: "4", template: "uw-joke4" }, { name: "4im", template: "uw-joke4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Deleting", name: "unexplained deletion", icon: "fas fa-trash", description: "Used when a user does not explain deletion of part of an article.", summary: "unexplained deletion", auto: defaultAuto, templates: [ { name: "1", template: "uw-delete1" }, { name: "2", template: "uw-delete2" }, { name: "3", template: "uw-delete3" }, { name: "4", template: "uw-delete4" }, { name: "4im", template: "uw-delete4im" } ] } ] }, "Content Issues": { title: "Content Issues", icon: "fas fa-file-alt", description: "Warnings for different types of content issues.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Unsourced", name: "unsourced changes", icon: "fas fa-question", description: "Warning for unsourced content.", summary: "unsourced changes", auto: defaultAuto, templates: [ { name: "1", template: "uw-unsourced1" }, { name: "2", template: "uw-unsourced2" }, { name: "3", template: "uw-unsourced3" }, { name: "4", template: "uw-unsourced4" } ] }, { reportable: true, queueType: [ "edit" ], title: "Unsourced (BLP)", name: "unsourced [[WP:BLP|biographies of living persons']] changes", icon: "fas fa-person-circle-question", description: "Warning for unsourced BLP content.", summary: "unsourced [[WP:BLP|biographies of living persons']] changes", auto: defaultAuto, templates: [ { name: "1", template: "uw-biog1" }, { name: "2", template: "uw-biog2" }, { name: "3", template: "uw-biog3" }, { name: "4", template: "uw-biog4" }, { name: "4im", template: "uw-biog4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Unsourced genre", name: "unsourced genre changes", icon: "fas fa-music", description: "Warning for unsourced genre changes.", summary: "unsourced genre changes", auto: defaultAuto, templates: [ { name: "1", template: "uw-genre1" }, { name: "2", template: "uw-genre2" }, { name: "3", template: "uw-genre3" }, { name: "4", template: "uw-genre4" } ] }, { reportable: true, queueType: [ "edit" ], title: "Original research", name: "[[WP:OR|original research]]", icon: "fas fa-lightbulb", description: "Adding original research or synthesis.", summary: "[[WP:OR|original research]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-nor1" }, { name: "2", template: "uw-nor2" }, { name: "3", template: "uw-nor3" }, { name: "4", template: "uw-nor4" } ] }, { reportable: true, queueType: [ "edit" ], title: "POV", name: "[[WP:NPOV|non-neutral changes]]", icon: "fas fa-balance-scale-left", description: "Adding content which violates the neutral point of view policy.", summary: "[[WP:NPOV|non-neutral changes]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-npov1" }, { name: "2", template: "uw-npov2" }, { name: "3", template: "uw-npov3" }, { name: "4", template: "uw-npov4" } ] }, { reportable: true, queueType: [ "edit" ], title: "Censoring", name: "[[WP:NOTCENSORED|censoring content]]", icon: "fas fa-ban", description: "Censoring topically-relevant content.", summary: "[[WP:NOTCENSORED|censoring content]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-notcensored1" }, { name: "2", template: "uw-notcensored2" }, { name: "3", template: "uw-notcensored3" }, { name: "4", template: "uw-notcensored4" } ] }, { reportable: true, queueType: [ "edit" ], title: "AI-generated", name: "[[WP:LLM|AI-generated content]]", icon: "fas fa-robot", description: "Adding AI-generated content.", summary: "[[WP:LLM|AI-generated content]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-ai1" }, { name: "2", template: "uw-ai2" }, { name: "3", template: "uw-ai3" }, { name: "4", template: "uw-ai4" } ], show(edit) { var _edit$page; return (edit === null || edit === void 0 || (_edit$page = edit.page) === null || _edit$page === void 0 ? void 0 : _edit$page.namespace) % 2 === 0; } }, { reportable: true, queueType: [ "edit" ], title: "AI-generated (talk)", name: "[[WP:LLM|AI-generated content]] in a discussion", icon: "fas fa-robot", description: "Writing an AI-generated comment.", summary: "[[WP:LLM|AI-generated content]] in a discussion", auto: defaultAuto, templates: [ { name: "1", template: "uw-aitalk1" }, { name: "2", template: "uw-aitalk2" }, { name: "3", template: "uw-aitalk3" }, { name: "4", template: "uw-aitalk4" } ], show(edit) { var _edit$page2; return (edit === null || edit === void 0 || (_edit$page2 = edit.page) === null || _edit$page2 === void 0 ? void 0 : _edit$page2.namespace) % 2 === 1; } }, { reportable: true, queueType: [ "edit" ], title: "MOS violation", name: "[[WP:MOS|manual of style]] violation", icon: "fas fa-spell-check", description: "Not following the Manual of Style.", summary: "[[WP:MOS|manual of style]] violation", auto: defaultAuto, templates: [ { name: "1", template: "uw-mos1" }, { name: "2", template: "uw-mos2" }, { name: "3", template: "uw-mos3" }, { name: "4", template: "uw-mos4" } ] }, { reportable: false, queueType: [ "edit" ], title: "English variant", name: "[[WP:ENGVAR|different English variant]]", icon: "fas fa-globe", description: "Content added in a different English variant than the rest of the article.", summary: "[[WP:ENGVAR|different English variant]]", auto: "notice", templates: [ { name: "notice", template: "uw-engvar" } ] }, { reportable: false, queueType: [ "edit" ], title: "Not English", name: "non-English content", icon: "fas fa-language", description: "Content added in a language other than English.", summary: "non-English content", auto: "notice", templates: [ { name: "notice", template: "uw-lang-noteng" } ] } ] }, Conduct: { title: "Conduct", icon: "fas fa-user-shield", description: "Warnings for different types of conduct issues.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Personal attacks", name: "[[WP:NPA|personal attacks]]", icon: "fas fa-bomb", description: "Personal attacks towards another user.", summary: "[[WP:NPA|personal attacks]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-npa1" }, { name: "2", template: "uw-npa2" }, { name: "3", template: "uw-npa3" }, { name: "4", template: "uw-npa4" }, { name: "4im", template: "uw-npa4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Harassment", name: "[[WP:HARASS|harassment]]", icon: "fas fa-shield-alt", description: "Harassment of another user.", summary: "[[WP:HARASS|harassment]] of another user", auto: defaultAuto, templates: [ { name: "1", template: "uw-harass1" }, { name: "2", template: "uw-harass2" }, { name: "3", template: "uw-harass3" }, { name: "4", template: "uw-harass4" }, { name: "4im", template: "uw-harass4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "TPO", name: "[[WP:TPO|removing or editing]] others' posts", icon: "fas fa-hand-paper", description: "Removing or editing others' posts.", summary: "[[WP:TPO|removing or editing]] others' posts", auto: defaultAuto, templates: [ { name: "1", template: "uw-tpo1" }, { name: "2", template: "uw-tpo2" }, { name: "3", template: "uw-tpo3" }, { name: "4", template: "uw-tpo4" }, { name: "4im", template: "uw-tpo4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Chatting", name: "inappropriate use of article talk pages", icon: "fas fa-comments", description: "Using article talk pages for inappropriate discussion.", summary: "inappropriate use of article talk pages", auto: defaultAuto, templates: [ { name: "1", template: "uw-chat1" }, { name: "2", template: "uw-chat2" }, { name: "3", template: "uw-chat3" }, { name: "4", template: "uw-chat4" } ], show(edit) { var _edit$page3; return (edit === null || edit === void 0 || (_edit$page3 = edit.page) === null || _edit$page3 === void 0 ? void 0 : _edit$page3.namespace) % 2 === 1; } }, { reportable: true, queueType: [ "edit" ], title: "Owning", name: "assuming [[WP:OWN|ownership of articles]]", icon: "fas fa-user-shield", description: "Assuming ownership of articles.", summary: "assuming [[WP:OWN|ownership of articles]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-own1" }, { name: "2", template: "uw-own2" }, { name: "3", template: "uw-own3" }, { name: "4", template: "uw-own4" } ] }, { reportable: true, queueType: [ "edit" ], title: "AfD removal", name: "removing AfD templates or comments", icon: "fas fa-gavel", description: "Removing AfD templates or other users' comments from AfD discussions.", summary: "removing AfD templates or comments", auto: defaultAuto, templates: [ { name: "1", template: "uw-afd1" }, { name: "2", template: "uw-afd2" }, { name: "3", template: "uw-afd3" }, { name: "4", template: "uw-afd4" } ] }, { reportable: false, queueType: [ "edit" ], title: "Edit warring", name: "[[WP:EW|edit warring]]", icon: "fas fa-jet-fighter", description: "Engaging in edit warring.", summary: "[[WP:EW|edit warring]]", auto(edit) { var _edit$user; return +(edit === null || edit === void 0 || (_edit$user = edit.user) === null || _edit$user === void 0 ? void 0 : _edit$user.edits) < 500 ? "notice" : "warning"; }, templates: [ { name: "notice", template: "uw-ew-soft", color: "grey" }, { name: "warning", template: "uw-ew", color: "#ff4500" } ] }, { reportable: true, queueType: [ "edit" ], title: "Gaming the system", name: "[[WP:GAME|gaming the system]]", icon: "fas fa-chess-knight", description: "Attempting to game Wikipedia's policies or guidelines.", summary: "[[WP:GAME|gaming the system]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-gaming1" }, { name: "2", template: "uw-gaming2" }, { name: "3", template: "uw-gaming3" }, { name: "4", template: "uw-gaming4" }, { name: "4im", template: "uw-gaming4im" } ] } ] }, Promotional: { title: "Promotional", icon: "fas fa-bullhorn", description: "Warnings for promotional content.", warnings: [ { reportable: true, queueType: [ "edit" ], title: "Advertising", name: "[[WP:PROMO|advertising or promotion]]", icon: "fas fa-ad", description: "Adding advertising or promotional content.", summary: "[[WP:PROMO|advertising or promotion]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-advert1" }, { name: "2", template: "uw-advert2" }, { name: "3", template: "uw-advert3" }, { name: "4", template: "uw-advert4" }, { name: "4im", template: "uw-advert4im" } ] }, { reportable: true, queueType: [ "edit" ], title: "Spam links", name: "adding [[WP:ELNO|inappropriate links]]", icon: "fas fa-link", description: "Adding spam or promotional links.", summary: "adding [[WP:ELNO|inappropriate links]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-spam1" }, { name: "2", template: "uw-spam2" }, { name: "3", template: "uw-spam3" }, { name: "4", template: "uw-spam4" }, { name: "4im", template: "uw-spam4im" } ] }, { reportable: false, queueType: [ "edit" ], title: "COI Edit", name: "editing with a [[WP:COI|conflict of interest]]", icon: "fas fa-user-tie", description: "Editing with a conflict of interest.", summary: "editing with a [[WP:COI|conflict of interest]]", auto: "notice", templates: [ { name: "notice", template: "uw-coi" }, { name: "warning", template: "uw-coi-warn" }, { name: "username", template: "uw-coi-username" } ] }, { reportable: false, queueType: [ "logevent" ], title: "COI Log", name: "apparent [[WP:COI|conflict of interest]]", icon: "fas fa-user-tie", description: "Apparent conflict of interest.", summary: "apparent [[WP:COI|conflict of interest]]", auto: "username", templates: [ { name: "username", template: "uw-coi-username" } ] } ] }, "Abuse Log": { title: "Abuse Log", icon: "fas fa-shield-virus", description: "Warnings for triggering edit filters.", warnings: [ { reportable: true, queueType: [ "abuselog" ], title: "Attempt", name: "triggering an edit filter", icon: "fas fa-vial", description: "Triggering an edit filter.", auto: defaultAuto, templates: [ { name: "1", template: "uw-attempt1" }, { name: "2", template: "uw-attempt2" }, { name: "3", template: "uw-attempt3" }, { name: "4", template: "uw-attempt4" }, { name: "4im", template: "uw-attempt4im" } ], show(edit) { return !Boolean(edit === null || edit === void 0 ? void 0 : edit.revid); } } ] }, "Edit Summary": { title: "Edit Summary", icon: "fas fa-pen-alt", description: "Warnings for inappropriate edit summaries.", warnings: [ { reportable: false, queueType: [ "edit" ], title: "No edit summary", name: "no [[WP:ES|edit summary]] provided", icon: "fas fa-pen-nib", description: "Making an edit without providing an edit summary.", summary: "no [[WP:ES|edit summary]] provided", auto(edit) { var _edit$user2; return +(edit === null || edit === void 0 || (_edit$user2 = edit.user) === null || _edit$user2 === void 0 ? void 0 : _edit$user2.edits) < 500 ? "newcomer" : "experienced"; }, templates: [ { name: "notice", template: "uw-es" }, { name: "experienced", template: "uw-es2" } ] }, { reportable: true, queueType: [ "edit", "logevent", "abuselog" ], title: "Inappropriate edit summary", name: "inappropriate [[WP:ES|edit summary]]", icon: "fas fa-pen-alt", description: "Using an inappropriate edit summary.", summary: "inappropriate [[WP:ES|edit summary]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-bes1" }, { name: "2", template: "uw-bes2" }, { name: "3", template: "uw-bes3" }, { name: "4", template: "uw-bes4" }, { name: "4im", template: "uw-bes4im" } ] }, { reportable: true, queueType: [ "edit", "logevent", "abuselog" ], title: "Misleading edit summary", name: "misleading [[WP:ES|edit summary]]", icon: "fas fa-mask", description: "Using a misleading edit summary.", summary: "misleading [[WP:ES|edit summary]]", auto: defaultAuto, templates: [ { name: "1", template: "uw-mislead1" }, { name: "2", template: "uw-mislead2" }, { name: "3", template: "uw-mislead3" }, { name: "4", template: "uw-generic4", generic: "''Misleading edit summary. ([[WP:WikiShield|WS]])''" } ] }, { reportable: false, queueType: [ "edit", "abuselog" ], title: "Minor edit abuse", name: "improper use of [[WP:ME|minor edit]] checkbox", icon: "fas fa-minus", description: "Non-minor edit marked as minor", summary: "improper use of [[WP:ME|minor edit]] checkbox", auto: "notice", templates: [ { name: "notice", template: "uw-minor" } ] } ] } }; const lookup = {}; for (const [type, category] of Object.entries(warnings)) { const len = category.warnings.length; for (let i = 0; i < len; i++) { const warning = category.warnings[i]; lookup[warning.title] = warning; } } const warningsLookup = exports.warningsLookup = lookup; function getWarningFromLookup(title) { return warningsLookup[title]; } /***/ }, /***/ 863(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.welcomes = void 0; const welcomes = exports.welcomes = { Auto: { title: "Auto", template: user => {} }, Default: { title: "Default", template: "Welcome", sign: true }, Basic: { title: "Basic", template: "W-basic", sign: false }, "Non-Latin": { title: "Non-Latin", template: "Welcome-non-latin", sign: true }, "Vandalism fighter": { title: "Vandalism fighter", template: "Welcome-vandalism fighter", sign: false }, Personal: { title: "Personal", template: "Welcome-personal", sign: true }, Cookie: { title: "Cookie", template: "Welcome cookie", sign: true }, Kitten: { title: "Kitten", template: "Welcome kitten", sign: false }, Graphical: { title: "Graphical", template: "W-graphical", sign: false }, Screen: { title: "Screen", template: "W-screen", sign: false }, Autobiography: { title: "Autobiography", template: "Welcome-auto", sign: true }, COI: { title: "COI", template: "Welcome-COI", sign: true } }; welcomes["Auto"].template = user => { if (!welcomes["Non-Latin"].hide && /[^\u0000-\u007F]/.test(user.name)) { return "Non-Latin"; } return "Default"; }; /***/ }, /***/ 4153(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _api = __webpack_require__(/*! ./web-port/api.js */ 8878); if (window.electron === undefined) { window.isElectron = false; window.electron = { mwapiLoader: async () => { window.dispatchEvent(new CustomEvent("mwapi-loaded", { detail: { server: window.location.host, username: mw.user.getName(), pendingChangesServers: _api.MediaWikiAPI.pendingChangesServers, dev: false } })); }, mwapiLoaded: callback => window.addEventListener("mwapi-loaded", event => { const {server, username, pendingChangesServers, dev} = event.detail; callback(server, username, pendingChangesServers, dev); }), mwapi: () => Promise.reject(new Error("Not running in Electron environment")), menuEnabler: () => {}, setBadgeCount: () => {}, sendNotification: () => Promise.reject(new Error("Not running in Electron environment")), localStorage: { get: key => localStorage.getItem(key), set: (key, value) => localStorage.setItem(key, value), delete: key => localStorage.removeItem(key) }, copyToClipboard: async text => { if (navigator.clipboard && navigator.clipboard.writeText) await navigator.clipboard.writeText(text); else { const $textarea = document.createElement("textarea"); $textarea.value = text; document.body.appendChild($textarea); $textarea.select(); document.execCommand("copy"); document.body.removeChild($textarea); } return; }, log: message => console.debug(message), info: message => console.info(message), warn: message => console.warn(message), error: message => console.error(message), errorbox: (message, detail) => alert(`${message}\n\n${detail}`), closePopup: popup => popup.close(), openExternal: url => window.open(url, "_blank"), openInBrowser: async url => { const w = window.screen.availWidth * .8, h = window.screen.availHeight * .8; const x = window.screenX + (window.outerWidth - w) / 2, y = window.screenY + (window.outerHeight - h) / 2; const popup = window.open(url, "myPopup", `width=${w},height=${h},left=${x},top=${y},resizable=false,scrollbars=true,menubar=false,toolbar=false,location=false,status=false`); popup.focus(); popup.addEventListener("beforeunload", () => { if (popup.closed) window.dispatchEvent(new CustomEvent("popup-closed", { detail: popup })); }); return popup; }, onPopupClosed: callback => window.addEventListener("popup-closed", event => callback(event.detail)), onBeforeunload: () => {}, unloaded: () => {}, saveAccount: () => {}, disable: (title, message) => { alert(`${title}\n\n${message}`); location.reload(); } }; } else window.isElectron = true; document.querySelectorAll("[data-electron]").forEach($el => { if ($el.dataset.electron === "false" && window.isElectron) $el.remove(); else if ($el.dataset.electron === "true" && !window.isElectron) $el.remove(); }); /***/ }, /***/ 7411() { function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class DraggableOrderList extends HTMLElement { constructor() { super(); _defineProperty(this, "handleDragStart", (index, e) => { this.draggedIndex = index; this.placeholderIndex = index; e.dataTransfer.effectAllowed = "move"; e.dataTransfer.setData("text/plain", index); // Add a slight delay to allow the drag image to be captured requestAnimationFrame(() => { this.updateDragState(); }); }); _defineProperty(this, "handleDragOver", (index, e) => { e.preventDefault(); if (this.draggedIndex === null || index === this.placeholderIndex) return; // Reorder items in real-time const newItems = [ ...this.items ]; const draggedItem = newItems[this.draggedIndex]; // Remove from old position newItems.splice(this.draggedIndex, 1); // Insert at new position newItems.splice(index, 0, draggedItem); this.items = newItems; this.draggedIndex = index; this.placeholderIndex = index; this.render(); }); _defineProperty(this, "handleDragEnd", () => { // Notify parent of the final order this.dispatchEvent(new CustomEvent("reorder", { detail: { keys: this.items.map(item => item.key) }, bubbles: true })); this.draggedIndex = null; this.placeholderIndex = null; this.updateDragState(); }); this.items = []; this.draggedIndex = null; this.placeholderIndex = null; this.itemWrappers = []; } connectedCallback() { this.className = "draggable-order-list"; this.syncItemsFromChildren(); } syncItemsFromChildren() { const children = Array.from(this.children); this.items = children.map((child, i) => ({ child, key: child.dataset.key || child.getAttribute("key") || i })); this.render(); } addItem(element, key) { this.items.push({ child: element, key: key || this.items.length }); this.render(); } clearItems() { this.items = []; this.render(); } updateDragState() { const isDragging = this.draggedIndex !== null; this.classList.toggle("is-dragging", isDragging); this.itemWrappers.forEach((wrapper, index) => { wrapper.classList.toggle("dragging", this.draggedIndex === index); }); } render() { this.innerHTML = ""; this.itemWrappers = []; this.items.forEach((item, index) => { const wrapper = document.createElement("div"); wrapper.className = "draggable-order-item-wrapper"; wrapper.draggable = true; wrapper.dataset.key = item.key; wrapper.addEventListener("dragstart", e => this.handleDragStart(index, e)); wrapper.addEventListener("dragover", e => this.handleDragOver(index, e)); wrapper.addEventListener("dragend", this.handleDragEnd); wrapper.appendChild(item.child.cloneNode ? item.child.cloneNode(true) : item.child); this.appendChild(wrapper); this.itemWrappers.push(wrapper); }); this.updateDragState(); } } class DraggableOrderItem extends HTMLElement { static get observedAttributes() { return [ "name", "enabled" ]; } constructor() { super(); _defineProperty(this, "handleToggle", e => { e.stopPropagation(); this._enabled = !this._enabled; this.updateEnabledState(); this.dispatchEvent(new CustomEvent("toggle", { detail: { enabled: this._enabled }, bubbles: true })); }); this._name = ""; this._enabled = true; } connectedCallback() { this.render(); } attributeChangedCallback(name, oldValue, newValue) { if (oldValue === newValue) return; switch (name) { case "name": this._name = newValue || ""; if (this.nameSpan) { this.nameSpan.textContent = this._name; } break; case "enabled": this._enabled = newValue !== "false" && newValue !== "0"; this.updateEnabledState(); break; } } get name() { return this._name; } set name(val) { this.setAttribute("name", val); } get enabled() { return this._enabled; } set enabled(val) { this.setAttribute("enabled", val); } updateEnabledState() { this.classList.toggle("disabled", !this._enabled); if (this.toggle) { this.toggle.title = this._enabled ? "Click to disable" : "Click to enable"; } } render() { this.className = "draggable-order-item"; this.innerHTML = ""; this.nameSpan = document.createElement("span"); this.nameSpan.className = "draggable-order-item-name"; this.nameSpan.textContent = this._name; this.toggle = document.createElement("div"); this.toggle.className = "draggable-order-item-toggle"; this.toggle.addEventListener("click", this.handleToggle); this.appendChild(this.nameSpan); this.appendChild(this.toggle); this.updateEnabledState(); } } customElements.define("draggable-order-list", DraggableOrderList); customElements.define("draggable-order-item", DraggableOrderItem); /***/ }, /***/ 7732(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { var _helpers = __webpack_require__(3241); class DurationInput extends HTMLElement { constructor() { super(); this.duration = { years: 0, months: 0, weeks: 0, days: 0, hours: 0, minutes: 0, seconds: 0 }; this.isInfinite = false; } connectedCallback() { this.render(); this.attachEventListeners(); } render() { const units = [ { key: "years", label: "Years" }, { key: "months", label: "Months" }, { key: "weeks", label: "Weeks" }, { key: "days", label: "Days" }, { key: "hours", label: "Hours" }, { key: "minutes", label: "Minutes" }, { key: "seconds", label: "Seconds" } ]; this.innerHTML = `\n <label class="infinity-label">\n <span>Infinite Duration</span>\n </label>\n <div class="duration-inputs">\n ${units.map(unit => `\n <label>\n <span>${unit.label}</span>\n <input\n type="number"\n min="0"\n data-unit="${unit.key}"\n value="0"\n step="1"\n placeholder="0"\n />\n </label>\n `).join("")}\n </div>\n `; } attachEventListeners() { const $infinity = this.querySelector(".infinity-label"); // Toggle infinite duration $infinity.addEventListener("click", () => { this.isInfinite = !this.isInfinite; $infinity.classList.toggle("selected", this.isInfinite); this.dispatchChangeEvent(); }); // Handle duration input changes this.querySelectorAll('input[type="number"]').forEach(input => { input.addEventListener("input", event => { const unit = event.target.dataset.unit; this.duration[unit] = parseInt(event.target.value, 10) || 0; this.dispatchChangeEvent(); }); }); } dispatchChangeEvent() { this.dispatchEvent(new CustomEvent("change", { detail: this.getDurationString(), bubbles: true })); } get value() { return this.getDurationString(); } getDurationString() { if (this.isInfinite) { return "infinite"; } let durationStr = ""; const unitMap = { years: "Y", months: "M", weeks: "W", days: "D", hours: "H", minutes: "M", seconds: "S" }; for (const [unit, value] of Object.entries(this.duration)) { if (value > 0) { durationStr += `${value}${unitMap[unit]}`; } } return durationStr || "0S"; } set value(durationStr) { // Handle infinite duration if (durationStr === "infinite" || durationStr === "infinity" || durationStr === "∞") { this.isInfinite = true; const $infinity = this.querySelector(".infinity-label"); if ($infinity) { $infinity.classList.add("selected"); } return; } // Reset infinite state this.isInfinite = false; const $infinity = this.querySelector(".infinity-label"); if ($infinity) { $infinity.classList.remove("selected"); } // Parse duration string const match = _helpers.expiryRegex.exec(durationStr); if (match) { for (const unit of Object.keys(this.duration)) { const value = match.groups[unit]; this.duration[unit] = value ? parseInt(value, 10) : 0; const input = this.querySelector(`input[data-unit="${unit}"]`); if (input) { input.value = this.duration[unit]; } } } } } customElements.define("duration-input", DurationInput); /***/ }, /***/ 1914(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { __webpack_require__(7732); __webpack_require__(2784); __webpack_require__(5155); __webpack_require__(7411); __webpack_require__(1731); /***/ }, /***/ 5155(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.NumericInput = void 0; function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class NumericInput extends HTMLElement { static get observedAttributes() { return [ "value", "min", "max", "step" ]; } constructor() { super(); _defineProperty(this, "handleMinus", () => { const currentValue = Number(this.inputValue); const newValue = Math.round(Math.max(currentValue - this.step, this.min) * 100) / 100; this.updateValue(newValue); }); _defineProperty(this, "handlePlus", () => { const currentValue = Number(this.inputValue); const newValue = Math.round(Math.min(currentValue + this.step, this.max) * 100) / 100; this.updateValue(newValue); }); _defineProperty(this, "handleInputChange", () => { const inputVal = this.input.value; if (isNaN(Number(inputVal))) { this.input.value = this.inputValue; return; } let newValue = Math.round(Math.min(Math.max(Number(inputVal), this.min), this.max) * 100) / 100; newValue = this.step >= 1 ? Math.round(newValue) : newValue; this.updateValue(newValue); }); _defineProperty(this, "handleKeyUp", e => { if (e.key.toLowerCase() === "enter") { this.handleInputChange(); e.target.blur(); } }); _defineProperty(this, "handleInput", e => { this.inputValue = e.target.value; }); this.inputValue = 0; this._min = -Infinity; this._max = Infinity; this._step = 1; } connectedCallback() { this.render(); this.setupEventListeners(); } attributeChangedCallback(name, oldValue, newValue) { if (oldValue === newValue) return; switch (name) { case "value": this.inputValue = Number(newValue) || 0; if (this.input) { this.input.value = this.inputValue; } break; case "min": this._min = Number(newValue !== null && newValue !== void 0 ? newValue : -Infinity); break; case "max": this._max = Number(newValue !== null && newValue !== void 0 ? newValue : Infinity); break; case "step": this._step = Number(newValue !== null && newValue !== void 0 ? newValue : 1); break; } } get value() { return this.inputValue; } set value(val) { this.setAttribute("value", val); } get min() { return this._min; } get max() { return this._max; } get step() { return this._step; } updateValue(newValue) { this.inputValue = newValue; this.input.value = newValue; this.dispatchEvent(new CustomEvent("change", { detail: { value: newValue }, bubbles: true })); } setupEventListeners() { this.minusBtn.addEventListener("click", this.handleMinus); this.plusBtn.addEventListener("click", this.handlePlus); this.input.addEventListener("input", this.handleInput); this.input.addEventListener("blur", this.handleInputChange); this.input.addEventListener("keyup", this.handleKeyUp); this.input.addEventListener("wheel", e => { e.preventDefault(); if (e.deltaY < 0) this.handlePlus(); else if (e.deltaY > 0) this.handleMinus(); }); } render() { this.className = "numeric-input-container"; this.minusBtn = document.createElement("span"); this.minusBtn.className = "fa fa-minus numeric-input-button"; this.input = document.createElement("input"); this.input.type = "text"; this.input.className = "numeric-input"; this.input.value = this.inputValue; this.input.autocomplete = "off"; this.plusBtn = document.createElement("span"); this.plusBtn.className = "fa fa-plus numeric-input-button"; this.appendChild(this.minusBtn); this.appendChild(this.input); this.appendChild(this.plusBtn); } } exports.NumericInput = NumericInput; customElements.define("numeric-input", NumericInput); /***/ }, /***/ 2784() { function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class ToggleInput extends HTMLElement { static get observedAttributes() { return [ "value", "checked" ]; } constructor() { super(); _defineProperty(this, "handleClick", () => { this._value = !this._value; this.updateState(); this.dispatchEvent(new CustomEvent("change", { detail: { value: this._value, checked: this._value }, bubbles: true })); }); this._value = false; } connectedCallback() { this.render(); this.updateState(); } attributeChangedCallback(name, oldValue, newValue) { if (oldValue === newValue) return; if (name === "value" || name === "checked") { this._value = newValue === "true" || newValue === "1" || newValue === ""; this.updateState(); } } get value() { return this._value; } set value(val) { this._value = !!val; this.setAttribute("value", this._value); this.updateState(); } get checked() { return this._value; } set checked(val) { this.value = val; } updateState() { this.classList.toggle("active", this._value); } render() { this.classList.add("settings-toggle"); this.innerHTML = ""; const toggleSwitch = document.createElement("div"); toggleSwitch.className = "toggle-switch"; const toggleSlider = document.createElement("div"); toggleSlider.className = "toggle-slider"; toggleSwitch.appendChild(toggleSlider); this.appendChild(toggleSwitch); this.addEventListener("click", this.handleClick); } } customElements.define("toggle-input", ToggleInput); /***/ }, /***/ 1731() { function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class VolumeControl extends HTMLElement { static get observedAttributes() { return [ "title", "description", "value" ]; } constructor() { super(); _defineProperty(this, "handleVolumeChange", e => { const newValue = Math.max(0, Math.min(1, parseFloat(e.target.value))); this._value = newValue; this.slider.value = newValue; this.input.value = newValue.toFixed(2); this.dispatchEvent(new CustomEvent("change", { detail: { value: newValue }, bubbles: true })); }); this._title = ""; this._description = ""; this._value = .5; this._sound = ""; this._preview = null; } connectedCallback() { this.render(); } attributeChangedCallback(name, oldValue, newValue) { if (oldValue === newValue) return; switch (name) { case "title": this._title = newValue || ""; if (this.titleEl) this.titleEl.textContent = this._title; break; case "description": this._description = newValue || ""; if (this.descEl) this.descEl.textContent = this._description; break; case "value": this._value = Math.max(0, Math.min(1, parseFloat(newValue))); if (this.slider) this.slider.value = this._value; if (this.input) this.input.value = this._value.toFixed(2); break; } } get title() { return this._title; } set title(val) { this.setAttribute("title", val); } get value() { return this._value; } set value(val) { this.setAttribute("value", val); } setPreview(audio, path) { this._preview = { audio, path }; this.render(); } render() { this.className = "volume-control"; this.innerHTML = ""; // Header const header = document.createElement("div"); header.className = "volume-control-header"; const info = document.createElement("div"); info.className = "volume-control-info"; this.titleEl = document.createElement("div"); this.titleEl.className = "volume-control-title"; this.titleEl.textContent = this._title; this.descEl = document.createElement("div"); this.descEl.className = "volume-control-desc"; this.descEl.textContent = this._description; info.appendChild(this.titleEl); info.appendChild(this.descEl); header.appendChild(info); if (this._preview) { const $preview = document.createElement("button"); $preview.className = "volume-control-preview"; $preview.title = "Preview sound"; $preview.addEventListener("click", () => { if ($preview.classList.contains("playing")) return; $preview.classList.add("playing"); const $icon = $preview.querySelector("i"); if ($icon) $icon.className = "fa fa-stop"; const controller = new AbortController; $preview.onclick = () => controller.abort(); this._preview.audio.stopPreviews(); this._preview.audio.playSound(this._preview.path, controller.signal, true).finally(() => { $preview.onclick = null; $preview.classList.remove("playing"); if ($icon) $icon.className = "fa fa-play"; }); }); const playIcon = document.createElement("i"); playIcon.className = "fa fa-play"; $preview.appendChild(playIcon); header.appendChild($preview); } this.appendChild(header); const sliderContainer = document.createElement("div"); sliderContainer.className = "volume-control-slider-container"; this.slider = document.createElement("input"); this.slider.type = "range"; this.slider.className = "volume-control-slider"; this.slider.min = "0"; this.slider.max = "1"; this.slider.step = "0.01"; this.slider.value = this._value; this.slider.autocomplete = "off"; this.slider.addEventListener("input", this.handleVolumeChange); sliderContainer.appendChild(this.slider); this.input = document.createElement("input"); this.input.type = "number"; this.input.className = "volume-control-input"; this.input.min = "0"; this.input.max = "1"; this.input.step = "0.01"; this.input.value = this._value.toFixed(2); this.input.autocomplete = "off"; this.input.addEventListener("input", this.handleVolumeChange); sliderContainer.appendChild(this.input); this.appendChild(sliderContainer); } } customElements.define("volume-control", VolumeControl); /***/ }, /***/ 8816(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.run = run; __webpack_require__(4153); __webpack_require__(1914); var _wikishield = __webpack_require__(7054); var _manager2 = __webpack_require__(9501); var _killswitch = __webpack_require__(691); function run() { addEventListener("wheel", event => { if (event.target.closest(".no-scroll")) return; if (event.target.tagName === "INPUT" && event.target.type === "number") { event.stopPropagation(); event.target.value = Number(event.target.value) + (event.deltaY < 0 ? 1 : -1); event.target.dispatchEvent(new Event("input")); } }, { passive: true }); electron.menuEnabler(); electron.mwapiLoaded(async (server, username, pendingChangesServers, dev) => { if (_manager2.StorageManager.okay(null, electron)) { var _await$fetch$then$the; document.querySelector("#rollback-needed .request-link").href = (_await$fetch$then$the = await fetch("https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q7765871&props=sitelinks/urls&format=json&origin=*").then(res => res.json()).then(data => { var _Object$values$find; return ((_Object$values$find = Object.values(data.entities.Q7765871.sitelinks).find(sitelink => sitelink.url.startsWith(`https://${server}/wiki/`))) === null || _Object$values$find === void 0 ? void 0 : _Object$values$find.url) || null; }).catch(() => null)) !== null && _await$fetch$then$the !== void 0 ? _await$fetch$then$the : "https://www.wikidata.org/wiki/Q7765871"; const ws = new _wikishield.WikiShield(server, username, pendingChangesServers, dev); electron.onOpenBrowser(() => ws.open(null, false)); electron.onOpenUrl(url => ws.open(url, false)); electron.onOpenNotification(link => { const url = new URL(link); if (url.searchParams.has("markasread")) { const n = ws.notifications.find(null, +url.searchParams.get("markasread")); if (n) ws.notifications.read(n.type, n.notification); } ws.open(link); }); electron.menuEnabler({ browser: true }); ws.on("ready", () => { electron.onBeforeunload(async () => { await ws.save(); electron.unloaded(); }); window.addEventListener("beforeunload", async () => await ws.save()); // TODO make this more robust const killswitch = new _killswitch.Killswitch(ws); killswitch.on("kill", () => { alert("WikiShield has been temporarily disabled. Please contact the development team for more information."); window.close(); }); killswitch.on("force-update", () => { alert("The current version of WikiShield is no longer supported. Please update to the latest version to continue using WikiShield."); window.close(); }); killswitch.on("update", () => { electron.sendNotification({ title: "WikiShield Update", body: "A new version of WikiShield is available. Please update to the latest version for the best experience." }, ""); }); killswitch.on("unsafe", () => { alert("Could not verify the integrity of WikiShield. Make sure you are connected to the internet. If the problem persists, please contact the development team."); window.close(); }); killswitch.on("okay", async () => { addEventListener("keydown", event => ws.controller(event)); addEventListener("keyup", event => ws.controller(event)); await ws.init(); }, { once: true }); killswitch.check().then(() => killswitch.monitor(10 * 1e3)); }, { once: true }); } else { alert("An error has occurred with the WikiShield storage system that could lead to data loss. For that reason, WikiShield has been automatically disabled. Please report this immediately to the development team."); window.close(); } }); electron.mwapiLoader().catch(err => { alert(`An error occurred while loading the WikiShield API:\n\n${err.stack || err}`); window.close(); }); } if (window.isElectron) run(); /***/ }, /***/ 317(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.AutoScroll = AutoScroll; const TPS = 60, SPT = 1 / TPS; // Ticks per second, seconds per tick async function SmoothScroll($el, delta, time, callback = () => true) { if (delta === 0) return Promise.resolve([ 0, 0 ]); const start = $el.scrollLeft, end = start + delta; const deadline = performance.now() + time; let resolve; const promise = new Promise(res => resolve = res); const scroll = () => { const now = performance.now(); const pos = start + Math.min(1, (now - (deadline - time)) / time) * delta; if (now >= deadline) { $el.scrollLeft = end; resolve([ 0, 0 ]); } else if (!callback($el, pos)) resolve([ delta - pos + start, Math.max(0, deadline - now) ]); else { $el.scrollLeft = pos; requestAnimationFrame(scroll); } }; requestAnimationFrame(scroll); return promise; } function AutoScroll() { document.querySelectorAll(".auto-scroll").forEach($auto => { if (!$auto.dataset.autoScrollInitialized) { $auto.parentElement.addEventListener("wheel", event => { $auto.dataset.autoScrollFreeze = 750; $auto.dataset.autoScrollLastTime = performance.now(); let offset = parseFloat($auto.dataset.autoScrollOffset) || 0; const x = Math.abs(event.deltaX), y = Math.abs(event.deltaY), z = Math.abs(event.deltaZ), delta = x + y + z; if (delta === 0) return; let direction; switch (Math.max(x, y, z)) { case x: direction = Math.sign(event.deltaX); break; case y: direction = Math.sign(event.deltaY); break; case z: direction = Math.sign(event.deltaZ); break; } offset += direction * delta; $auto.dataset.autoScrollOffset = offset; }, { passive: true }); $auto.dataset.autoScrollInitialized = true; } let offset = parseFloat($auto.dataset.autoScrollOffset) || 0; if ("autoScrollFreeze" in $auto.dataset) { const start = parseFloat($auto.dataset.autoScrollLastTime) || performance.now(), end = performance.now(); offset += end - start; $auto.dataset.autoScrollOffset = offset; $auto.dataset.autoScrollLastTime = end; const freeze = parseFloat($auto.dataset.autoScrollFreeze); if (freeze > 0) $auto.dataset.autoScrollFreeze = freeze - end + start; else { delete $auto.dataset.autoScrollFreeze; delete $auto.dataset.autoScrollLastTime; } } const speed = parseFloat($auto.dataset.autoScrollSpeed) || 1; let carry = parseFloat($auto.dataset.autoScrollCarry) || 0; carry += speed; const delta = Math.floor(carry); $auto.dataset.autoScrollCarry = (carry - delta).toString(); let scrolls = $auto.querySelectorAll(":scope > .auto-scroll-item").length; if (scrolls === 0) { const content = $auto.innerHTML; $auto.innerHTML = ""; const $scroll = document.createElement("span"); $scroll.className = "auto-scroll-item"; $scroll.innerHTML = content; $auto.appendChild($scroll); scrolls = 1; } const $scroll = $auto.querySelector(":scope > .auto-scroll-item"); const cs = getComputedStyle($scroll); const textWidth = $scroll.clientWidth + (parseFloat(cs.marginLeft) || 0) + (parseFloat(cs.marginRight) || 0); const containerWidth = $auto.clientWidth; if (textWidth < containerWidth) return void $auto.querySelectorAll(":scope > .auto-scroll-item:not(:first-child)").forEach($el => $el.remove()); const min = Math.ceil(containerWidth / textWidth) + 1; const n = min - scrolls; if (n > 0) for (let i = 0; i < n; i++) { const $clone = $scroll.cloneNode(true); const $parent = $scroll.parentNode; $parent.insertBefore($clone, $scroll.nextSibling); } else if (n < 0) { const $extra = $auto.querySelectorAll(":scope > .auto-scroll-item"); for (let i = 0; i < -n; i++) { var _$extra$i; (_$extra$i = $extra[i]) === null || _$extra$i === void 0 || _$extra$i.remove(); } } const pos = (performance.now() - offset) / 1e3 * TPS * speed % textWidth; $auto.scrollLeft = pos; const scroll = ($el, delta, time) => { SmoothScroll($el, delta, time, ($el, pos) => { var _$el$scrollLeft; const len = textWidth; if (pos >= len) return (_$el$scrollLeft = void ($el.scrollLeft = pos % len)) !== null && _$el$scrollLeft !== void 0 ? _$el$scrollLeft : false; return true; }).then(([rDelta, rTime]) => { if (rDelta > 0) scroll($el, rDelta, rTime); }); }; if (speed > 0) scroll($auto, delta, SPT * 1e3); }); } /***/ }, /***/ 4784(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Dialog = void 0; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _Dialog_brand = new WeakSet; class Dialog { constructor(ws) { _classPrivateMethodInitSpec(this, _Dialog_brand); this.ws = ws; this.dialogs = { processing: false, active: null, queue: [] }; this.popups = []; addEventListener("focus", () => { if (this.popups.length > 0) { this.popups.forEach(popupId => electron.closePopup(popupId)); this.popups = []; requestAnimationFrame(() => { var _document$querySelect; if (this.popups.length === 0) (_document$querySelect = document.querySelector("#popup-blocker")) === null || _document$querySelect === void 0 || _document$querySelect.remove(); }); } }); electron.onPopupClosed(popupId => { const index = this.popups.indexOf(popupId); if (index !== -1) this.popups.splice(index, 1); if (this.popups.length === 0) requestAnimationFrame(() => { var _document$querySelect2; if (this.popups.length === 0) (_document$querySelect2 = document.querySelector("#popup-blocker")) === null || _document$querySelect2 === void 0 || _document$querySelect2.remove(); }); }); } controller(event) {} check() { if (this.popups.length === 0) return requestAnimationFrame(() => { var _document$querySelect3; if (this.popups.length === 0) (_document$querySelect3 = document.querySelector("#popup-blocker")) === null || _document$querySelect3 === void 0 || _document$querySelect3.remove(); }); requestAnimationFrame(() => this.check()); } toast(title, message, type = "default", duration = 5e3) { const zen = this.ws.store.settings.zen_mode; if (zen.enabled && !zen.toasts.enabled) return false; const $toast = document.createElement("div"); $toast.classList.add("toast-alert", type); const $icon = document.createElement("div"); $icon.classList.add("toast-icon"); $toast.appendChild($icon); const $i = document.createElement("i"); $i.classList.add("fa"); $icon.appendChild($i); switch (type) { case "success": { $i.classList.add("fa-check"); } break; case "warning": { $i.classList.add("fa-exclamation-triangle"); } break; case "error": { $i.classList.add("fa-xmark"); } break; default: { $i.classList.add("fa-info-circle"); } break; } const $content = document.createElement("div"); $content.classList.add("toast-content"); $toast.appendChild($content); const $title = document.createElement("div"); $title.classList.add("toast-title"); $title.textContent = title; $content.appendChild($title); const $message = document.createElement("div"); $message.classList.add("toast-message"); $message.textContent = message; $content.appendChild($message); const $close = document.createElement("div"); $close.classList.add("toast-close"); $close.addEventListener("click", () => { _assertClassBrand(_Dialog_brand, this, _hideToast).call(this, $toast); }); $toast.appendChild($close); const $closeIcon = document.createElement("i"); $closeIcon.classList.add("fa", "fa-xmark"); $close.appendChild($closeIcon); document.body.querySelector("#app").appendChild($toast); setTimeout(() => { this.ws.audio.playSound([ "notification", "toast" ]); $toast.classList.add("show"); }, 10); if (duration > 0) setTimeout(() => _assertClassBrand(_Dialog_brand, this, _hideToast).call(this, $toast), duration); return true; } input(title, message, placeholder = "", defaultValue = "", child = false) { return _assertClassBrand(_Dialog_brand, this, _enqueue).call(this, () => _assertClassBrand(_Dialog_brand, this, _input).call(this, title, message, placeholder, defaultValue), child); } UAA(username, child = false) { return _assertClassBrand(_Dialog_brand, this, _enqueue).call(this, () => _assertClassBrand(_Dialog_brand, this, _UAA).call(this, username), child); } confirm(title, message, username = null, hideUAA = false, child = false) { return _assertClassBrand(_Dialog_brand, this, _enqueue).call(this, () => _assertClassBrand(_Dialog_brand, this, _confirm).call(this, title, message, username, hideUAA), child); } show(title, message) { return _assertClassBrand(_Dialog_brand, this, _enqueue).call(this, () => _assertClassBrand(_Dialog_brand, this, _show).call(this, title, message)); } } exports.Dialog = Dialog; function _hideToast($toast) { if (!($toast !== null && $toast !== void 0 && $toast.parentElement)) return; $toast.classList.add("hidden"); setTimeout(() => { if ($toast.parentElement) $toast.remove(); }, 300); } async function _process() { if (this.dialogs.processing || this.dialogs.queue.length === 0) return; this.dialogs.processing = true; const {fn, resolve, reject} = this.dialogs.queue.shift(); try { this.dialogs.active = true; const result = await fn(); this.dialogs.active = null; resolve(result); } catch (e) { this.dialogs.active = null; reject(e); } finally { this.dialogs.processing = false; requestAnimationFrame(() => _assertClassBrand(_Dialog_brand, this, _process).call(this)); } } function _enqueue(fn, child = false) { return new Promise((resolve, reject) => { if (child && this.dialogs.active) return void fn().then(resolve).catch(reject); this.dialogs.queue.push({ fn, child, resolve, reject }); _assertClassBrand(_Dialog_brand, this, _process).call(this); }); } function _input(title, message, placeholder = "", defaultValue = "") { return new Promise(resolve => { const $overlay = document.createElement("div"); $overlay.classList.add("confirmation-modal-overlay"); document.body.querySelector("#app").appendChild($overlay); const $modal = document.createElement("div"); $modal.classList.add("confirmation-modal"); $overlay.appendChild($modal); const $header = document.createElement("div"); $header.classList.add("confirmation-modal-header"); $modal.appendChild($header); const $title = document.createElement("div"); $title.classList.add("confirmation-modal-title"); $title.textContent = title; $header.appendChild($title); const $body = document.createElement("div"); $body.classList.add("confirmation-modal-body"); $body.innerHTML = message; $modal.appendChild($body); const $input = document.createElement("input"); $input.type = "text"; $input.classList.add("confirmation-modal-input"); $input.placeholder = placeholder; $input.value = defaultValue; $body.appendChild($input); $input.focus(); $input.select(); const $footer = document.createElement("div"); $footer.classList.add("confirmation-modal-footer"); $modal.appendChild($footer); const $cancel = document.createElement("button"); $cancel.classList.add("confirmation-modal-button", "confirmation-modal-button-cancel"); $cancel.style.setProperty("--background", "211, 51, 51"); $cancel.textContent = "Cancel"; $footer.appendChild($cancel); const $submit = document.createElement("button"); $submit.classList.add("confirmation-modal-button", "confirmation-modal-button-submit"); $submit.style.setProperty("--background", "51, 153, 211"); $submit.textContent = "Submit"; $footer.appendChild($submit); const closeModal = result => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $modal.classList.add("closing"); setTimeout(() => { $overlay.remove(); resolve(result); }, 200); }; const keyHandler = event => { if (event.key === "Enter") { event.preventDefault(); event.stopPropagation(); closeModal($input.value); return false; } else if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); closeModal(null); return false; } else if (event.key !== "Tab") { if (event.target.tagName === "INPUT") return; event.preventDefault(); event.stopPropagation(); return false; } }; document.addEventListener("keydown", keyHandler, true); $cancel.addEventListener("click", () => closeModal(null)); $submit.addEventListener("click", () => closeModal($input.value)); $overlay.addEventListener("click", e => { if (e.target === $overlay) closeModal(null); }); }); } function _UAA(username) { return new Promise(resolve => { const closeModal = result => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $modal.classList.add("closing"); setTimeout(() => { $overlay.remove(); resolve(result); }, 200); }; const keyHandler = event => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); closeModal(null); return false; } else if (event.key !== "Tab") { if (event.target.tagName === "INPUT") return; event.preventDefault(); event.stopPropagation(); return false; } }; document.addEventListener("keydown", keyHandler, true); const $overlay = document.createElement("div"); $overlay.classList.add("confirmation-modal-overlay"); document.body.querySelector("#app").appendChild($overlay); const $modal = document.createElement("div"); $modal.classList.add("confirmation-modal"); $overlay.appendChild($modal); const $header = document.createElement("div"); $header.classList.add("confirmation-modal-header"); $modal.appendChild($header); const $title = document.createElement("div"); $title.classList.add("confirmation-modal-title"); $title.textContent = "Report to UAA"; $header.appendChild($title); const $body = document.createElement("div"); $body.classList.add("confirmation-modal-body"); $body.innerHTML = "Select reason for reporting <span class='confirmation-modal-username'></span> to UAA:"; $modal.appendChild($body); $body.querySelector(".confirmation-modal-username").textContent = username; const $footer = document.createElement("div"); $footer.classList.add("confirmation-modal-footer", "confirmation-modal-footer-vertical"); $modal.appendChild($footer); [ "Disruptive", "Offensive", "Promotional", "Misleading" ].forEach(reason => { const text = `${reason} username`; const $button = document.createElement("button"); $button.classList.add("confirmation-modal-button", "confirmation-modal-button-reason"); $button.textContent = text; $button.addEventListener("click", () => closeModal(text)); $footer.appendChild($button); }); const $cancel = document.createElement("button"); $cancel.classList.add("confirmation-modal-button", "confirmation-modal-button-cancel"); $cancel.style.setProperty("--background", "211, 51, 51"); $cancel.textContent = "Cancel"; $cancel.addEventListener("click", () => closeModal(null)); $footer.appendChild($cancel); $overlay.addEventListener("click", event => { if (event.target === $overlay) closeModal(null); }); }); } function _confirm(title, message, username = null, hideUAA = false) { return new Promise(resolve => { const closeModal = result => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $modal.classList.add("closing"); setTimeout(() => { $overlay.remove(); resolve(result); }, 200); }; const keyHandler = event => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); closeModal(null); return false; } else if (event.key !== "Tab") { if (event.target.tagName === "INPUT") return; event.preventDefault(); event.stopPropagation(); return false; } }; document.addEventListener("keydown", keyHandler, true); const $overlay = document.createElement("div"); $overlay.classList.add("confirmation-modal-overlay"); document.body.querySelector("#app").appendChild($overlay); const $modal = document.createElement("div"); $modal.classList.add("confirmation-modal"); $overlay.appendChild($modal); const $header = document.createElement("div"); $header.classList.add("confirmation-modal-header"); $modal.appendChild($header); const $title = document.createElement("div"); $title.classList.add("confirmation-modal-title"); $title.textContent = title; $header.appendChild($title); const $body = document.createElement("div"); $body.classList.add("confirmation-modal-body"); $body.innerHTML = message; $modal.appendChild($body); const $footer = document.createElement("div"); $footer.classList.add("confirmation-modal-footer"); $modal.appendChild($footer); if (username && !hideUAA) { const $uaa = document.createElement("button"); $uaa.classList.add("confirmation-modal-button", "confirmation-modal-button-uaa"); $uaa.style.setProperty("--background", "211, 51, 51"); $uaa.textContent = "Report to UAA"; $footer.appendChild($uaa); $uaa.addEventListener("click", () => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $modal.classList.add("closing"); setTimeout(async () => { $overlay.remove(); const reason = await this.UAA(username, true); if (reason) this.ws.execute({ name: "reportToUAA", params: { reportMessage: reason } }, undefined, undefined, { user: { name: username } }); // fake edit object else resolve(await this.confirm(title, message, username, false, true)); }, 200); }); } const $right = document.createElement("div"); $right.classList.add("confirmation-modal-footer-right"); $footer.appendChild($right); const $no = document.createElement("button"); $no.classList.add("confirmation-modal-button", "confirmation-modal-button-no"); $no.textContent = "No"; $no.addEventListener("click", () => closeModal(false)); $right.appendChild($no); const $yes = document.createElement("button"); $yes.classList.add("confirmation-modal-button", "confirmation-modal-button-yes"); $yes.style.setProperty("--background", "51, 102, 204"); $yes.textContent = "Yes"; $yes.addEventListener("click", () => closeModal(true)); $right.appendChild($yes); $overlay.addEventListener("click", e => { if (e.target === $overlay) closeModal(null); }); requestAnimationFrame(() => $yes.focus()); }); } function _show(title, message) { return new Promise(async resolve => { const $overlay = document.createElement("div"); $overlay.classList.add("confirmation-modal-overlay"); document.body.querySelector("#app").appendChild($overlay); const $dialog = document.createElement("div"); $dialog.classList.add("confirmation-modal"); $overlay.appendChild($dialog); const $header = document.createElement("div"); $header.classList.add("confirmation-modal-header"); $header.textContent = title; $dialog.appendChild($header); const $content = document.createElement("div"); $content.classList.add("confirmation-modal-body"); $content.innerHTML = `<div class="dialog-loading">\n <div class="dialog-spinner"></div>\n <div class="dialog-loading-text">Loading...</div>\n </div>`; $dialog.appendChild($content); const closeModal = () => { document.removeEventListener("keydown", keyHandler, true); $overlay.classList.add("closing"); $dialog.classList.add("closing"); setTimeout(() => { $overlay.remove(); resolve(); }, 200); }; const keyHandler = event => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); closeModal(); return false; } }; document.addEventListener("keydown", keyHandler, true); $overlay.addEventListener("click", e => { if (e.target === $overlay) closeModal(); }); if (message instanceof Promise) message.then(resolvedMessage => { if ($content) $content.innerHTML = resolvedMessage; }).catch(() => { if ($content) $content.innerHTML = "Failed to load content"; }); else $content.innerHTML = message; }); } /***/ }, /***/ 8469(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.GUI = void 0; var _scriptEsm = __webpack_require__(4192); var _scriptEsm2 = __webpack_require__(4041); var _wikishield = __webpack_require__(7054); var _text = __webpack_require__(2069); var _dialog = __webpack_require__(4784); var _eventManager = __webpack_require__(8921); var _settings = __webpack_require__(9117); var _queue = __webpack_require__(372); var _warnings = __webpack_require__(955); var _buildPalette = __webpack_require__(7698); var _autoScroll = __webpack_require__(317); function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _GUI_brand = new WeakSet; class GUI { constructor(ws) { _classPrivateMethodInitSpec(this, _GUI_brand); this.ws = ws; this.dialog = new _dialog.Dialog(this.ws); this.events = new _eventManager.EventManager(this.ws); this.settings = new _settings.Settings(this.ws); this.intervals = { DEFCON: null, outdated: null }; this.controllers = { current: null }; } async build() { this.updateDEFCON(); document.documentElement.style.colorScheme = { light: "only light", auto: "light dark", dark: "only dark" }[this.ws.store.UI.theme.app] || "light dark"; const shhhhh = { code: [ "ArrowUp", "ArrowUp", "ArrowDown", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowLeft", "ArrowRight", "b", "a" ], index: 0, function: event => { if (event.key === shhhhh.code[shhhhh.index]) { if (++shhhhh.index === shhhhh.code.length) { shhhhh.index = 0; this.ws.open("https://ws.luni.me/konami-easter-egg", "force"); } return; } shhhhh.index = event.key === shhhhh.code[0] ? 1 : 0; } }; addEventListener("keydown", shhhhh.function); this.updateAccessibility(); document.querySelector("#initial").classList.remove("hidden"); document.querySelectorAll(".VERSION").forEach(elem => elem.textContent = _wikishield.WikiShield.config.version); if (Math.random() < .01) document.querySelector("#wikishield-sikiwhield").textContent = "SikiWhield"; const controller = new AbortController; let resolve; const promise = new Promise(r => resolve = r); this.ws.audio.playSound([ "startup" ], controller.signal, false, () => resolve()); await promise; let animationFrame; const startupPerformance = this.ws.store.settings.performance.startup; if (startupPerformance !== "always_off") { const paper = document.getElementById("dots-canvas"); const pen = paper.getContext("2d"); const DPR = Math.min(devicePixelRatio || 1, 2); class Dot { constructor() { _defineProperty(this, "radius", 2); this.x = Math.random() * paper.width; this.y = Math.random() * paper.height; this.vx = (Math.random() - .5) * .5; this.vy = (Math.random() - .5) * .5; this.color = Dot.colors[Math.random() * Dot.colors.length | 0]; this.fill = `rgba(${this.color}, 0.8)`; this.shadow = `rgba(${this.color}, 0.8)`; } update() { this.x += this.vx; this.y += this.vy; if (this.x < 0) this.x = paper.width; else if (this.x > paper.width) this.x = 0; if (this.y < 0) this.y = paper.height; else if (this.y > paper.height) this.y = 0; } draw() { pen.beginPath(); pen.arc(this.x, this.y, this.radius, 0, Math.PI * 2); pen.fillStyle = this.fill; pen.fill(); } } _defineProperty(Dot, "dots", []); _defineProperty(Dot, "target", 0); _defineProperty(Dot, "colors", [ "102, 126, 234", // Blue "240, 147, 251", // Pink "118, 75, 162", // Purple "217, 70, 239" ]); let resizeRAF = null; const resizeCanvas = () => { if (resizeRAF) return; resizeRAF = requestAnimationFrame(() => { resizeRAF = null; const oldWidth = paper.width; const oldHeight = paper.height; paper.width = Math.floor(innerWidth * DPR); paper.height = Math.floor(innerHeight * DPR); paper.style.width = `${innerWidth}px`; paper.style.height = `${innerHeight}px`; pen.setTransform(1, 0, 0, 1, 0, 0); pen.scale(DPR, DPR); const scaleX = paper.width / (oldWidth || paper.width); const scaleY = paper.height / (oldHeight || paper.height); Dot.dots.forEach(dot => { dot.x *= scaleX; dot.y *= scaleY; }); Dot.target = Math.floor(innerWidth * innerHeight / 7e3); Dot.target = Math.max(40, Math.min(250, Dot.target)); if (Dot.target > Dot.dots.length) for (let i = Dot.dots.length; i < Dot.target; i++) Dot.dots.push(new Dot); else if (Dot.target < Dot.dots.length) Dot.dots.length = Dot.target; }); }; resizeCanvas(); addEventListener("resize", resizeCanvas); const GRID_SIZE = 160; const LOW_FPS_THRESHOLD = 30; const LOW_FPS_DURATION_MS = 500; let lowFPSStart = null; let lastTimestamp = performance.now(); const lastDeltaTimes = new Array(15).fill(1e3 / 60); const animate = () => { { const now = performance.now(); const deltaTime = now - lastTimestamp; lastTimestamp = now; lastDeltaTimes.shift(); lastDeltaTimes.push(deltaTime); const noOutliers = [ ...lastDeltaTimes ].sort((a, b) => a - b).slice(2, -2); const averageDeltaTime = noOutliers.reduce((a, b) => a + b, 0) / noOutliers.length; const FPS = 1e3 / averageDeltaTime; if (startupPerformance === "adaptive") { if (FPS < LOW_FPS_THRESHOLD) { if (lowFPSStart === null) lowFPSStart = now; if (now - lowFPSStart >= LOW_FPS_DURATION_MS) { if (animationFrame) cancelAnimationFrame(animationFrame); animationFrame = null; pen.clearRect(0, 0, paper.width, paper.height); return; } } else lowFPSStart = null; if (FPS < 45 && Dot.dots.length > 60) { Dot.dots.length = Math.max(60, Math.floor(Dot.dots.length * .9)); Dot.target = Dot.dots.length; } } } pen.clearRect(0, 0, paper.width, paper.height); Dot.dots.forEach(dot => { dot.update(); dot.draw(); }); const cols = Math.ceil(innerWidth / GRID_SIZE); const rows = Math.ceil(innerHeight / GRID_SIZE); const grid = new Array(cols * rows); for (let i = 0; i < grid.length; i++) grid[i] = []; Dot.dots.forEach((d, index) => { const cx = Math.max(0, Math.min(cols - 1, Math.floor(d.x / GRID_SIZE))); const cy = Math.max(0, Math.min(rows - 1, Math.floor(d.y / GRID_SIZE))); grid[cy * cols + cx].push(index); }); const linkRange = 150; const halfW = innerWidth / 2; const halfH = innerHeight / 2; const drawWrappedLine = (x1, y1, x2, y2, strokeStyle) => { const xShifts = [ 0 ]; if (Math.max(x1, x2) > innerWidth) xShifts.push(-innerWidth); if (Math.min(x1, x2) < 0) xShifts.push(innerWidth); const yShifts = [ 0 ]; if (Math.max(y1, y2) > innerHeight) yShifts.push(-innerHeight); if (Math.min(y1, y2) < 0) yShifts.push(innerHeight); pen.lineWidth = 1; pen.strokeStyle = strokeStyle; for (const shiftX of xShifts) for (const shiftY of yShifts) { pen.beginPath(); pen.moveTo(x1 + shiftX, y1 + shiftY); pen.lineTo(x2 + shiftX, y2 + shiftY); pen.stroke(); } }; for (let cy = 0; cy < rows; cy++) { for (let cx = 0; cx < cols; cx++) { const cellIdx = cy * cols + cx; const indices = grid[cellIdx]; if (indices.length === 0) continue; for (let nyOff = -1; nyOff <= 1; nyOff++) { const ny = (cy + nyOff + rows) % rows; for (let nxOff = -1; nxOff <= 1; nxOff++) { const nx = (cx + nxOff + cols) % cols; const nIdx = ny * cols + nx; const neighbors = grid[nIdx]; if (neighbors.length === 0) continue; for (let ii = 0; ii < indices.length; ii++) { const a = Dot.dots[indices[ii]]; for (let jj = 0; jj < neighbors.length; jj++) { const bi = neighbors[jj]; if (bi <= indices[ii]) continue; const b = Dot.dots[bi]; let dx = a.x - b.x; let dy = a.y - b.y; if (dx > halfW) dx -= innerWidth; if (dx < -halfW) dx += innerWidth; if (dy > halfH) dy -= innerHeight; if (dy < -halfH) dy += innerHeight; const dist2 = dx * dx + dy * dy; if (dist2 < linkRange * linkRange) { const distance = Math.sqrt(dist2); const opacity = (1 - distance / linkRange) * .4; const aSplit = a.color.split(","); const bSplit = b.color.split(","); const avgR = (parseInt(aSplit[0]) + parseInt(bSplit[0])) / 2; const avgG = (parseInt(aSplit[1]) + parseInt(bSplit[1])) / 2; const avgB = (parseInt(aSplit[2]) + parseInt(bSplit[2])) / 2; drawWrappedLine(a.x, a.y, a.x - dx, a.y - dy, `rgba(${avgR}, ${avgG}, ${avgB}, ${opacity})`); } } } } } } } animationFrame = requestAnimationFrame(animate); }; animate(); } if (this.ws.rights.rollback || this.ws.api.username === "LuniZunie") { document.querySelector("#rollback-needed").classList.add("hidden"); document.querySelector("#start-button").classList.remove("hidden"); } else { document.querySelector("#rollback-needed").classList.remove("hidden"); document.querySelector("#start-button").classList.add("hidden"); } document.querySelector("#start-button").addEventListener("click", () => { window.removeEventListener("keydown", shhhhh.function); controller.abort(); this.ws.audio.playSound([ "ui", "click" ]); if (animationFrame) cancelAnimationFrame(animationFrame); this.ws.start(); }); window.addEventListener("click", event => { [ ...document.querySelectorAll(".tooltip.buttons") ].forEach(elem => elem.remove()); const $href = event.target.closest("[href]"); if ($href) { const url = new URL($href.href, location.href); if (url.origin === location.origin && url.pathname === location.pathname) return; if ($href.dataset.multipleHrefs) { try { const [type, values = ""] = $href.dataset.multipleHrefs.split(";"); const items = Object.fromEntries(values.split("&").map(keyValue => { const [key, value] = keyValue.split("="); return [ key, decodeURIComponent(value) ]; })); switch (type) { case "page": { const title = items.title; const id = +items.id; this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "Page"; $page.addEventListener("click", event => { this.ws.open(this.ws.page(title), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "Revision"; $preview.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:Permalink/${id}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($preview); const $history = document.createElement("div"); $history.classList.add("button"); $history.innerText = "Diff"; $history.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:Diff/${id}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($history); }); } break; case "page-abuse": { const title = items.title; const id = +items.id; this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "Page"; $page.addEventListener("click", event => { this.ws.open(this.ws.page(title), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "Details"; $preview.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:AbuseLog/${id}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($preview); const $history = document.createElement("div"); $history.classList.add("button"); $history.innerText = "Examine"; $history.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:AbuseFilter/examine/log/${id}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($history); }); } break; case "log": { const title = items.title; const log = JSON.parse(items.log); this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "Page"; $page.addEventListener("click", event => { this.ws.open(this.ws.page(title), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "Log"; $preview.addEventListener("click", event => { const page = this.ws.page(`Special:Log/${encodeURIComponent(log.user)}?page=${encodeURIComponent(title)}&type=${log.type}&wptime=${log.timestamp}&limit=1`, false, false); const popup = this.ws.open(page, event.altKey); $tooltip.remove(); popup.addEventListener("load", () => { popup.scroll({ behavior: "smooth", top: popup.document.body.scrollHeight }); }, { once: true }); }); $tooltip.appendChild($preview); }); } break; case "user": { const username = items.name; this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "User talk"; $preview.addEventListener("click", event => { this.ws.open(this.ws.page(`User talk:${username}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($preview); const $history = document.createElement("div"); $history.classList.add("button"); $history.innerText = "User contribs"; $history.addEventListener("click", event => { this.ws.open(this.ws.page(`Special:Contribs/${username}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($history); const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "User page"; $page.addEventListener("click", event => { this.ws.open(this.ws.page(`User:${username}`), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); }); } break; case "email": { this.createTooltip($href, "buttons", null, null, null, $tooltip => { const $preview = document.createElement("div"); $preview.classList.add("button"); $preview.innerText = "Emergency"; $preview.addEventListener("click", event => { this.ws.open(this.ws.page("Special:EmailUser/Emergency"), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($preview); const $history = document.createElement("div"); $history.classList.add("button"); $history.innerText = "ArbCom"; $history.addEventListener("click", event => { this.ws.open(this.ws.page("Special:EmailUser/Arbitration Committee"), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($history); const $page = document.createElement("div"); $page.classList.add("button"); $page.innerText = "Oversight"; $page.addEventListener("click", event => { this.ws.open(this.ws.page("Special:EmailUser/Oversight"), event.altKey); $tooltip.remove(); }); $tooltip.appendChild($page); }); } break; } } catch (error) { this.ws.open($href.getAttribute("href"), event.altKey); } finally { event.preventDefault(); } } else this.ws.open($href.getAttribute("href"), event.altKey); event.preventDefault(); } }); document.querySelector("#loading").classList.add("hidden"); } async start() { this.intervals.DEFCON = setInterval(this.updateDEFCON.bind(this), 6e4); document.querySelector("#DEFCON").addEventListener("click", event => { this.ws.open("https://en.wikipedia.org/w/index.php?tagfilter=mw-manual-revert%7Cmw-rollback%7Cmw-undo&title=Special%3ARecentChanges&urlversion=2", event.altKey); }); this.settings.start(); document.querySelector("#app").classList.remove("hidden"); document.querySelector("#initial").classList.add("hidden"); document.querySelectorAll(".bottom-tool-trigger").forEach($trigger => { $trigger.addEventListener("click", e => { e.stopPropagation(); const $item = $trigger.closest(".bottom-tool-item"); const $menu = document.querySelector(`#${$item.dataset.menu}-menu`); const isOpen = $menu.classList.contains("show"); switch ($item.dataset.menu) { case "revert": { $menu.innerHTML = ""; this.createWarnMenu("reverts", $menu, this.ws.queue.current.item); } break; case "warn": { $menu.innerHTML = ""; this.createWarnMenu("warnings", $menu, this.ws.queue.current.item); } break; case "page": { var _item$page; const item = this.ws.queue.current.item; const watched = (item === null || item === void 0 || (_item$page = item.page) === null || _item$page === void 0 ? void 0 : _item$page.watched) === true; document.querySelector("#page-watch").classList.toggle("hidden", watched); document.querySelector("#page-unwatch").classList.toggle("hidden", !watched); } break; } this.closeMenus(); if (!isOpen) { $menu.classList.add("show"); $trigger.classList.add("active"); this.positionBottomMenu($item, $menu); } }); }); document.querySelectorAll(".submenu-trigger").forEach($trigger => { let exited = (0, _scriptEsm.generateRandomUUID)(); $trigger.addEventListener("mouseenter", () => { exited = null; const $parentMenu = $trigger.closest(".bottom-tool-menu"); if ($parentMenu) { $parentMenu.querySelectorAll(".submenu").forEach($submenu => $submenu.classList.remove("show")); } const $submenu = $trigger.querySelector(".submenu"); if ($submenu) { this.events.submenu($submenu, $submenu.dataset.eventName); $submenu.classList.add("show"); this.positionSubmenu($submenu, $trigger); } }); $trigger.addEventListener("mouseleave", () => { const UUID = (0, _scriptEsm.generateRandomUUID)(); exited = UUID; setTimeout(() => { if (exited !== UUID) return; const $submenu = $trigger.querySelector(".submenu"); if ($submenu) $submenu.classList.remove("show"); }, 500); }); }); document.querySelectorAll(".menu-option:not(.submenu-trigger)").forEach($option => { $option.addEventListener("click", () => this.closeMenus()); }); document.querySelectorAll(".submenu").forEach($submenu => { $submenu.addEventListener("click", e => e.stopPropagation()); }); document.querySelectorAll("#queue-tabs > .queue-tab").forEach($el => this.addTooltipListener($el)); { const types = [ "alert", "message" ]; types.forEach(type => { const $icon = document.querySelector(`#${type}s-icon`); this.addTooltipListener($icon); $icon.addEventListener("click", () => { const $panel = document.querySelector(`#${type}s-panel`); $panel.classList.toggle("show"); if ($panel.classList.contains("show")) this.ws.notifications.seen(type); }); document.querySelector(`#mark-all-${type}s-read`).addEventListener("click", e => { this.ws.notifications.read(type); }); }); document.addEventListener("click", e => { for (const type of types) { const $panel = document.querySelector(`#${type}s-panel`); const $icon = document.querySelector(`#${type}s-icon`); if (!($panel !== null && $panel !== void 0 && $panel.contains(e.target)) && !($icon !== null && $icon !== void 0 && $icon.contains(e.target))) $panel === null || $panel === void 0 || $panel.classList.remove("show"); } if (!e.target.closest(".bottom-tool-menu") && !e.target.closest(".confirmation-modal-overlay")) this.closeMenus(); }); } const $latest = document.querySelector("#latest-edits-tab"); $latest.addEventListener("click", () => this.updateDiffDisplay(this.ws.queue.current.item, false)); this.addTooltipListener($latest); const $consecutive = document.querySelector("#consecutive-edits-tab"); $consecutive.addEventListener("click", () => this.updateDiffDisplay(this.ws.queue.current.item, true)); this.addTooltipListener($consecutive); document.querySelector("#pending-changes-container > .accept").addEventListener("click", async e => { await this.ws.gui.settings.waitForClose(); const message = await this.dialog.input("Accept Pending Changes", "Enter an optional edit summary for accepting this change:", "Edit summary (optional)", ""); if (message !== null) this.ws.execute({ actions: [ { name: "next-item", params: {} }, { name: "accept-pending-edit", params: { summary: message } } ] }); }); document.querySelector("#pending-changes-container > .reject").addEventListener("click", async e => { await this.ws.gui.settings.waitForClose(); const message = await this.dialog.input("Reject Pending Changes", "Enter an optional edit summary for rejecting this change:", "Edit summary (optional)", ""); if (message !== null) this.ws.execute({ actions: [ { name: "next-item", params: {} }, { name: "reject-pending-edit", params: { summary: message } } ] }); }); document.querySelectorAll("#bottom-tools [data-tooltip]").forEach($el => this.addTooltipListener($el)); { // width adjusts const $queue = document.querySelector("#queue"); { const width = this.ws.store.UI.queue.width; if (width) { $queue.style.width = width; document.querySelector("#right-container").style.width = `calc(100% - ${width})`; } } const $details = document.querySelector("#right-details"); { const width = this.ws.store.UI.details.width; if (width) { $details.style.width = width; document.querySelector("#main-container").style.width = `calc(100% - ${width})`; } } const resize = { active: null, section: null, x: null, width: null, windowWidth: null }; const startResize = ($handle, $section, e) => { e.preventDefault(); resize.active = $handle; resize.section = $section; resize.x = e.clientX; resize.width = $section.getBoundingClientRect().width; resize.windowWidth = innerWidth; }; const $queueHandle = document.querySelector("#queue-width-adjust"); $queueHandle.addEventListener("pointerdown", e => startResize($queueHandle, $queue, e)); const $detailsHandle = document.querySelector("#details-width-adjust"); $detailsHandle.addEventListener("pointerdown", e => startResize($detailsHandle, $details, e)); addEventListener("pointerup", () => { if (resize.active === $queueHandle) this.ws.store.UI.queue.width = $queue.style.width; else if (resize.active === $detailsHandle) this.ws.store.UI.details.width = $details.style.width; resize.active = null; resize.section = null; }); addEventListener("pointermove", e => { if (!resize.active) return; const dx = e.clientX - resize.x; let newWidth; if (resize.active === $queueHandle) newWidth = resize.width + dx; else if (resize.active === $detailsHandle) newWidth = resize.width - dx; const min = resize.windowWidth * .1; // 10vw const max = resize.windowWidth * .3; // 30vw newWidth = Math.max(min, Math.min(max, newWidth)); const vw = newWidth / resize.windowWidth * 100; resize.section.style.width = `${vw}vw`; if (resize.active === $queueHandle) document.querySelector("#right-container").style.width = `calc(100% - ${vw}vw)`; else if (resize.active === $detailsHandle) document.querySelector("#main-container").style.width = `calc(100% - ${vw}vw)`; }); } const version = _wikishield.WikiShield.config.changelog.version; if (version.endsWith("!") || version !== this.ws.store.changelog) { var _electron$open, _electron; this.ws.store.changelog = version.replace(/!$/, ""); (_electron$open = (_electron = electron).open) === null || _electron$open === void 0 || _electron$open.call(_electron, "changelog"); } this.addTooltipListener(document.querySelector("#settings-icon")); document.querySelectorAll("#queue-top-right > span").forEach($el => this.addTooltipListener($el)); this.updateZenMode(); this.reorderQueues(); this.newCurrentItem(null); document.querySelector("#settings-icon").addEventListener("click", () => { this.settings.open(); }); this.events.button(document.querySelector("#clear-queue"), "clear-queue"); this.events.button(document.querySelector("#previous-item-button"), "previous-item"); this.events.button(document.querySelector("#next-item-button"), "next-item"); this.events.button(document.querySelector("#user-open-user-page"), "open-user-page"); this.events.button(document.querySelector("#user-open-user-talk"), "open-user-talk"); this.events.button(document.querySelector("#user-view-contribs"), "open-user-contributions"); this.events.button(document.querySelector("#user-view-filter-log"), "open-filter-log"); this.events.button(document.querySelector("#user-whitelist"), "whitelist-user"); this.events.button(document.querySelector("#user-unwhitelist"), "unwhitelist-user"); this.events.button(document.querySelector("#user-highlight"), "highlight-user"); this.events.button(document.querySelector("#user-unhighlight"), "unhighlight-user"); this.events.submenu(document.querySelector("#user-welcome .submenu"), "welcome-user"); this.events.submenu(document.querySelector("#user-report-aiv .submenu"), "report-user-to-aiv"); this.events.submenu(document.querySelector("#user-report-uaa .submenu"), "report-user-to-uaa"); this.events.submenu(document.querySelector("#user-request-global-block .submenu"), "request-global-block"); this.events.submenu(document.querySelector("#user-request-global-lock .submenu"), "request-global-lock"); this.events.submenu(document.querySelector("#user-new-talk-topic .submenu"), "send-message-to-user-talk"); this.events.button(document.querySelector("#page-open-page"), "open-page"); this.events.button(document.querySelector("#page-open-talk"), "open-page-talk"); this.events.button(document.querySelector("#page-watch"), "watch-page"); this.events.button(document.querySelector("#page-unwatch"), "unwatch-page"); this.events.button(document.querySelector("#page-whitelist"), "whitelist-page"); this.events.button(document.querySelector("#page-unwhitelist"), "unwhitelist-page"); this.events.button(document.querySelector("#page-highlight"), "highlight-page"); this.events.button(document.querySelector("#page-unhighlight"), "unhighlight-page"); this.events.submenu(document.querySelector("#page-request-protection .submenu"), "request-page-protection"); this.events.button(document.querySelector("#page-view-history"), "open-page-history"); this.events.submenu(document.querySelector("#page-new-talk-topic .submenu"), "send-message-to-page-talk"); this.events.button(document.querySelector("#edit-view-revision"), "open-revision"); this.events.button(document.querySelector("#edit-view-diff"), "open-diff"); this.events.button(document.querySelector("#edit-thank-user"), "thank-user"); this.events.submenu(document.querySelector("#edit-rollback .submenu"), "rollback-edit"); this.events.submenu(document.querySelector("#edit-rollback-goodfaith .submenu"), "rollback-goodfaith-edit"); this.events.submenu(document.querySelector("#edit-undo .submenu"), "undo-edit"); this.events.button(document.querySelector("#copy-link"), "copy-link"); this.events.button(document.querySelector("#refresh-user-contributions"), "refresh-user-contributions"); this.events.button(document.querySelector("#user-contributions > .footer"), "open-user-contributions"); this.events.button(document.querySelector("#refresh-page-history"), "refresh-page-history"); this.events.button(document.querySelector("#page-history > .footer"), "open-page-history"); _queue.Queue.types.forEach(type => { this.events.button(document.querySelector(`#queue-tab-${type}`), `switch-to-${type}-queue`); }); this.animation(); this.update(); this.renderQueue(); electron.menuEnabler({ browser: true, settings: { preferences: true }, help: { changelog: true } }); } animation() { try { (0, _autoScroll.AutoScroll)(); } catch (error) { console.error("Error in animation loop:", error); } requestAnimationFrame(() => this.animation()); } update() { try { const now = new Date; document.querySelectorAll("[data-time]").forEach($el => { const timestamp = new Date($el.dataset.time); switch ($el.dataset.timeFormat) { case "notification": { $el.textContent = this.ws.util.formatNotificationTime(timestamp, "timeNow" in $el.dataset ? new Date($el.dataset.timeNow) : now) + ($el.dataset.timePostfix || ""); } break; case "duration": { $el.textContent = this.ws.util.formatDuration(timestamp, "timeNow" in $el.dataset ? new Date($el.dataset.timeNow) : now) + ($el.dataset.timePostfix || ""); } break; } }); } catch (error) { console.error("Error updating time elements:", error); } setTimeout(() => this.update(), 1e3); } async updateDEFCON() { var _DEFCON$info; const DEFCON = await this.ws.getDEFCON(); const $DEFCON = document.querySelector("#DEFCON"); $DEFCON.title = `DEFCON-${DEFCON.level !== null ? DEFCON.level : "N/A"} (${DEFCON.info ? `${DEFCON.info} revert${+DEFCON.info === 1 ? "" : "s"} per minute` : "No data"})`; const $dot = $DEFCON.querySelector(".dot"); $dot.className = "dot"; if (DEFCON.level !== null) $dot.classList.add(`DEFCON-${DEFCON.level}`); document.querySelector(".DEFCON-RPM").textContent = (_DEFCON$info = DEFCON.info) !== null && _DEFCON$info !== void 0 ? _DEFCON$info : "N/A"; } generateItemHTML(item, removeButton = false) { const oresColor = this.getORESColor(item.ores); const diffColor = "sizediff" in item ? this.ws.util.getChangeColor(item.sizediff) : undefined; const $item = (0, _scriptEsm2.CreateDOMElement)("div"); { const $color = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-color", style: { "--ores-color": oresColor }, dataset: { ores: item.ores } }); $item.appendChild($color); } { var _ref, _item$tags, _item$filters; const $body = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-body", style: { "--ores-color": oresColor, "--diff-color": diffColor }, datset: { ores: item.ores } }); $item.appendChild($body); { const $header = (0, _scriptEsm2.CreateDOMElement)("div", { class: "header" }); $body.appendChild($header); { const highlighted = this.ws.store.highlight.pages.has(item.page.title); const $title = (0, _scriptEsm2.CreateDOMElement)("span", { class: "page-title" + (highlighted ? " highlighted" : ""), content: item.page.title, dataset: highlighted ? { tooltip: "Page is highlighted", tooltipDelay: 500 } : {} }); this.addTooltipListener($title); $header.appendChild($title); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-file-lines" }); $title.prepend($icon); } { const $timestamp = (0, _scriptEsm2.CreateDOMElement)("span", { class: "timestamp" }); $header.appendChild($timestamp); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-clock", style: { "font-size": "11px" } }); $timestamp.appendChild($icon); const $time = (0, _scriptEsm2.CreateDOMElement)("span", { content: this.ws.util.formatNotificationTime(new Date(item.timestamp)), dataset: { tooltip: new Date(item.timestamp).toLocaleString(), tooltipDelay: 500, time: item.timestamp, timeFormat: "notification" } }); this.addTooltipListener($time); $timestamp.appendChild($time); } } { var _item$performer; const $meta = (0, _scriptEsm2.CreateDOMElement)("div", { class: "meta" }); $body.appendChild($meta); const user = (_item$performer = item.performer) !== null && _item$performer !== void 0 ? _item$performer : item.user; { const blocked = user.blocked; const blockExpiry = this.ws.util.expiryToDate(blocked === null || blocked === void 0 ? void 0 : blocked.expiry); const highlighted = this.ws.store.highlight.users.has(user.name); const emptyTalk = user.talk === undefined; const $user = (0, _scriptEsm2.CreateDOMElement)("span", { class: "user-chip" + ((blocked === null || blocked === void 0 ? void 0 : blocked.partial) === false ? " blocked" : "") + (highlighted ? " highlighted" : "") + (emptyTalk ? " empty-talk" : ""), content: item.user.name, dataset: (blocked === null || blocked === void 0 ? void 0 : blocked.partial) === false ? { tooltip: `Blocked ${blockExpiry === Infinity ? "indefinitely" : `until ${blockExpiry.toLocaleString()}`} (${blocked.reason})`, tooltipDelay: 500 } : highlighted ? { tooltip: "User is highlighted", tooltipDelay: 500 } : emptyTalk ? { tooltip: "User has an empty talk page", tooltipDelay: 500 } : {} }); this.addTooltipListener($user); $meta.appendChild($user); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${user.anon ? "user-secret" : "user"}`, style: { "font-size": "11px" } }); $user.prepend($icon); } { const $chips = (0, _scriptEsm2.CreateDOMElement)("div", { class: "chips" }); $meta.appendChild($chips); if (item.type === "abuselog") { const results = [ "disallow", "warn", "showcaptcha", "tag", "none" ]; const len = results.length; let action = len - 1; for (let i = 0; i < len; i++) if (item.origin.result.has(results[i])) { action = i; break; } const $ores = (0, _scriptEsm2.CreateDOMElement)("span", { class: "ores-chip", dataset: { tooltip: `Action taken: ${results[action]}`, tooltipDelay: 500 } }); this.addTooltipListener($ores); $chips.appendChild($ores); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${[ "ban", "exclamation-triangle", "robot", "tag", "check" ][action]}`, style: { "font-size": "11px" } }); $ores.prepend($icon); } else { const $ores = (0, _scriptEsm2.CreateDOMElement)("span", { class: "ores-chip", content: Number.isNaN(item.ores) ? "-" : Math.round(item.ores * 100), dataset: { tooltip: "Score", tooltipDelay: 500 } }); this.addTooltipListener($ores); $chips.appendChild($ores); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-fire", style: { "font-size": "11px" } }); $ores.prepend($icon); } { const $diffChips = (0, _scriptEsm2.CreateDOMElement)("div", { class: "diff-chips" }); $chips.appendChild($diffChips); if (item.minor) { const $minor = (0, _scriptEsm2.CreateDOMElement)("span", { class: "minor-chip", dataset: { tooltip: "Minor edit", tooltipDelay: 500 } }); this.addTooltipListener($minor); $diffChips.appendChild($minor); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-m", style: { "font-size": "11px" } }); $minor.appendChild($icon); } if ("sizediff" in item) { const $diff = (0, _scriptEsm2.CreateDOMElement)("span", { class: "diff-chip", content: Math.abs(item.sizediff).toLocaleString(), dataset: { tooltip: "Size difference", tooltipDelay: 500 } }); this.addTooltipListener($diff); $diffChips.appendChild($diff); if (item.sizediff !== 0) { const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${item.sizediff > 0 ? "plus" : "minus"}`, style: { "font-size": "11px" } }); $diff.prepend($icon); } } } } } if (item.has_comment) { const $comment = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-comment" }); $body.appendChild($comment); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-comment", style: { "font-size": "11px" } }); $comment.appendChild($icon); const $text = (0, _scriptEsm2.CreateDOMElement)("span", { class: "text", html: item.comment, dataset: { tooltip: item.comment, tooltipHtml: true, tooltipDelay: 500 } }); this.addTooltipListener($text); $comment.appendChild($text); } const tags = (_ref = (_item$tags = item.tags) !== null && _item$tags !== void 0 ? _item$tags : (_item$filters = item.filters) === null || _item$filters === void 0 ? void 0 : _item$filters.map(filter => `${filter.filter} (${filter.id === "-1" ? "private" : filter.id})`)) !== null && _ref !== void 0 ? _ref : []; if (tags.length > 0) { const $tags = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-tags" }); $body.appendChild($tags); tags.forEach(tag => { const $tag = (0, _scriptEsm2.CreateDOMElement)("span", { class: "tag", content: tag }); $tags.appendChild($tag); }); } } if (removeButton) { const $remove = (0, _scriptEsm2.CreateDOMElement)("div", { class: "remove-button" }); $item.appendChild($remove); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-xmark" }); $remove.appendChild($icon); } return $item.innerHTML; } generateEditDetails(item, consecutive = false) { if (!item) return void (document.querySelector("#edit-details").innerHTML = "<div class='central'>Nothing selected</div>"); const pending = _queue.Queue.groups[item.type] === "edit" ? this.ws.queue.pending.get(item.id) : null; const $details = document.querySelector("#edit-details"); $details.style.setProperty("--diff-color", "sizediff" in item ? this.ws.util.getChangeColor(item.sizediff) : undefined); $details.innerHTML = ""; { const $header = (0, _scriptEsm2.CreateDOMElement)("div", { class: "header" }); $details.appendChild($header); { const highlighted = this.ws.store.highlight.pages.has(item.page.title); const $title = (0, _scriptEsm2.CreateDOMElement)("span", { class: "page-title" + (highlighted ? " highlighted" : ""), dataset: highlighted ? { tooltip: "Page is highlighted", tooltipDelay: 500 } : {} }); this.addTooltipListener($title); $header.appendChild($title); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-file-lines" }); $title.appendChild($icon); let pageHref; switch (_queue.Queue.groups[item.type]) { case "edit": { pageHref = "page"; } break; case "logevent": { pageHref = "log"; } break; case "abuselog": { pageHref = "page-abuse"; } break; } const $link = (0, _scriptEsm2.CreateDOMElement)("a", { content: item.page.title, dataset: { multipleHrefs: `${pageHref};title=${encodeURIComponent(item.page.title)}&${pageHref === "log" ? `log=${JSON.stringify(item)}` : `id=${item.id}`}`, tooltip: item.page.title, tooltipDelay: 500 }, attributes: { href: null } }); this.addTooltipListener($link); $title.appendChild($link); } { var _item$performer2; const $meta = (0, _scriptEsm2.CreateDOMElement)("div", { class: "meta" }); $header.appendChild($meta); const user = (_item$performer2 = item.performer) !== null && _item$performer2 !== void 0 ? _item$performer2 : item.user; { var _pending$users; const otherUsers = Object.keys((_pending$users = pending === null || pending === void 0 ? void 0 : pending.users) !== null && _pending$users !== void 0 ? _pending$users : {}).filter(pendingUser => pendingUser !== user.name); const blocked = user.blocked; const blockExpiry = this.ws.util.expiryToDate(blocked === null || blocked === void 0 ? void 0 : blocked.expiry); const highlighted = this.ws.store.highlight.users.has(user.name); const emptyTalk = user.talk === undefined; const $user = (0, _scriptEsm2.CreateDOMElement)("span", { class: "user-chip" + ((blocked === null || blocked === void 0 ? void 0 : blocked.partial) === false ? " blocked" : "") + (highlighted ? " highlighted" : "") + (emptyTalk ? " empty-talk" : ""), dataset: (blocked === null || blocked === void 0 ? void 0 : blocked.partial) === false ? { tooltip: `Blocked ${blockExpiry === Infinity ? "indefinitely" : `until ${blockExpiry.toLocaleString()}`} (${blocked.reason})`, tooltipDelay: 500 } : highlighted ? { tooltip: "User is highlighted", tooltipDelay: 500 } : emptyTalk ? { tooltip: "User has an empty talk page", tooltipDelay: 500 } : {} }); this.addTooltipListener($user); $meta.appendChild($user); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${otherUsers.length > 0 ? "users" : user.anon ? "user-secret" : "user"}` }); $user.appendChild($icon); const $link = (0, _scriptEsm2.CreateDOMElement)("a", { content: user.name, dataset: { multipleHrefs: `user;name=${encodeURIComponent(user.name)}`, tooltip: user.name, tooltipDelay: 500 }, attributes: { href: null } }); this.addTooltipListener($link); $user.appendChild($link); if (otherUsers.length > 0) { const $others = (0, _scriptEsm2.CreateDOMElement)("span", { class: "other-users", content: ` and ${otherUsers.length} ${_text.Text.pluralize("other", otherUsers.length)}`, dataset: { tooltip: otherUsers.join(", "), tooltipDelay: 500 } }); this.addTooltipListener($others); $user.appendChild($others); } } } } { var _item$consecutive; const $subheader = (0, _scriptEsm2.CreateDOMElement)("div", { class: "subheader" }); $details.appendChild($subheader); if ((pending === null || pending === void 0 ? void 0 : pending.count) > 1 || consecutive && ((_item$consecutive = item.consecutive) === null || _item$consecutive === void 0 ? void 0 : _item$consecutive.count) > 1) { const $comment = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-comment" }); $subheader.appendChild($comment); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-comments", style: { "font-size": "11px" } }); $comment.appendChild($icon); const data = pending !== null && pending !== void 0 ? pending : item.consecutive; const $text = (0, _scriptEsm2.CreateDOMElement)("span", { class: "text", content: `${data.count} ${_text.Text.pluralize("edit", data.count)} over the course of `, dataset: { tooltip: data.edits.map(edit => { const $body = (0, _scriptEsm2.CreateDOMElement)("div", { style: { display: "flex", "flex-direction": "column", gap: "6px" } }); { const $header = (0, _scriptEsm2.CreateDOMElement)("div", { style: { display: "flex", "align-items": "center", gap: "6px", width: "100%", "justify-content": "space-between", "font-size": "13px" } }); $body.appendChild($header); { const $user = (0, _scriptEsm2.CreateDOMElement)("span", { style: { display: "flex", "align-items": "center", gap: "4px", "font-weight": "500" }, content: edit.user }); $header.appendChild($user); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${edit.anon ? "user-secret" : "user"}`, style: { "font-size": "11px", opacity: "0.7" } }); $user.prepend($icon); } { const $time = (0, _scriptEsm2.CreateDOMElement)("span", { style: { display: "flex", "align-items": "center", gap: "4px", "font-size": "12px", opacity: "0.75" }, content: this.ws.util.formatNotificationTime(new Date(edit.timestamp)), dataset: { time: edit.timestamp, timeFormat: "notification" } }); $header.appendChild($time); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-clock", style: { "font-size": "10px", opacity: "0.7" } }); $time.prepend($icon); } } { const $comment = (0, _scriptEsm2.CreateDOMElement)("div", { style: { display: "flex", "align-items": "flex-start", gap: "4px", "font-size": "12px", opacity: "0.85", padding: "2px 0" }, content: edit.comment || "No edit summary" }); $body.appendChild($comment); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-comment", style: { "font-size": "10px", opacity: "0.7", "flex-shrink": "0", "margin-top": "2px" } }); $comment.prepend($icon); } return $body.outerHTML; }).join("<br>"), tooltipHtml: true, tooltipDelay: 500 } }); this.addTooltipListener($text); $comment.appendChild($text); const $time = (0, _scriptEsm2.CreateDOMElement)("span", { class: "time", content: this.ws.util.formatDuration(new Date(data.timestamp.old), new Date(data.timestamp.new)), dataset: { tooltip: `${new Date(data.timestamp.old).toLocaleString()}&mdash;${new Date(data.timestamp.new).toLocaleString()}`, tooltipHtml: true, tooltipDelay: 500, time: data.timestamp.old, timeNow: data.timestamp.new, timeFormat: "duration" } }); this.addTooltipListener($time); $comment.appendChild($time); } else if (item.has_comment) { const $comment = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-comment" }); $subheader.appendChild($comment); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-comment", style: { "font-size": "11px" } }); $comment.appendChild($icon); const $text = (0, _scriptEsm2.CreateDOMElement)("span", { class: "text", html: item.comment, dataset: { tooltip: item.comment, tooltipHtml: true, tooltipDelay: 500 } }); this.addTooltipListener($text); $comment.appendChild($text); } else { const $noComment = (0, _scriptEsm2.CreateDOMElement)("div", { class: "item-comment none", content: "No edit summary" }); $subheader.appendChild($noComment); } { const $meta = (0, _scriptEsm2.CreateDOMElement)("div", { class: "meta" }); $subheader.appendChild($meta); { if (item.minor) { const $minor = (0, _scriptEsm2.CreateDOMElement)("span", { class: "minor-chip", dataset: { tooltip: "Minor edit", tooltipDelay: 500 } }); this.addTooltipListener($minor); $meta.appendChild($minor); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-m", style: { "font-size": "11px" } }); $minor.appendChild($icon); } if ("sizediff" in item) { const $diff = (0, _scriptEsm2.CreateDOMElement)("span", { class: "diff-chip", content: Math.abs(item.sizediff).toLocaleString(), dataset: { tooltip: "Size difference", tooltipDelay: 500 } }); this.addTooltipListener($diff); $meta.appendChild($diff); if (item.sizediff !== 0) { const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: `fas fa-${item.sizediff > 0 ? "plus" : "minus"}`, style: { "font-size": "11px" } }); $diff.prepend($icon); } } } } } } renderQueue(queue = null, current = null, type = null) { var _$queue$querySelector, _this$ws$queue$queues2, _current4; document.querySelector("#previous-item-button").classList.toggle("disabled", !this.ws.queue.canGoPrevious()); document.querySelector("#next-item-button").classList.toggle("disabled", !this.ws.queue.canGoNext()); queue !== null && queue !== void 0 ? queue : queue = this.ws.queue.current.queue; current !== null && current !== void 0 ? current : current = this.ws.queue.current.item; type !== null && type !== void 0 ? type : type = this.ws.queue.current.type; this.updateQueueTabs(); if (type !== this.ws.queue.current.type) return; const $queue = document.querySelector("#queue-items"); if (queue.length === 0) { var _this$ws$queue$queues, _current; const $empty = document.createElement("div"); $empty.classList.add("queue-empty"); $empty.textContent = "No items in queue"; $queue.innerHTML = $empty.outerHTML; if (((_this$ws$queue$queues = this.ws.queue.queues[type].previous) === null || _this$ws$queue$queues === void 0 ? void 0 : _this$ws$queue$queues.id) !== ((_current = current) === null || _current === void 0 ? void 0 : _current.id)) { this.ws.queue.queues[type].previous = current; this.newCurrentItem(current); } return; } else $queue.querySelectorAll(".queue-empty").forEach($el => $el.remove()); const dom = new Map; for (const $el of $queue.children) dom.set(+$el.dataset.id, $el); let $previous = null; for (const item of queue) { var _current3; let $el = dom.get(item.id); if (!$el) { var _$el$querySelector; $el = document.createElement("div"); $el.classList.add("queue-item"); $el.dataset.id = item.id; $el.dataset.type = type; $el.innerHTML = this.generateItemHTML(item, type !== "pending"); (_$el$querySelector = $el.querySelector(".remove-button")) === null || _$el$querySelector === void 0 || _$el$querySelector.addEventListener("click", e => { e.stopPropagation(); const i = queue.findIndex(queueItem => queueItem.id === item.id); if (i >= 0) { var _current2; if (item.id === ((_current2 = current) === null || _current2 === void 0 ? void 0 : _current2.id)) this.ws.queue.next(); else { queue.splice(i, 1); this.ws.queue.queues[type].history.push({ ...item, history: performance.now() }); this.removeQueueItem(type, item.id); this.renderQueue(); } } }); if (item.mentions.has && this.ws.store.settings.username_highlighting.enabled) { $el.classList.add("mentions-me"); $el.dataset.tooltip = "This queue item contains your username"; this.addTooltipListener($el); } $el.addEventListener("click", () => { this.ws.queue.queues[type].item = item; this.ws.current = this.ws.queue.queues[type]; // saftey fallback this.renderQueue(); }); $queue.appendChild($el); dom.set(item.id, $el); $el.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); } if ($previous === null) { if ($el !== $queue.firstChild) $queue.insertBefore($el, $queue.firstChild); } else if ($el.previousSibling !== $previous) $queue.insertBefore($el, $previous.nextSibling); $el.classList.toggle("current", item.id === ((_current3 = current) === null || _current3 === void 0 ? void 0 : _current3.id)); $previous = $el; } for (const [id, $el] of dom.entries()) if (!queue.some(item => item.id === id)) $el.remove(); let historical = null; for (const item of queue) { if (item.history !== false) historical = item; else break; } (_$queue$querySelector = $queue.querySelector(".historical-bar")) === null || _$queue$querySelector === void 0 || _$queue$querySelector.remove(); if (historical !== null) { const $bar = (0, _scriptEsm2.CreateDOMElement)("div", { class: "historical-bar" }); $queue.insertBefore($bar, dom.get(historical.id).nextSibling); const $label = (0, _scriptEsm2.CreateDOMElement)("span", { class: "label" }); $bar.appendChild($label); const $icon = (0, _scriptEsm2.CreateDOMElement)("i", { class: "fas fa-box-archive", attributes: { title: "All items above this line have been viewed" } }); $label.appendChild($icon); } if (((_this$ws$queue$queues2 = this.ws.queue.queues[type].previous) === null || _this$ws$queue$queues2 === void 0 ? void 0 : _this$ws$queue$queues2.id) !== ((_current4 = current) === null || _current4 === void 0 ? void 0 : _current4.id)) { this.ws.queue.queues[type].previous = current; this.newCurrentItem(current); } } removeQueueItem(type, id) { const $el = document.querySelector(`.queue-item[data-type="${type}"][data-id="${id}"]`); if ($el) { $el.remove(); this.updateQueueTabs([ type ]); } } clearQueueItems() { document.querySelector("#queue-items").innerHTML = ""; this.renderQueue(); } updateHiddenItems(item) { if (item === undefined) item = this.ws.queue.current.item; if (item === null) { if (!this.ws.store.UI.hide_tools) // if not hiding tools, just keep it as is return document.querySelectorAll("[data-queue-type]").forEach($el => $el.classList.add("hidden")); return document.querySelectorAll("[data-queue-type]").forEach($el => $el.classList.add("hidden")); } let type = item.type; if (type === "abuselog") { if (item.revid) type = "edit"; } const group = _queue.Queue.groups[type]; document.querySelectorAll("[data-queue-type]").forEach($el => { const forType = $el.dataset.queueType || "*"; if (forType === "*") $el.classList.remove("hidden"); else $el.classList.toggle("hidden", !forType.split(",").includes(group)); }); } async newCurrentItem(item = null, circular = false) { var _this$controllers$cur, _item$page2; (_this$controllers$cur = this.controllers.current) === null || _this$controllers$cur === void 0 || _this$controllers$cur.abort(); const controller = new AbortController; this.controllers.current = controller; if (item !== null) { this.updateDiffDisplay("loading"); await this.ws.queue.propagate(item, true); } this.stopOutdatedCheck(); this.toggleEditWarNotice((item === null || item === void 0 ? void 0 : item.reverts) >= 3, (item === null || item === void 0 ? void 0 : item.reverts) || 0); this.toggleOutdatedNotice(false); this.togglePendingNotice(false); this.closeMenus(); this.removeTooltips(); document.querySelectorAll("#right-top > div > :not(.hidden)").forEach(el => el.classList.add("hidden")); const $contributions = document.querySelector("#user-contributions > .queue-list"); $contributions.innerHTML = ""; const $history = document.querySelector("#page-history > .queue-list"); $history.innerHTML = ""; document.querySelector("#user-contributions > .header > .pills").innerHTML = ""; document.querySelector("#page-history > .header > .pills").innerHTML = ""; document.querySelector("#pending-changes-container").classList.toggle("hidden", !(this.ws.rights.review && this.ws.queue.pending.has(item === null || item === void 0 ? void 0 : item.id))); this.updateHiddenItems(item); if (item === null) { this.generateEditDetails(); document.querySelector("#diff-container").innerHTML = ""; document.querySelector("#diff-scroll-up").classList.add("hidden"); document.querySelector("#diff-scroll-down").classList.add("hidden"); document.querySelector("#ai-analysis-container").classList.add("hidden"); if ([ ...document.querySelectorAll(`#queue-tabs > .queue-tab`) ].every(tab => getComputedStyle(tab).display === "none")) document.querySelector("#diff-container").innerHTML = `\n\t\t\t\t\t<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: grey;">\n\t\t\t\t\t\t<div style="font-size: 48px; margin-bottom: 16px;">\n\t\t\t\t\t\t\t<i class="fas fa-shield-alt"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 24px; margin-bottom: 8px; text-align: center;">\n\t\t\t\t\t\t\tNo queues are enabled\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 14px; text-align: center; max-width: 100%; margin-top: 10px;">\n\t\t\t\t\t\t\tI heard there was a WikiShield,<br>\n\t\t\t\t\t\t\tWhich entered an oversaturated field,<br>\n\t\t\t\t\t\t\tBut you don&rsquo;t ever use Huggle, do you?<br>\n\t\t\t\t\t\t\tWell it simplifies any AIV,<br>\n\t\t\t\t\t\t\tBut superintendence matters to me\n\t\t\t\t\t\t\t<span style="display: block; margin-top: 8px;">&mdash; User:WikiMacaroons</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`; return; } const type = item.type; const group = _queue.Queue.groups[type]; if (!circular && type === "abuselog" && !item.revid) { const update = async () => { if (controller.signal.aborted) return; this.ws.api.getAbuseLogRevid(item.id).then(revid => { var _this$ws$queue$curren2; if (revid) { var _this$ws$queue$curren; item.revid = revid; if (item.id === ((_this$ws$queue$curren = this.ws.queue.current.item) === null || _this$ws$queue$curren === void 0 ? void 0 : _this$ws$queue$curren.id)) this.newCurrentItem(this.ws.queue.current.item, true); } if (item.id === ((_this$ws$queue$curren2 = this.ws.queue.current.item) === null || _this$ws$queue$curren2 === void 0 ? void 0 : _this$ws$queue$curren2.id)) setTimeout(() => update(), 1e3); }); }; update(); } const watched = item === null || item === void 0 || (_item$page2 = item.page) === null || _item$page2 === void 0 ? void 0 : _item$page2.watched; document.querySelector("#page-watch").classList.toggle("hidden", watched === true); document.querySelector("#page-unwatch").classList.toggle("hidden", watched !== true); document.querySelector("#user-report-uaa").classList.toggle("hidden", item === null || item === void 0 ? void 0 : item.user.anon); document.querySelector("#user-request-global-lock").classList.toggle("hidden", item === null || item === void 0 ? void 0 : item.user.anon); if (this.ws.AI) { const storage = this.ws.store; if (item.AI.edit === null && storage.settings.AI.edit_analysis.enabled) this.ws.AI.analyze.edit(item).then(analysis => { item.AI.edit = analysis; }).catch(err => { item.AI.edit = { error: err.message }; }).finally(() => { var _this$ws$queue$curren3; if (item.id === ((_this$ws$queue$curren3 = this.ws.queue.current.item) === null || _this$ws$queue$curren3 === void 0 ? void 0 : _this$ws$queue$curren3.id)) this.updateAIAnalysisDisplay(item.AI.edit); }); if (item.AI.username === null && !item.user.anon && !storage.whitelist.users.has(item.user) && storage.settings.AI.username_analysis.enabled) this.ws.AI.analyze.username(item).then(analysis => { item.AI.username = analysis; if (analysis.flag) this.ws.queue.promptUAA(item, analysis); }).catch(err => { item.AI.username = { error: err.message }; }); } this.updateAIAnalysisDisplay(item.AI.edit); if (!item.seen) { item.seen = true; this.ws.store.statistics.edits_reviewed.total++; switch (this.ws.queue.current.type) { case "recent": { this.ws.store.statistics.recent_changes_reviewed.total++; } break; case "pending": { this.ws.store.statistics.pending_changes_reviewed.total++; } break; case "watchlist": { this.ws.store.statistics.watchlist_changes_reviewed.total++; } break; case "users": { this.ws.store.statistics.users_reviewed.total++; } break; } } { const $editPill = (0, _scriptEsm2.CreateDOMElement)("div", { class: "pill", content: `${item.user.edits.toLocaleString()} edit${item.user.edits === 1 ? "" : "s"}` }); document.querySelector("#user-contributions > .header > .pills").appendChild($editPill); } if (item.user.warning !== "0") { const $warnings = (0, _scriptEsm2.CreateDOMElement)("div", { class: `pill uw-${item.user.warning}` }); document.querySelector("#user-contributions > .header > .pills").appendChild($warnings); $warnings.textContent = `uw-${item.user.warning}`; const warnings = item.user.warnings; if (warnings.length > 0) { const $tooltip = document.createElement("div"); const $title = document.createElement("div"); $title.classList.add("tooltip-title"); $title.textContent = `Warnings for ${item.user.name}`; $tooltip.appendChild($title); for (const warning of warnings) { const $warning = document.createElement("div"); $warning.classList.add("tooltip-item", "user-warnings"); $tooltip.appendChild($warning); const $level = document.createElement("span"); $level.classList.add("tooltip-item-level"); $level.textContent = `${warning.template}${warning.level}`; $warning.appendChild($level); const $details = document.createElement("div"); $details.classList.add("tooltip-item-details"); $warning.appendChild($details); const $user = document.createElement("span"); $user.classList.add("tooltip-item-user"); $user.textContent = warning.username ? `by User:${warning.username}` : "by Unknown"; $details.appendChild($user); $details.appendChild(document.createElement("br")); const $date = document.createElement("span"); $date.classList.add("tooltip-item-date"); $details.appendChild($date); if (warning.timestamp) { $date.dataset.time = warning.timestamp; $date.dataset.timeFormat = "notification"; $date.textContent = this.ws.util.formatNotificationTime(new Date(warning.timestamp)); } else $date.textContent = "Date unknown"; } $warnings.dataset.tooltip = $tooltip.innerHTML; $warnings.dataset.tooltipHtml = true; } this.addTooltipListener($warnings); } const blocks = item.user.blocks; if (blocks.length > 0) { const $blocks = (0, _scriptEsm2.CreateDOMElement)("div", { class: "pill ub" }); document.querySelector("#user-contributions > .header > .pills").appendChild($blocks); const $tooltip = document.createElement("div"); const $title = document.createElement("div"); $title.classList.add("tooltip-title"); $title.textContent = `Blocks for ${item.user.name}`; $tooltip.appendChild($title); for (const block of blocks) { var _block$params; const $block = document.createElement("div"); $block.classList.add("tooltip-item", "user-blocks"); $tooltip.appendChild($block); const $level = document.createElement("span"); $level.classList.add("tooltip-item-level"); $level.innerHTML = block.parsedcomment || "No reason provided"; $block.appendChild($level); const $details = document.createElement("div"); $details.classList.add("tooltip-item-details"); $block.appendChild($details); const $user = document.createElement("span"); $user.classList.add("tooltip-item-user"); $user.textContent = block.user ? `by User:${block.user}` : "by Unknown"; $details.appendChild($user); $details.appendChild(document.createElement("br")); const $date = document.createElement("span"); $date.classList.add("tooltip-item-time"); $details.appendChild($date); const $timestamp = document.createElement("span"); if (block.timestamp) { $timestamp.dataset.time = block.timestamp; $timestamp.dataset.timeFormat = "notification"; $timestamp.textContent = this.ws.util.formatNotificationTime(new Date(block.timestamp)); } else $timestamp.textContent = "Date unknown"; $date.appendChild($timestamp); const $duration = document.createElement("span"); $duration.textContent = `(for ${((_block$params = block.params) === null || _block$params === void 0 ? void 0 : _block$params.duration) || "an unknown duration"})`; $date.appendChild($duration); } $blocks.classList.remove("hidden"); $blocks.textContent = `${blocks.length} block${blocks.length === 1 ? "" : "s"}`; $blocks.dataset.tooltip = $tooltip.innerHTML; $blocks.dataset.tooltipHtml = true; this.addTooltipListener($blocks); } { // users whitelist & highlight buttons const $whitelist = document.querySelector("#user-whitelist"); const $unwhitelist = document.querySelector("#user-unwhitelist"); if ($whitelist && $unwhitelist) { const func = () => { const isWhitelisted = this.ws.store.whitelist.users.has(item.user.name); $whitelist.classList.toggle("hidden", isWhitelisted); $unwhitelist.classList.toggle("hidden", !isWhitelisted); }; $whitelist.onclick = func; $unwhitelist.onclick = func; func(); } const $highlight = document.querySelector("#user-highlight"); const $unhighlight = document.querySelector("#user-unhighlight"); if ($highlight && $unhighlight) { const func = () => { const isHighlighted = this.ws.store.highlight.users.has(item.user.name); $highlight.classList.toggle("hidden", isHighlighted); $unhighlight.classList.toggle("hidden", !isHighlighted); }; $highlight.onclick = func; $unhighlight.onclick = func; func(); } } { // pages whitelist & highlight buttons const $addWhitelist = document.querySelector("#page-whitelist"); const $removeWhitelist = document.querySelector("#page-unwhitelist"); if ($addWhitelist && $removeWhitelist) { const func = () => { const isWhitelisted = this.ws.store.whitelist.pages.has(item.page.title); $addWhitelist.classList.toggle("hidden", isWhitelisted); $removeWhitelist.classList.toggle("hidden", !isWhitelisted); }; $addWhitelist.onclick = func; $removeWhitelist.onclick = func; func(); } const $highlight = document.querySelector("#page-highlight"); const $unhighlight = document.querySelector("#page-unhighlight"); if ($highlight && $unhighlight) { const func = () => { const isHighlighted = this.ws.store.highlight.pages.has(item.page.title); $highlight.classList.toggle("hidden", isHighlighted); $unhighlight.classList.toggle("hidden", !isHighlighted); }; $highlight.onclick = func; $unhighlight.onclick = func; func(); } } { // contributions const load = async signal => { const contributions = item.user.contributions; for (const item of contributions) { var _this$ws$queue$curren4; const $item = document.createElement("div"); $item.className = "queue-item no-transition"; $item.classList.toggle("current", item.id === ((_this$ws$queue$curren4 = this.ws.queue.current.item.revid) !== null && _this$ws$queue$curren4 !== void 0 ? _this$ws$queue$curren4 : this.ws.queue.current.item.id)); $item.innerHTML = this.generateItemHTML({ page: { title: item.title }, user: { name: item.user }, comment: "Loading...", timestamp: item.timestamp, sizediff: 0, ores: NaN, tags: item.tags || [], type: "edit" }); $contributions.appendChild($item); requestAnimationFrame(() => $item.classList.remove("no-transition")); } if (item.page.cached_contributions) { const cached = await item.page.cached_contributions; if (signal.aborted) return; if (contributions.some((rev, i) => { var _cached$i; return rev.id !== ((_cached$i = cached[i]) === null || _cached$i === void 0 ? void 0 : _cached$i.id); })) delete item.page.cached_contributions; } if (!item.user.cached_contributions) item.user.cached_contributions = this.ws.queue.generate("edit", contributions, true); const items = await item.user.cached_contributions; if (signal.aborted) return; $contributions.innerHTML = ""; for (const item of items.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))) { var _this$ws$queue$curren5; const $item = document.createElement("div"); $item.className = "queue-item no-transition"; $item.classList.toggle("current", item.id === ((_this$ws$queue$curren5 = this.ws.queue.current.item.revid) !== null && _this$ws$queue$curren5 !== void 0 ? _this$ws$queue$curren5 : this.ws.queue.current.item.id)); $item.innerHTML = this.generateItemHTML(item); $contributions.appendChild($item); $item.addEventListener("mouseover", () => this.ws.queue.propagate(item, true)); $item.addEventListener("click", () => this.ws.queue.loadFromItem(item)); $item.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); requestAnimationFrame(() => $item.classList.remove("no-transition")); } }; load(controller.signal).catch(err => { if (controller.signal.aborted) return; console.error("Error loading contributions:", err); }); } switch (group) { case "edit": { this.startOutdatedCheck(item); if (!this.ws.queue.pending.has(item.id)) { var _item$consecutive2; if (((_item$consecutive2 = item.consecutive) === null || _item$consecutive2 === void 0 ? void 0 : _item$consecutive2.count) >= 2) { document.querySelector("#latest-edits-tab").classList.remove("hidden"); document.querySelector("#consecutive-edits-tab").classList.remove("hidden"); } } const protection = item.page.protection; if (protection.protected || this.ws.queue.pending.has(item.id)) { const $protection = (0, _scriptEsm2.CreateDOMElement)("div", { class: "pill" }); document.querySelector("#page-history > .header > .pills").appendChild($protection); if (protection.protected) { let icon, tooltip; switch (protection.level) { case "sysop": { icon = "F"; tooltip = "Requires sysop right to edit"; } break; case "template": { icon = "T"; tooltip = "Requires template editor to edit"; } break; case "extendedconfirmed": { icon = "EC"; tooltip = "Requires extended confirmed right to edit"; } break; case "autoconfirmed": { icon = "AC"; tooltip = "Requires autoconfirmed right to edit"; } break; default: { icon = "?"; tooltip = "Uknown protection level"; } break; } $protection.innerHTML = `<i class="fas fa-lock"></i> <span class="protection-icon" data-tooltip="${tooltip}">${icon}</span>`; this.addTooltipListener($protection.querySelector("[data-tooltip]")); } else if (this.ws.queue.pending.has(item.id)) { var _this$ws$queue$pendin; const comment = ((_this$ws$queue$pendin = this.ws.queue.pending.get(item.id).pending.stability) === null || _this$ws$queue$pendin === void 0 ? void 0 : _this$ws$queue$pendin.parsedcomment) || "No comment provided"; const $icon = document.createElement("span"); $icon.classList.add("protection-icon"); $icon.innerHTML = "<i class='fas fa-lock'></i> PC"; $icon.dataset.tooltip = comment; $icon.dataset.tooltipHtml = true; $protection.appendChild($icon); this.addTooltipListener($protection.querySelector("[data-tooltip]")); } } for (const metadata of item.page.metadata) { const $metadata = (0, _scriptEsm2.CreateDOMElement)("div", { class: "pill", content: metadata }); document.querySelector("#page-history > .header > .pills").appendChild($metadata); } } break; case "logevent": {} break; case "abuselog": { if (item.revid) this.startOutdatedCheck(item); const $protection = document.querySelector("#protection-indicator"); if ($protection) { const protection = item.page.protection; if (protection.protected) { let icon, tooltip; switch (protection.level) { case "sysop": { icon = "P"; tooltip = "Requires sysop right to edit"; } break; case "extendedconfirmed": { icon = "X"; tooltip = "Requires extended confirmed right to edit"; } break; case "autoconfirmed": { icon = "A"; tooltip = "Requires autoconfirmed right to edit"; } break; default: { icon = "?"; tooltip = "Uknown protection level"; } break; } $protection.innerHTML = `<span class="protection-icon" data-tooltip="${tooltip}">${icon}</span>`; this.addTooltipListener($protection.querySelector("[data-tooltip]")); } else if (this.ws.queue.pending.has(item.id)) { var _this$ws$queue$pendin2; const comment = ((_this$ws$queue$pendin2 = this.ws.queue.pending.get(item.id).pending.stability) === null || _this$ws$queue$pendin2 === void 0 ? void 0 : _this$ws$queue$pendin2.parsedcomment) || "No comment provided"; const $icon = document.createElement("span"); $icon.classList.add("protection-icon"); $icon.textContent = "PC"; $icon.dataset.tooltip = comment; $icon.dataset.tooltipHtml = true; $protection.appendChild($icon); this.addTooltipListener($protection.querySelector("[data-tooltip]")); } else $protection.innerHTML = ""; } } break; } if (group === "edit" || group === "abuselog") { // history const load = async signal => { const history = item.page.history; for (const item of history) { var _this$ws$queue$curren6; const $item = document.createElement("div"); $item.className = "queue-item no-transition"; $item.classList.toggle("current", item.id === ((_this$ws$queue$curren6 = this.ws.queue.current.item.revid) !== null && _this$ws$queue$curren6 !== void 0 ? _this$ws$queue$curren6 : this.ws.queue.current.item.id)); $item.innerHTML = this.generateItemHTML({ page: { title: item.title }, user: { name: item.user }, comment: "Loading...", timestamp: item.timestamp, sizediff: 0, ores: NaN, tags: item.tags || [], type: "edit" }); $history.appendChild($item); requestAnimationFrame(() => $item.classList.remove("no-transition")); } if (item.page.cached_history) { const cached = await item.page.cached_history; if (signal.aborted) return; if (history.some((rev, i) => { var _cached$i2; return rev.id !== ((_cached$i2 = cached[i]) === null || _cached$i2 === void 0 ? void 0 : _cached$i2.id); })) delete item.page.cached_history; } if (!item.page.cached_history) item.page.cached_history = this.ws.queue.generate("edit", history, true); const items = await item.page.cached_history; if (signal.aborted) return; $history.innerHTML = ""; for (const item of items.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))) { var _this$ws$queue$curren7; const $item = document.createElement("div"); $item.className = "queue-item no-transition"; $item.classList.toggle("current", item.id === ((_this$ws$queue$curren7 = this.ws.queue.current.item.revid) !== null && _this$ws$queue$curren7 !== void 0 ? _this$ws$queue$curren7 : this.ws.queue.current.item.id)); $item.innerHTML = this.generateItemHTML(item); $history.appendChild($item); $item.addEventListener("mouseover", () => this.ws.queue.propagate(item, true)); $item.addEventListener("click", () => this.ws.queue.loadFromItem(item)); $item.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); requestAnimationFrame(() => $item.classList.remove("no-transition")); } }; load(controller.signal).catch(err => { if (controller.signal.aborted) return; console.error("Error loading history:", err); }); } this.updateDiffDisplay(item, false); } updateDiffDisplay(item, consecutive) { var _$changes$; const $diff = document.querySelector("#diff-container"); if (!item) { document.querySelector("#diff-scroll-up").classList.add("hidden"); document.querySelector("#diff-scroll-down").classList.add("hidden"); return; } else if (item === "loading") { const $container = document.createElement("div"); $container.className = "loading-container"; const $spinner = document.createElement("div"); $spinner.className = "loading-spinner"; $container.appendChild($spinner); const $icon = document.createElement("i"); $icon.className = "fas fa-spinner fa-spin"; $spinner.appendChild($icon); const $text = document.createElement("div"); $text.className = "loading-text animate-loading-dots"; $text.textContent = "Loading edit"; $container.appendChild($text); return void ($diff.innerHTML = $container.outerHTML); } document.querySelectorAll("#right-top > .tabs > .tab.selected").forEach($tab => $tab.classList.remove("selected")); this.generateEditDetails(item, consecutive); switch (_queue.Queue.groups[item.type]) { case "edit": { var _item$diff, _item$consecutive3; const pending = this.ws.queue.pending.get(item.id); if (pending) $diff.innerHTML = `<table>${(_item$diff = item.diff) !== null && _item$diff !== void 0 ? _item$diff : "<em>No diff available</em>"}</table>`; else if (consecutive && ((_item$consecutive3 = item.consecutive) === null || _item$consecutive3 === void 0 ? void 0 : _item$consecutive3.count) > 1) { var _item$consecutive$dif, _item$consecutive$dif2; document.querySelector("#consecutive-edits-tab").classList.add("selected"); if ((_item$consecutive$dif = item.consecutive.diff) !== null && _item$consecutive$dif !== void 0 ? _item$consecutive$dif : true) $diff.innerHTML = `<table>${(_item$consecutive$dif2 = item.consecutive.diff) !== null && _item$consecutive$dif2 !== void 0 ? _item$consecutive$dif2 : "<em>No diff available</em>"}</table>`; else $diff.innerHTML = `<table><em>No difference</em></table>`; } else { var _item$diff2; document.querySelector("#latest-edits-tab").classList.add("selected"); $diff.innerHTML = `<table>${(_item$diff2 = item.diff) !== null && _item$diff2 !== void 0 ? _item$diff2 : "<em>No diff available</em>"}</table>`; } if (this.ws.store.settings.username_highlighting.enabled) { const username = this.ws.api.username; if (username) { if (item.mentions.diff) $diff.querySelectorAll("td").forEach($td => { if ($td.textContent && this.ws.util.match(username, $td.textContent)) $td.classList.add("ws-username-highlight"); }); if (item.mentions.comment) if (item.comment && this.ws.util.match(username, item.comment)) document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"); } } } break; case "logevent": { switch (item.type) { case "users": { $diff.innerHTML = ""; const evaluation = item.user.profanity; const $container = document.createElement("div"); $container.classList.add("profanity"); $diff.appendChild($container); const $header = document.createElement("div"); { $header.classList.add("profanity-header"); $container.appendChild($header); const $score = document.createElement("div"); { $score.classList.add("profanity-score"); $header.appendChild($score); const $label = document.createElement("span"); $label.classList.add("score-label"); $label.textContent = "Profanity Score:"; $score.appendChild($label); const $value = document.createElement("span"); $value.classList.add("score-value"); $value.textContent = evaluation.finalScore; $score.appendChild($value); } const $risk = document.createElement("div"); { $risk.classList.add("profanity-risk", `risk-${evaluation.risk.toLowerCase()}`); $header.appendChild($risk); const $icon = document.createElement("span"); $icon.classList.add("fa"); switch (evaluation.risk) { case "No": { $icon.classList.add("fa-smile"); } break; case "Low": { $icon.classList.add("fa-thumbs-up"); } break; case "Medium": { $icon.classList.add("fa-meh"); } break; case "High": { $icon.classList.add("fa-thumbs-down"); } break; case "Critical": { $icon.classList.add("fa-skull-crossbones"); } break; } $risk.appendChild($icon); const $label = document.createElement("span"); $label.textContent = `${evaluation.risk} risk`; $risk.appendChild($label); } } const matches = evaluation.matches; if (matches.length > 0) { const $header = document.createElement("div"); $header.classList.add("profanity-matches-header"); $container.appendChild($header); const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-search"); $header.appendChild($icon); const $text = document.createElement("span"); $text.textContent = `Matched Terms (${matches.length})`; $header.appendChild($text); const $matches = document.createElement("div"); $matches.classList.add("profanity-matches-list"); $container.appendChild($matches); for (const match of matches) { const $match = document.createElement("div"); { $match.classList.add("profanity-match"); $matches.appendChild($match); const $header = document.createElement("div"); { $header.classList.add("match-header"); $match.appendChild($header); const $text = document.createElement("span"); { $text.classList.add("match-text"); $text.textContent = match.match; $header.appendChild($text); } const $arrow = document.createElement("span"); { $arrow.classList.add("fa", "fa-arrow-right"); $header.appendChild($arrow); } const $name = document.createElement("span"); { $name.classList.add("match-name"); $name.textContent = match.name; $header.appendChild($name); } } const $details = document.createElement("div"); { $details.classList.add("match-details"); $match.appendChild($details); const $confidence = document.createElement("div"); { $confidence.classList.add("match-stat"); $details.appendChild($confidence); const $label = document.createElement("span"); { $label.classList.add("stat-label"); $label.textContent = "Confidence"; $confidence.appendChild($label); } const $value = document.createElement("span"); { $value.classList.add("stat-value"); $value.dataset.tooltip = "How certain we are this is a match."; $value.dataset.tooltipDelay = 500; $value.textContent = `${Math.round(match.confidence * 100)}%`; $confidence.appendChild($value); } } const $obfuscation = document.createElement("div"); { $obfuscation.classList.add("match-stat"); $details.appendChild($obfuscation); const $label = document.createElement("span"); { $label.classList.add("stat-label"); $label.textContent = "Obfuscation"; $obfuscation.appendChild($label); } const $value = document.createElement("span"); { $value.classList.add("stat-value"); $value.dataset.tooltip = "How much the term was altered from its original form."; $value.dataset.tooltipDelay = 500; $value.textContent = `${Math.round(match.obfuscation * 100)}%`; $obfuscation.appendChild($value); } } const $severity = document.createElement("div"); { $severity.classList.add("match-stat"); $details.appendChild($severity); const $label = document.createElement("span"); { $label.classList.add("stat-label"); $label.textContent = "Severity"; $severity.appendChild($label); } const $value = document.createElement("span"); { $value.classList.add("stat-value", `severity-${match.severity}`); $value.dataset.tooltip = "How severe this term is considered."; $value.dataset.tooltipDelay = 500; $value.textContent = match.severity; $severity.appendChild($value); } } } if (match.note) { const $note = document.createElement("div"); { $note.classList.add("match-note"); $match.appendChild($note); const $icon = document.createElement("span"); { $icon.classList.add("fa", "fa-info-circle"); $note.appendChild($icon); } const $text = document.createElement("span"); { $text.classList.add("note-text"); $text.textContent = match.note; $note.appendChild($text); } } } } $match.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); } } else { const $noMatches = document.createElement("div"); $noMatches.classList.add("profanity-no-matches"); $container.appendChild($noMatches); const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-check-circle"); $noMatches.appendChild($icon); const $text = document.createElement("span"); $text.textContent = "No profanity detected."; $noMatches.appendChild($text); } } break; } } break; case "abuselog": { var _item$diff3; $diff.innerHTML = `<table>${(_item$diff3 = item.diff) !== null && _item$diff3 !== void 0 ? _item$diff3 : "<em>No diff available</em>"}</table>`; if (this.ws.store.settings.username_highlighting.enabled) { const username = this.ws.api.username; if (username) { if (item.mentions.diff) $diff.querySelectorAll("td").forEach($td => { if ($td.textContent && this.ws.util.match(username, $td.textContent)) $td.classList.add("ws-username-highlight"); }); if (item.mentions.comment) if (item.comment && this.ws.util.match(username, item.comment)) document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"); } } } break; } $diff.querySelectorAll(":is(.mw-diff-movedpara-left, .mw-diff-movedpara-right)").forEach($el => { const href = $el.href.split("#")[1]; delete $el.href; $el.innerHTML = $el.classList.contains("mw-diff-movedpara-left") ? ">" : "<"; $el.addEventListener("click", e => { e.preventDefault(); const $target = $diff.querySelector(`a[name="${href}"]`); if ($target) { const targetRect = $target.getBoundingClientRect(); const diffRect = $diff.getBoundingClientRect(); const elementOffset = targetRect.top - diffRect.top + $diff.scrollTop; const targetScroll = elementOffset - (diffRect.height - targetRect.height) / 2; $diff.scrollTo({ top: Math.max(0, targetScroll), behavior: "smooth" }); $diff.querySelectorAll(".flash-highlight").forEach($old => $old.classList.remove("flash-highlight")); const $highlight = $target.parentElement.parentElement; $highlight.classList.add("flash-highlight"); setTimeout(() => { var _$highlight$classList; return $highlight === null || $highlight === void 0 || (_$highlight$classList = $highlight.classList) === null || _$highlight$classList === void 0 ? void 0 : _$highlight$classList.remove("flash-highlight"); }, 3e3); } }); }); const $lines = $diff.querySelectorAll(".diff-addedline, .diff-deletedline"); const $changes = $diff.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange"); const $scroll = (_$changes$ = $changes[0]) !== null && _$changes$ !== void 0 ? _$changes$ : $lines[0]; if ($scroll) requestAnimationFrame(() => { const scrollRect = $scroll.getBoundingClientRect(); const diffRect = $diff.getBoundingClientRect(); const elementOffset = scrollRect.top - diffRect.top + $diff.scrollTop; const targetScroll = elementOffset - (diffRect.height - scrollRect.height) / 2; $diff.scrollTo({ top: Math.max(0, targetScroll), behavior: "smooth" }); function updateOffScreen() { const $changes = $diff.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange"); let $above = null, $below = null; const rect = $diff.getBoundingClientRect(); for (const $change of $changes) { let thisAbove = false, thisBelow = false; const changeRect = $change.getBoundingClientRect(); if (changeRect.bottom < rect.top) thisAbove = true; if (changeRect.top > rect.bottom) thisBelow = true; if (!(thisAbove && thisBelow)) { if (thisAbove) $above = $change; if ($below === null && thisBelow) $below = $change; } } const $scrollUp = document.querySelector("#diff-scroll-up"); $scrollUp.classList.toggle("hidden", !$above); $scrollUp.onclick = () => { const aboveRect = $above.getBoundingClientRect(); const diffRect = $diff.getBoundingClientRect(); const elementOffset = aboveRect.top - diffRect.top + $diff.scrollTop; const targetScroll = elementOffset - (diffRect.height - aboveRect.height) / 2; $diff.scrollTo({ top: Math.max(0, targetScroll), behavior: "smooth" }); $above.classList.add("flash-highlight"); setTimeout(() => { var _$above; return (_$above = $above) === null || _$above === void 0 || (_$above = _$above.classList) === null || _$above === void 0 ? void 0 : _$above.remove("flash-highlight"); }, 3e3); }; const $scrollDown = document.querySelector("#diff-scroll-down"); $scrollDown.classList.toggle("hidden", !$below); $scrollDown.onclick = () => { const belowRect = $below.getBoundingClientRect(); const diffRect = $diff.getBoundingClientRect(); const elementOffset = belowRect.top - diffRect.top + $diff.scrollTop; const targetScroll = elementOffset - (diffRect.height - belowRect.height) / 2; $diff.scrollTo({ top: Math.max(0, targetScroll), behavior: "smooth" }); $below.classList.add("flash-highlight"); setTimeout(() => { var _$below; return (_$below = $below) === null || _$below === void 0 || (_$below = _$below.classList) === null || _$below === void 0 ? void 0 : _$below.remove("flash-highlight"); }, 3e3); }; } updateOffScreen(); $diff.onscroll = () => requestAnimationFrame(updateOffScreen); window.onresize = () => requestAnimationFrame(updateOffScreen); }); else { document.querySelector("#diff-scroll-up").classList.add("hidden"); document.querySelector("#diff-scroll-down").classList.add("hidden"); } } updateAIAnalysisDisplay(analysis) { const $analysis = document.querySelector("#ai-analysis-container"); if ($analysis && analysis) $analysis.classList.remove("hidden"); else return $analysis.classList.add("hidden"); if (analysis.error) { const $assessment = $analysis.querySelector(":scope > .header > .assessment"); $assessment.textContent = "Error"; $assessment.className = "assessment error"; $analysis.querySelector(":scope > .header > .confidence").textContent = ""; $analysis.querySelector(":scope > .explanation").textContent = analysis.error; const $issues = $analysis.querySelector(":scope > .issues"); $issues.innerHTML = ""; } else { const $assessment = $analysis.querySelector(":scope > .header > .assessment"); $assessment.textContent = analysis.assessment; $assessment.className = `assessment ${analysis.assessment.toLowerCase().replace(/\s+/g, "-")}`; $analysis.querySelector(":scope > .header > .confidence").textContent = `${Math.round((analysis.confidence || 0) * 100)}% confidence`; const explanationHtml = _assertClassBrand(_GUI_brand, this, _sanitizeInlineHtml).call(this, analysis.explanation || "No explanation provided."); $analysis.querySelector(":scope > .explanation").innerHTML = explanationHtml; const $issues = $analysis.querySelector(":scope > .issues"); $issues.innerHTML = ""; for (const issue of analysis.issues || []) { const $issue = document.createElement("div"); $issue.classList.add("issue", issue.severity.toLowerCase().replace(/\s+/g, "-")); $issue.textContent = issue.policy; $issues.appendChild($issue); } $analysis.querySelectorAll("[data-tooltip]").forEach($tooltip => this.addTooltipListener($tooltip)); } } async outdated(item) { let type = item.type, id = item.id; if (type === "abuselog" && item.revid) { type = "edit"; id = item.revid; } if (_queue.Queue.groups[type] !== "edit") { this.toggleOutdatedNotice(false); this.togglePendingNotice(false); return; } if (item.type === "pending") return this.togglePendingNotice(!this.ws.queue.pending.has(id), true); else if (!item.pending && this.ws.queue.type === "pending") return this.togglePendingNotice(true, false); try { var _this$ws$queue$curren8; const newer = (await this.ws.api.getLatestIds([ item.page.title ]))[item.page.title]; if (((_this$ws$queue$curren8 = this.ws.queue.current.item) === null || _this$ws$queue$curren8 === void 0 ? void 0 : _this$ws$queue$curren8.id) === item.id) this.toggleOutdatedNotice(newer > id, newer, item.page.title, id); } catch (error) { console.error("Error checking if edit is outdated:", error); this.toggleOutdatedNotice(false); } } startOutdatedCheck(item) { this.stopOutdatedCheck(); this.outdated(item); this.intervals.outdated = setInterval(() => { var _this$ws$queue$curren9; if (item.id === ((_this$ws$queue$curren9 = this.ws.queue.current.item) === null || _this$ws$queue$curren9 === void 0 ? void 0 : _this$ws$queue$curren9.id)) this.outdated(item); else this.stopOutdatedCheck(); }, 1e3); } stopOutdatedCheck() { if (this.intervals.outdated) { clearInterval(this.intervals.outdated); this.intervals.outdated = null; } this.toggleOutdatedNotice(false); this.togglePendingNotice(false); } toggleEditWarNotice(show, count) { const $exists = document.querySelector("#edit-war-notice"); show !== null && show !== void 0 ? show : show = !$exists; if (show === Boolean($exists)) return; if (show) { const $notice = document.createElement("div"); $notice.id = "edit-war-notice"; $notice.classList.add("notice", "edit-war"); const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-warning"); $notice.appendChild($icon); const $text = document.createElement("span"); $text.classList.add("text"); $text.innerHTML = `<b>3RR:</b> You have made ${count} reverts on this page in the last 24 hours.`; $notice.appendChild($text); const $diff = document.querySelector("#diff-container"); $diff.parentElement.insertBefore($notice, $diff); } else { const $notice = document.querySelector("#edit-war-notice"); if ($notice) $notice.remove(); } } toggleOutdatedNotice(show, newer, page, current) { const $exists = document.querySelector("#outdated-notice"); show !== null && show !== void 0 ? show : show = !$exists; if (show === Boolean($exists)) { if ($exists) { $exists.dataset.id = newer; $exists.dataset.page = page; } return; } if (show) { const $notice = document.createElement("div"); $notice.id = "outdated-notice"; $notice.classList.add("notice", "outdated"); $notice.dataset.id = newer; $notice.dataset.page = page; const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-clock-rotate-left"); $notice.appendChild($icon); const $text = document.createElement("span"); $text.classList.add("text"); $text.textContent = "Newer revision available on this page."; $notice.appendChild($text); const $restore = document.createElement("span"); $restore.classList.add("button"); $restore.innerHTML = "<i class='fas fa-redo restore'></i> Restore this revision"; $restore.addEventListener("click", async e => { e.preventDefault(); const message = await this.dialog.input("Restore Edit", "Are you sure you want to restore this revision? This will create a new edit that reverts the page to this revision.", "Edit summary (optional)", ""); if (message !== null) this.ws.execute({ actions: [ { name: "restore-edit", params: { summary: message } } ] }); }); $notice.appendChild($restore); const $latest = document.createElement("span"); $latest.classList.add("button"); $latest.innerHTML = "View latest <i class='fas fa-arrow-right'></i>"; $latest.addEventListener("click", e => { e.preventDefault(); const page = $notice.dataset.page; const id = +$notice.dataset.id; if (page && id) this.ws.queue.loadFromRevision(page, id); }); $notice.appendChild($latest); const $diff = document.querySelector("#diff-container"); $diff.parentElement.insertBefore($notice, $diff); } else { const $notice = document.querySelector("#outdated-notice"); if ($notice) $notice.remove(); } } togglePendingNotice(show, pending) { const $exists = document.querySelector("#pending-notice"); show !== null && show !== void 0 ? show : show = !$exists; if (show === Boolean($exists)) return; if (show) { const $notice = document.createElement("div"); $notice.id = "pending-notice"; $notice.classList.add("notice", "outdated", "pending"); const $icon = document.createElement("span"); $icon.classList.add("fa", "fa-shield-alt"); $notice.appendChild($icon); const $text = document.createElement("span"); $text.classList.add("text"); $text.textContent = pending ? "This revision cannot be reviewed because it is outdated" : "This revision cannot be reviewed because it is not pending review"; $notice.appendChild($text); const $diff = document.querySelector("#diff-container"); $diff.parentElement.insertBefore($notice, $diff); } else { const $notice = document.querySelector("#pending-notice"); if ($notice) $notice.remove(); } } getORESColor(ores) { if (isNaN(ores) || ores < 0) return "rgba(128, 128, 128, .5)"; // Grey for unknown ores = Math.min(Math.max(ores || 0, 0), 1); const palette = GUI.palettes[this.ws.store.UI.theme.palette]; return palette[ores * (palette.length - 1) | 0]; } updatePalette() { document.querySelectorAll("[data-ores]").forEach($el => { $el.style.setProperty("--ores-color", this.getORESColor(parseFloat($el.dataset.ores))); }); } updateZenMode() { this.ws.notifications.count(); const zen = this.ws.store.settings.zen_mode; if (zen.enabled && zen.music.enabled) this.ws.audio.zengine.start(); else this.ws.audio.zengine.stop(); document.querySelectorAll("[data-zen-show]").forEach($el => { const keys = $el.dataset.zenShow.split(","); if (zen.enabled && !keys.some(key => { var _zen$key; return (_zen$key = zen[key]) === null || _zen$key === void 0 ? void 0 : _zen$key.enabled; })) $el.style.display = "none"; else $el.style.display = ""; }); } updateAccessibility() { document.body.classList.toggle("colorblind-mode", this.ws.store.settings.accessibility.colorblind); document.body.classList.toggle("dyslexia-font", this.ws.store.settings.accessibility.dyslexia); document.body.classList.toggle("high-contrast", this.ws.store.settings.accessibility.high_contrast); document.body.classList.toggle("reduce-motion", this.ws.store.settings.accessibility.reduce_motion); } reorderQueues() { var _queues$find; const queues = _queue.Queue.types.map(type => ({ name: type, ...this.ws.store.settings.queue[type] })); queues.sort((a, b) => a.order - b.order); queues.forEach(queue => { const $tab = document.querySelector(`#queue-tab-${queue.name}`); if ($tab) { $tab.style.display = queue.enabled ? "" : "none"; $tab.parentElement.appendChild($tab); } }); const tab = queues.find(q => q.name === this.ws.queue.current.type) ? this.ws.queue.current.type : (_queues$find = queues.find(q => q.enabled)) === null || _queues$find === void 0 ? void 0 : _queues$find.name; if (tab) this.ws.queue.switch(tab); else { const $empty = document.createElement("div"); $empty.classList.add("queue-empty"); $empty.textContent = "No items in queue"; document.querySelector("#queue-items").innerHTML = $empty.outerHTML; this.newCurrentItem(null); this.ws.queue.switch("void"); } } updateQueueTabs(types = _queue.Queue.types) { const queues = this.ws.queue.queues; types.forEach(type => { const $tab = document.querySelector(`#queue-tab-${type}`); if (!$tab || !queues[type]) return; const $count = $tab.querySelector(":scope > span > .icon-count"); const len = queues[type].queue.length; $count.classList.toggle("hidden", len === 0); $count.textContent = len; $tab.classList.toggle("mentions-me", this.ws.store.settings.username_highlighting.enabled && queues[type].queue.some(item => item.mentions.has)); }); } createTooltip($target, className = "", content = "", isHTML = false, delay = 10, callback = null) { const $tooltip = document.createElement("div"); $tooltip.className = `tooltip ${className}`; $tooltip.style.opacity = 0; if (isHTML) $tooltip.innerHTML = content; else $tooltip.textContent = content; document.body.querySelector("#app").appendChild($tooltip); if (typeof callback === "function") callback($tooltip); $tooltip.offsetHeight; // Force reflow const tooltipRect = $tooltip.getBoundingClientRect(); const tw = tooltipRect.width; const th = tooltipRect.height; const targetRect = $target.getBoundingClientRect(); const gap = 10; const vw = innerWidth; const vh = innerHeight; // Position candidates: [name, x, y, shouldShift] const positions = [ // Try below first [ "bottom", (targetRect.left + targetRect.right) / 2 - tw / 2, targetRect.bottom + gap, true ], // Try above [ "top", (targetRect.left + targetRect.right) / 2 - tw / 2, targetRect.top - th - gap, true ], // Try right [ "right", targetRect.right + gap, (targetRect.top + targetRect.bottom) / 2 - th / 2, true ], // Try left [ "left", targetRect.left - tw - gap, (targetRect.top + targetRect.bottom) / 2 - th / 2, true ] ]; let bestPosition = null; let bestScore = -Infinity; for (const [name, x, y, canShift] of positions) { let posX = x, posY = y; // Check if position fits without wrapping if (posX >= 0 && posX + tw <= vw && posY >= 0 && posY + th <= vh) { // Perfect fit - score high bestScore = 100; bestPosition = [ posX, posY ]; break; } // If can shift, try to fit it within bounds if (canShift) { const shiftedX = Math.max(0, Math.min(posX, vw - tw)); const shiftedY = Math.max(0, Math.min(posY, vh - th)); // Check if shifted position overlaps target const overlaps = !(shiftedX + tw <= targetRect.left || shiftedX >= targetRect.right || shiftedY + th <= targetRect.top || shiftedY >= targetRect.bottom); // Score based on overlap and shift distance const shiftDist = Math.abs(shiftedX - x) + Math.abs(shiftedY - y); const score = overlaps ? -50 - shiftDist : 50 - shiftDist / 10; if (score > bestScore) { bestScore = score; bestPosition = [ shiftedX, shiftedY ]; } } } // Apply best position found if (bestPosition) { $tooltip.style.left = `${bestPosition[0]}px`; $tooltip.style.top = `${bestPosition[1]}px`; } else { // Last resort fallback $tooltip.style.left = `${Math.max(0, Math.min((targetRect.left + targetRect.right) / 2 - tw / 2, vw - tw))}px`; $tooltip.style.top = `${Math.max(0, Math.min((targetRect.top + targetRect.bottom) / 2 - th / 2, vh - th))}px`; } $target.addEventListener("mousewheel", e => $tooltip.scrollBy({ left: e.deltaX, top: e.deltaY, behavior: "smooth" })); setTimeout(() => $tooltip.style.opacity = 1, delay); return $tooltip; } removeTooltips() { document.querySelectorAll(".tooltip").forEach($tooltip => $tooltip.remove()); } addTooltipListener($el) { if (!$el.dataset.tooltip) return; let $tooltip; $el.addEventListener("mouseenter", () => { if (!$el.dataset.tooltip) return; else if ($tooltip) $tooltip.remove(); $tooltip = this.createTooltip($el, "", $el.dataset.tooltip, $el.dataset.tooltipHtml === "true", +$el.dataset.tooltipDelay || 100); }); $el.addEventListener("mouseleave", () => { if ($tooltip) { $tooltip.remove(); $tooltip = null; } }); } positionBottomMenu($button, $menu) { // Reset positioning $menu.style.left = ""; $menu.style.right = ""; $menu.style.top = ""; $menu.style.bottom = ""; const position = () => { if (!$menu.classList.contains("show")) return; const menuRect = $menu.getBoundingClientRect(); const buttonRect = $button.getBoundingClientRect(); const vw = innerWidth; const vh = innerHeight; const fitsLeft = buttonRect.left + menuRect.width <= vw; if (fitsLeft) { $menu.style.left = `${buttonRect.left}px`; $menu.style.right = "auto"; } else { $menu.style.right = `${vw - buttonRect.right}px`; $menu.style.left = "auto"; } const fitsAbove = buttonRect.top >= menuRect.height; if (fitsAbove) { $menu.style.bottom = `${vh - buttonRect.top}px`; $menu.style.top = "auto"; } else { $menu.style.top = `${buttonRect.bottom}px`; $menu.style.bottom = "auto"; } requestAnimationFrame(() => position()); }; requestAnimationFrame(() => position()); } positionSubmenu($submenu, $trigger) { // Reset positioning $submenu.style.left = ""; $submenu.style.right = ""; $submenu.style.top = ""; $submenu.style.bottom = ""; const position = () => { if (!$submenu.classList.contains("show")) return; const submenuRect = $submenu.getBoundingClientRect(); const triggerRect = $trigger.getBoundingClientRect(); const vw = innerWidth; const vh = innerHeight; const spaceRight = vw - triggerRect.right; const spaceLeft = triggerRect.left; if (spaceRight < submenuRect.width + 20 && spaceLeft > spaceRight) { $submenu.style.left = "auto"; $submenu.style.right = "calc(100% + 4px)"; } const spaceBelow = vh - triggerRect.bottom; const spaceAbove = triggerRect.top; if (submenuRect.bottom > vh && spaceAbove > spaceBelow) { $submenu.style.top = "auto"; $submenu.style.bottom = "0"; } requestAnimationFrame(() => position()); }; requestAnimationFrame(() => position()); } positionLevelsMenu($button, $menu) { // Reset previous positioning $menu.style.left = ""; $menu.style.right = ""; $menu.style.top = ""; $menu.style.bottom = ""; const position = () => { if (!$menu.classList.contains("show")) return; const menuRect = $menu.getBoundingClientRect(); const buttonRect = $button.getBoundingClientRect(); const vw = innerWidth; const vh = innerHeight; const spaceRight = vw - buttonRect.right; const spaceLeft = buttonRect.left; const fitsRight = spaceRight >= menuRect.width + 8; const fitsLeft = spaceLeft >= menuRect.width + 8; if (fitsRight) { $menu.style.left = `${buttonRect.right + 8}px`; $menu.style.right = "auto"; } else if (fitsLeft) { $menu.style.right = `${vw - buttonRect.left + 8}px`; $menu.style.left = "auto"; } else { if (spaceRight > spaceLeft) { $menu.style.left = `${buttonRect.right + 8}px`; $menu.style.right = "auto"; } else { $menu.style.right = `${vw - buttonRect.left + 8}px`; $menu.style.left = "auto"; } } const top = Math.max(Math.min(buttonRect.top + (buttonRect.height - menuRect.height) / 2, vh - menuRect.height - 8), 8); $menu.style.top = `${top}px`; $menu.style.bottom = "auto"; requestAnimationFrame(() => position()); }; requestAnimationFrame(() => position()); } positionWarningSubmenu($submenu, $trigger) { // Reset previous positioning $submenu.style.left = ""; $submenu.style.right = ""; $submenu.style.top = ""; $submenu.style.bottom = ""; const position = () => { if (!$submenu.classList.contains("show")) return; const submenuRect = $submenu.getBoundingClientRect(); const triggerRect = $trigger.getBoundingClientRect(); const vw = innerWidth; const vh = innerHeight; const spaceRight = vw - triggerRect.right; const spaceLeft = triggerRect.left; const fitsRight = spaceRight >= submenuRect.width + 8; const fitsLeft = spaceLeft >= submenuRect.width + 8; if (fitsRight) { $submenu.style.left = `${triggerRect.right + 8}px`; $submenu.style.right = "auto"; } else if (fitsLeft) { $submenu.style.right = `${vw - triggerRect.left + 8}px`; $submenu.style.left = "auto"; } else { if (spaceRight > spaceLeft) { $submenu.style.left = `${triggerRect.right + 8}px`; $submenu.style.right = "auto"; } else { $submenu.style.right = `${vw - triggerRect.left + 8}px`; $submenu.style.left = "auto"; } } const top = Math.max(Math.min(triggerRect.top + (triggerRect.height - submenuRect.height) / 2, vh - submenuRect.height - 8), 8); $submenu.style.top = `${top}px`; $submenu.style.bottom = "auto"; requestAnimationFrame(() => position()); }; requestAnimationFrame(() => position()); } createWarningItem(warning, executeWithWarn, executeNoWarn, key, isFavorite = false) { const favorites = this.ws.store.favorite[key]; const $item = document.createElement("div"); $item.classList.add("warning-menu-item"); if (isFavorite) { $item.draggable = true; $item.classList.add("favorite-item"); } else $item.classList.add("submenu-option"); $item.dataset.warning = warning.title; const $star = document.createElement("span"); $star.classList.add("favorite-star"); if (favorites.includes(warning.title)) { $star.classList.add("favorited"); $star.innerHTML = "<i class='fas fa-star'></i>"; } else $star.innerHTML = "<i class='fa-regular fa-star'></i>"; $item.appendChild($star); $star.addEventListener("click", e => { e.stopPropagation(); const i = favorites.indexOf(warning.title); const $menu = key === "reverts" ? document.querySelector("#revert-menu > .warning-menu") : document.querySelector("#warn-menu > .warning-menu"); if (i === -1) { favorites.push(warning.title); $star.classList.add("favorited", "spin"); $star.innerHTML = "<i class='fas fa-star'></i>"; let $favorites = $menu.querySelector(".favorites-section"); if (!$favorites) { $favorites = document.createElement("div"); $favorites.className = "favorites-section"; const $header = document.createElement("div"); $header.className = "favorites-header"; $header.innerHTML = '<span class="icon fas fa-star"></span><span>Favorites</span>'; $favorites.appendChild($header); const $container = document.createElement("div"); $container.className = "favorites-container"; $favorites.appendChild($container); $menu.insertBefore($favorites, $menu.firstChild); const $separator = document.createElement("div"); $separator.className = "favorites-separator"; $menu.insertBefore($separator, $favorites.nextSibling); } const executeCallbacks = $menu.__executeCallbacks__; if (executeCallbacks) $favorites.querySelector(".favorites-container").appendChild(this.createWarningItem(warning, executeCallbacks.executeWithWarn, executeCallbacks.executeNoWarn, key, true)); } else { favorites.splice(i, 1); $star.classList.remove("favorited"); $star.classList.add("spin"); $star.innerHTML = "<i class='fa-regular fa-star'></i>"; if (isFavorite) { $item.remove(); const $favorites = $menu.querySelector(".favorites-section"); if (($favorites === null || $favorites === void 0 ? void 0 : $favorites.querySelector(".favorites-container").children.length) === 0) { var _$menu$querySelector; $favorites.remove(); (_$menu$querySelector = $menu.querySelector(".favorites-separator")) === null || _$menu$querySelector === void 0 || _$menu$querySelector.remove(); } const $subitem = document.body.querySelector(`.warning-menu-item:not(.favorite-item)[data-warning="${warning.title}"]`); if ($subitem) { const $star = $subitem.querySelector(".favorite-star"); $star.classList.remove("favorited"); $star.innerHTML = "<i class='fa-regular fa-star'></i>"; $star.classList.add("spin"); setTimeout(() => $star.classList.remove("spin"), 500); } } else { const $favorites = $menu.querySelector(".favorites-section"); if ($favorites) { const $favorite = $favorites.querySelector(`[data-warning="${warning.title}"]`); if ($favorite) { $favorite.remove(); if ($favorites.querySelector(".favorites-container").children.length === 0) { var _$menu$querySelector2; $favorites.remove(); (_$menu$querySelector2 = $menu.querySelector(".favorites-separator")) === null || _$menu$querySelector2 === void 0 || _$menu$querySelector2.remove(); } } } } } setTimeout(() => $star.classList.remove("spin"), 500); }); const $icon = document.createElement("span"); $icon.className = `icon ${warning.icon}`; $item.appendChild($icon); const $label = document.createElement("span"); $label.className = "warning-menu-title"; $label.textContent = warning.title; $item.appendChild($label); const $helpIcon = document.createElement("span"); $helpIcon.className = "fas fa-circle-question"; $helpIcon.dataset.tooltip = `${warning.description} (click for template preview)`; $item.appendChild($helpIcon); this.addTooltipListener($helpIcon); $helpIcon.addEventListener("click", async event => { event.preventDefault(); event.stopPropagation(); const ws = this.ws; this.dialog.show(warning.title, async function() { const previews = await Promise.allSettled(warning.templates.map(template => { const item = ws.queue.current.item; return ws.api.parse(`{{${template.template}|${item.page.title}}}`, `User:${item.user.name}`, true); })); const content = previews.map(result => { let html = ""; if (result.status === "fulfilled") html = result.value; else html = `<em>Error loading template preview: ${result.reason}</em>`; const parser = new DOMParser; const doc = parser.parseFromString(html, "text/html"); const $preview = doc.body; $preview.querySelectorAll("[href]").forEach($link => { const href = $link.getAttribute("href"); $link.setAttribute("href", new URL(href, `https://${ws.server}`).href); }); $preview.querySelectorAll("[src]").forEach($img => { const src = $img.getAttribute("src"); $img.setAttribute("src", new URL(src, `https://${ws.server}`).href); }); $preview.querySelectorAll("[srcset]").forEach($img => { const srcset = $img.getAttribute("srcset"); const newSrcset = srcset.split(",").map(part => { const [url, descriptor] = part.trim().split(/\s+/, 2); const newUrl = new URL(url, `https://${ws.server}`).href; return descriptor ? `${newUrl} ${descriptor}` : newUrl; }).join(", "); $img.setAttribute("srcset", newSrcset); }); return $preview.innerHTML; }); return content.join("<div style='height: 1px; background: #0004; margin: 8px 0;'></div>"); }()); }); if (!isFavorite) { const $button = document.createElement("div"); $button.classList.add("warning-menu-buttons"); if (key === "reverts") { const $noWarn = document.createElement("span"); $noWarn.className = "warning-menu-button warning-menu-no-warn-button"; $noWarn.textContent = "no warn"; $button.appendChild($noWarn); $noWarn.addEventListener("click", async e => { e.stopPropagation(); await executeNoWarn(warning.title); }); } const $levelsButton = document.createElement("span"); $levelsButton.className = "warning-menu-button warning-menu-levels-button"; $levelsButton.textContent = "advanced"; $button.appendChild($levelsButton); $item.appendChild($button); const $levelsMenu = document.createElement("div"); $levelsMenu.className = "levels-menu"; for (const template of warning.templates) { if (template.generic) continue; const $levelButton = document.createElement("span"); $levelButton.className = `levels-menu-item colorize-level colorize-level-${template.name}`; $levelButton.textContent = template.name; $levelsMenu.appendChild($levelButton); $levelButton.addEventListener("click", async () => await executeWithWarn(warning.title, template.name)); } document.body.querySelector("#app").appendChild($levelsMenu); $levelsButton.addEventListener("click", e => { e.stopPropagation(); const wasShown = $levelsMenu.classList.contains("show"); document.body.querySelectorAll(".levels-menu.show").forEach(menu => menu.classList.remove("show")); if (!wasShown) { $levelsMenu.classList.add("show"); this.positionLevelsMenu($levelsButton, $levelsMenu); } }); } $item.addEventListener("click", async e => { if (e.target.closest(".warning-menu-button") || e.target.closest(".favorite-star")) return; await executeWithWarn(warning.title, "auto"); }); if (isFavorite) { $item.addEventListener("dragstart", e => { e.dataTransfer.effectAllowed = "move"; e.dataTransfer.setData("text/plain", warning.title); $item.classList.add("dragging"); }); $item.addEventListener("dragend", () => { $item.classList.remove("dragging"); }); $item.addEventListener("dragover", e => { e.preventDefault(); e.dataTransfer.dropEffect = "move"; const draggingItem = document.querySelector(".dragging"); if (draggingItem && draggingItem !== $item) { const rect = $item.getBoundingClientRect(); const midpoint = rect.top + rect.height / 2; if (e.clientY < midpoint) $item.parentNode.insertBefore(draggingItem, $item); else $item.parentNode.insertBefore(draggingItem, $item.nextSibling); } }); $item.addEventListener("drop", e => { e.preventDefault(); const favoriteItems = Array.from($item.closest(".favorites-section").querySelectorAll(".favorite-item")); this.ws.store.favorite[key] = favoriteItems.map(el => el.dataset.warning); }); } return $item; } createWarnMenu(type, $container, item) { var _this$ws$queue$curren0, _this$ws$queue$curren1, _this$ws$queue$curren10; removeEventListener("keydown", this.warningMenuKeyListener); document.querySelectorAll(".levels-menu").forEach($menu => $menu.remove()); document.querySelectorAll(".warning-submenu").forEach($submenu => $submenu.remove()); const $menu = document.createElement("div"); $menu.className = "warning-menu"; $container.appendChild($menu); $menu.addEventListener("click", e => { if (!e.target.closest(".warning-submenu")) document.body.querySelectorAll(".warning-submenu.show").forEach($submenu => $submenu.classList.remove("show")); if (!e.target.closest(".levels-menu")) document.body.querySelectorAll(".levels-menu.show").forEach($menu => $menu.classList.remove("show")); }); const executeWithWarn = async (warningTitle, level) => { const warning = (0, _warnings.getWarningFromLookup)(warningTitle); const reportObject = { name: "if", condition: { name: "user-final-warning" }, actions: [ { name: "report-user-to-aiv", params: { reportMessage: "Vandalism past final warning" } } ] }; const autoReporting = this.ws.store.settings.auto_report; await this.ws.execute({ actions: [ { name: "next-item", params: {} }, type === "reverts" ? { name: "rollback-edit", params: { summary: warning.summary } } : {}, { name: "warn-user", params: { warning: warningTitle, level } }, { name: "highlight-user", params: {} } ].concat(autoReporting.enabled && warning.reportable && autoReporting.for.has(warningTitle) ? [ reportObject ] : []) }); }; const executeNoWarn = async warningTitle => { const warning = (0, _warnings.getWarningFromLookup)(warningTitle); await this.ws.execute({ actions: [ { name: "next-item", params: {} }, { name: "rollback-edit", params: { summary: warning.summary } } ] }); }; const itemType = (_this$ws$queue$curren0 = (_this$ws$queue$curren1 = this.ws.queue.current.item) === null || _this$ws$queue$curren1 === void 0 ? void 0 : _this$ws$queue$curren1.type) !== null && _this$ws$queue$curren0 !== void 0 ? _this$ws$queue$curren0 : this.ws.queue.current.type; let group = _queue.Queue.groups[itemType]; if (itemType === "abuselog" && (_this$ws$queue$curren10 = this.ws.queue.current.item) !== null && _this$ws$queue$curren10 !== void 0 && _this$ws$queue$curren10.revid) group = "edit"; $menu.__executeCallbacks__ = { executeWithWarn, executeNoWarn }; if (this.ws.store.favorite.reverts.length > 0) { const $favorites = document.createElement("div"); $favorites.className = "favorites-section"; const $header = document.createElement("div"); $header.className = "favorites-header"; $header.innerHTML = '<span class="icon fas fa-star"></span><span>Favorites</span>'; $favorites.appendChild($header); const $container = document.createElement("div"); $container.className = "favorites-container"; $favorites.appendChild($container); const allWarnings = Object.values(_warnings.warningsLookup).filter(w => w.queueType.includes(group) && (!item || typeof w.show !== "function" || w.show(item))); for (const favorite of this.ws.store.favorite[type]) { const warning = allWarnings.find(w => w.title === favorite); if (warning) { const $item = this.createWarningItem(warning, executeWithWarn, executeNoWarn, type, true); $container.appendChild($item); } } $menu.appendChild($favorites); const $separator = document.createElement("div"); $separator.className = "favorites-separator"; $menu.appendChild($separator); } let allMade = 0; for (const [, category] of Object.entries(_warnings.warnings)) { let categoryMade = 0; const categoryWarnings = []; for (const warning of category.warnings) { if (typeof warning.show === "function" && !warning.show(item)) continue; if (!warning.queueType.includes(group)) continue; categoryWarnings.push(warning); categoryMade++; allMade++; } if (categoryMade === 0) continue; const $option = document.createElement("div"); $option.className = "menu-option submenu-trigger"; const $icon = document.createElement("span"); $icon.className = `icon ${category.icon}`; $option.appendChild($icon); const $label = document.createElement("span"); $label.textContent = category.title; $option.appendChild($label); const $arrowIcon = document.createElement("span"); $arrowIcon.className = "submenu-arrow fas fa-chevron-right"; $option.appendChild($arrowIcon); $menu.appendChild($option); const $submenu = document.createElement("div"); $submenu.className = "warning-submenu submenu"; document.body.querySelector("#app").appendChild($submenu); for (const warning of categoryWarnings) { const $item = this.createWarningItem(warning, executeWithWarn, executeNoWarn, type, false); $submenu.appendChild($item); } $option.addEventListener("click", e => { e.stopPropagation(); const wasShown = $submenu.classList.contains("show"); document.body.querySelectorAll(".warning-submenu.show").forEach($menu => { if ($menu !== $submenu) { $menu.classList.remove("show"); document.body.querySelectorAll(".levels-menu.show").forEach($menu => $menu.classList.remove("show")); } }); if (!wasShown) { $option.classList.add("focus-opened"); $submenu.classList.add("show"); this.positionWarningSubmenu($submenu, $option); } else { $option.classList.remove("focus-opened"); $submenu.classList.remove("show"); document.body.querySelectorAll(".levels-menu.show").forEach($menu => $menu.classList.remove("show")); } }); } if (allMade === 0) { const $noWarnings = document.createElement("div"); $noWarnings.className = "warning-menu-no-items"; $noWarnings.textContent = "No warnings available for this edit."; $menu.appendChild($noWarnings); } addEventListener("keydown", this.warningMenuKeyListener); } warningMenuKeyListener(event) { if (event.key === "Tab") { const $activeMenu = document.querySelector("#warn-menu.show, #revert-menu.show"); if ($activeMenu) { const $selectedMenu = $activeMenu.querySelector(":scope > div > .menu-option.focus-opened"); if ($selectedMenu) { const $submenu = document.body.querySelector(".submenu.show"); if ($submenu) { const $focusable = $submenu.querySelectorAll(":scope > .warning-menu-item"); if ($focusable.length > 0) { const index = Array.from($focusable).indexOf($submenu.querySelector(".focus-visible")); const nextIndex = (index + (event.shiftKey ? -1 : 1) + $focusable.length) % $focusable.length; document.querySelectorAll(".focus-visible").forEach($item => $item.classList.remove("focus-visible")); $focusable[nextIndex].classList.add("focus-visible"); event.preventDefault(); } } } else { const $focusable = $activeMenu.querySelectorAll(`:scope > div > .favorites-section > .favorites-container > .warning-menu-item,\n\t\t\t\t\t\t :scope > div > .menu-option`); if ($focusable.length > 0) { const index = Array.from($focusable).indexOf($activeMenu.querySelector(".focus-visible")); const nextIndex = (index + (event.shiftKey ? -1 : 1) + $focusable.length) % $focusable.length; document.querySelectorAll(".focus-visible").forEach($item => $item.classList.remove("focus-visible")); $focusable[nextIndex].classList.add("focus-visible"); event.preventDefault(); } } } } else if (event.key === "Enter") { const $activeMenu = document.querySelector("#warn-menu.show, #revert-menu.show"); if ($activeMenu) { const $focused = document.querySelector(".focus-visible"); if ($focused) { $focused.click(); event.preventDefault(); } } } else if (event.key === "Escape") { const $activeMenu = document.querySelector("#warn-menu.show, #revert-menu.show"); if ($activeMenu) { const $opened = document.querySelector(".focus-opened"); if ($opened) { $opened.classList.remove("focus-opened"); $opened.classList.add("focus-visible"); $opened.click(); } else { document.querySelectorAll(".bottom-tool-menu").forEach($menu => $menu.classList.remove("show")); document.querySelectorAll(".bottom-tool-trigger").forEach($trigger => $trigger.classList.remove("active")); document.querySelectorAll(".submenu").forEach($submenu => $submenu.classList.remove("show")); document.querySelectorAll(".levels-menu").forEach($menu => $menu.classList.remove("show")); } event.preventDefault(); } } } closeMenus() { document.querySelectorAll(".bottom-tool-menu").forEach($menu => $menu.classList.remove("show")); document.querySelectorAll(".bottom-tool-trigger").forEach($trigger => $trigger.classList.remove("active")); document.querySelectorAll(".submenu").forEach($submenu => $submenu.classList.remove("show")); document.querySelectorAll(".levels-menu").forEach($menu => $menu.classList.remove("show")); } } exports.GUI = GUI; function _sanitizeInlineHtml(html) { const allowed = new Set([ "B", "I", "EM", "STRONG", "CODE", "SPAN", "BR" ]); const container = document.createElement("div"); container.innerHTML = html; const walk = node => { const children = [ ...node.childNodes ]; for (const child of children) { if (child.nodeType === Node.ELEMENT_NODE) { if (!allowed.has(child.tagName)) { child.replaceWith(...child.childNodes); } else { // strip all attributes while (child.attributes.length > 0) child.removeAttribute(child.attributes[0].name); walk(child); } } } }; walk(container); return container.innerHTML; } _defineProperty(GUI, "palettes", { traffic: (0, _buildPalette.BuildPalette)(1e3, "#78c675", "#fdff7a", "#fcff54", "#fbff12", "#ffc619", "#ff8812", "#f56214", "#f73214", "#fc0303", "#fc0303"), magma: (0, _buildPalette.BuildPalette)(1e3, "#000004", "#1b0c41", "#4a0c6b", "#781c6d", "#a52c60", "#cf4446", "#ed6925", "#fb9b06", "#f7d13d", "#fcffa4"), plasma: (0, _buildPalette.BuildPalette)(1e3, "#0d0887", "#46039f", "#7201a8", "#9c179e", "#bd3786", "#d8576b", "#ed7953", "#fb9f3a", "#fdca26", "#f0f921"), viridis: (0, _buildPalette.BuildPalette)(1e3, "#440154", "#3b528b", "#21918c", "#5ec962", "#fde725"), natural: (0, _buildPalette.BuildPalette)(1e3, "#ffffff", "#18ff18"), cool: (0, _buildPalette.BuildPalette)(1e3, "#ffffff", "#1818ff"), heat: (0, _buildPalette.BuildPalette)(1e3, "#ffffff", "#ff1818"), grey: (0, _buildPalette.BuildPalette)(1e3, "#000000", "#ffffff") }); /***/ }, /***/ 4674(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Notifications = void 0; class Notifications { constructor(ws) { this.ws = ws; this.first = {}; [ "alert", "message" ].forEach(type => { this[type] = []; this.update(type); this.first[type] = true; this.load(type); }); } find(type, id) { if ((type !== null && type !== void 0 ? type : false) === false) { let notification = this.alert.find(n => n.id === id); if (notification) return { type: "alert", notification }; notification = this.message.find(n => n.id === id); if (notification) return { type: "message", notification }; return undefined; } else return this[type].find(n => n.id === id); } async load(type) { try { const response = (await this.ws.api.continuous({ action: "query", meta: "notifications", notlimit: "max", notprop: "list", notfilter: "!read", notsections: type, notformat: "model" })).responses.flatMap(response => { var _response$query; return ((_response$query = response.query) === null || _response$query === void 0 || (_response$query = _response$query.notifications) === null || _response$query === void 0 ? void 0 : _response$query.list) || []; }); await Promise.all(response.map(async n => this.ws.api.parse(n["*"].body).then(parsed => { var _n$$parsed; return (_n$$parsed = void (n["*"].parsed = parsed)) !== null && _n$$parsed !== void 0 ? _n$$parsed : n; }))); let update = false; for (const n of response) { if (!this[type].some(existing => existing.id === n.id && existing.read === n.read)) { this[type].unshift(n); update = true; } } if (update) { const zen = this.ws.store.settings.zen_mode; if (!zen.enabled || zen[`${type}s`].enabled) this.ws.audio.playSound([ "notification", type ]); this.update(type); } } finally { setTimeout(() => this.load(type), 10 * 1e3); } } update(type) { this.count(); const notifications = this[type]; const unread = notifications.filter(n => !n.read); const zen = this.ws.store.settings.zen_mode; if (!zen.enabled || zen[`${type}s`].enabled) unread.filter(n => !n.seen && !n.notified).forEach(n => { n.notified = true; if (!this.first[type]) electron.sendNotification({ title: this.ws.util.textify(n["*"].header), body: this.ws.util.textify(n["*"].body) }, n["*"].links.primary.url); }); this.first[type] = false; const $count = document.querySelector(`#${type}s-count`); const $list = document.querySelector(`#${type}s-list`); $count.textContent = unread.length; $count.classList.toggle("hidden", unread.length === 0); if (notifications.length === 0) $list.innerHTML = `<div class="notifications-empty">No new ${type}s</div>`; else { $list.innerHTML = ""; notifications.forEach(notification => { const model = notification["*"]; { // create element const $notification = document.createElement("div"); $notification.classList.add("notification"); $notification.classList.add(notification.read ? "read" : "unread"); $notification.addEventListener("click", () => { this.read(type, notification); this.ws.open(model.links.primary.url); }); { // icon const $icon = document.createElement("div"); $icon.classList.add("notification-icon"); $icon.innerHTML = `<img src="${new URL(model.iconUrl, `https://${this.ws.server}/`).toString()}" alt="icon">`; $notification.appendChild($icon); } { // content const $content = document.createElement("div"); $content.classList.add("notification-content"); $notification.appendChild($content); { // header const $header = document.createElement("div"); $header.classList.add("notification-header"); $header.innerHTML = this.ws.util.truncate(model.header, 100); $content.appendChild($header); } { // body const $body = document.createElement("div"); $body.classList.add("notification-body"); $body.innerHTML = model.parsed; $content.appendChild($body); $body.querySelectorAll("[href]").forEach($link => { const href = $link.getAttribute("href"); $link.setAttribute("href", new URL(href, `https://${this.ws.server}`).href); }); $body.querySelectorAll("[src]").forEach($img => { const src = $img.getAttribute("src"); $img.setAttribute("src", new URL(src, `https://${this.ws.server}`).href); }); $body.querySelectorAll("[srcset]").forEach($img => { const srcset = $img.getAttribute("srcset"); const newSrcset = srcset.split(",").map(part => { const [url, descriptor] = part.trim().split(/\s+/, 2); const newUrl = new URL(url, `https://${this.ws.server}`).href; return descriptor ? `${newUrl} ${descriptor}` : newUrl; }).join(", "); $img.setAttribute("srcset", newSrcset); }); $body.querySelectorAll("a").forEach(link => { link.target = "_blank"; }); } { // links const $links = document.createElement("div"); $links.classList.add("notification-links"); model.links.secondary.forEach(link => { const $link = document.createElement("a"); $link.href = link.url; $link.target = "_blank"; $link.textContent = link.label; $links.appendChild($link); }); $content.appendChild($links); } } { // right const $right = document.createElement("div"); $right.classList.add("notification-right"); $notification.appendChild($right); if (!notification.read) { { // unread indicator const $unread = document.createElement("div"); $unread.classList.add("notification-unread-indicator"); $unread.addEventListener("click", e => { e.stopPropagation(); this.read(type, notification); }); $right.appendChild($unread); } } { // time const $time = document.createElement("div"); $time.classList.add("notification-timestamp"); $time.dataset.time = notification.timestamp.utciso8601; $time.dataset.timeFormat = "notification"; $time.textContent = this.ws.util.formatNotificationTime(new Date(notification.timestamp.utciso8601)); $right.appendChild($time); } } $list.appendChild($notification); } }); } } seen(type) { this.ws.api.postWithToken({ action: "echomarkseen", type }); this[type].forEach(n => n.seen = true); } read(type, notification) { if (notification) { notification.read = true; this.update(type); this.ws.api.postWithToken({ action: "echomarkread", sections: type, list: notification.id }); } else { this[type].forEach(n => n.read = true); this.update(type); this.ws.api.postWithToken({ action: "echomarkread", sections: type, all: true }); } } count() { var _this$alert, _this$message; const zen = this.ws.store.settings.zen_mode; let unread = 0; if (!zen.enabled || zen.alerts.enabled) unread += ((_this$alert = this.alert) === null || _this$alert === void 0 ? void 0 : _this$alert.filter(n => !n.read).length) || 0; if (!zen.enabled || zen.messages.enabled) unread += ((_this$message = this.message) === null || _this$message === void 0 ? void 0 : _this$message.filter(n => !n.read).length) || 0; electron.setBadgeCount(unread); if (unread > 0) document.title = `(${unread}) WikiShield`; else document.title = `WikiShield`; } } exports.Notifications = Notifications; /***/ }, /***/ 6151(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ProgressBar = void 0; class ProgressBar { constructor() { this.$bar = document.createElement("div"); this.$bar.classList.add("progress-bar"); this.$bar.style.opacity = 1; document.querySelector("#progress-bar-container").appendChild(this.$bar); this.$overlay = document.createElement("div"); this.$overlay.classList.add("progress-bar-overlay"); this.$overlay.style.width = "0%"; this.$bar.appendChild(this.$overlay); this.$text = document.createElement("div"); this.$text.classList.add("progress-bar-text"); this.$bar.appendChild(this.$text); } set(text, portion, error) { this.$text.textContent = text; this.$overlay.style.width = `${Math.min(Math.max(portion, 0), 1) * 100}%`; this.$bar.classList.toggle("error", error); if (portion >= 1) setTimeout(() => { this.$bar.style.opacity = 0; setTimeout(() => this.$bar.remove(), 300); }, 1700); } } exports.ProgressBar = ProgressBar; }, /***/ 9117(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Settings = void 0; var _class = __webpack_require__(8678); var _conditions = __webpack_require__(870); var _controlKeys = __webpack_require__(9808); var _events = __webpack_require__(985); var _queue = __webpack_require__(372); var _wikishield = __webpack_require__(7054); var _namespaces = __webpack_require__(4018); var _manager = __webpack_require__(9501); var _warnings = __webpack_require__(955); var _scripts = __webpack_require__(5564); var _text = __webpack_require__(2069); var _gui = __webpack_require__(8469); function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } // TODO make watching, whitelisting, and highlighting require times as a param const formatTime = ms => { const seconds = Math.floor(ms / 1e3); const days = Math.floor(seconds / 86400); const hours = Math.floor(seconds % 86400 / 3600); const mins = Math.floor(seconds % 3600 / 60); const secs = seconds % 60; let str = ""; if (days > 0) str += `${days}d `; if (hours > 0) str += `${hours}h `; if (mins > 0) str += `${mins}m `; str += `${secs}s`; return str.trim(); }; var _keypressListener = new WeakMap; var _promiseResolve = new WeakMap; var _promise = new WeakMap; class Settings { constructor(ws) { _classPrivateFieldInitSpec(this, _keypressListener, void 0); _classPrivateFieldInitSpec(this, _promiseResolve, void 0); _classPrivateFieldInitSpec(this, _promise, void 0); this.ws = ws; this.ws.api.getTags().then(tags => { this.wikipediaTags = tags; }); } get active() { return document.querySelector("#settings-container > .settings > .settings-right > div:not(.hidden)"); } controller(event) { const key = event.key.toLowerCase(); if (!_classPrivateFieldGet(_keypressListener, this)) { if (key === "escape" && event.type === "keydown") this.close(); return; } else if (key === "escape") return _classPrivateFieldGet(_keypressListener, this).call(this, "escape", true); if (key === "control" || key === "shift" || key === "alt" || _controlKeys.controls.has(key)) { event.preventDefault(); switch (event.type) { case "keydown": { _classPrivateFieldGet(_keypressListener, this).call(this, (0, _controlKeys.buildShortcut)(event), false); } break; case "keyup": { _classPrivateFieldGet(_keypressListener, this).call(this, (0, _controlKeys.buildShortcut)(event), true); } break; } } } collapsible($container, titleCallback, desc, collapsed = true) { const $collapse = document.createElement("div"); $collapse.className = "settings-section collapsible"; $container.appendChild($collapse); const $header = document.createElement("div"); $header.className = "settings-section-header collapse-title"; $header.textContent = titleCallback(collapsed); $collapse.appendChild($header); const $content = document.createElement("div"); $content.className = "collapse-content collapsible"; $collapse.appendChild($content); const $desc = document.createElement("div"); $desc.className = "settings-section-desc"; $desc.textContent = desc; $content.appendChild($desc); if (collapsed) { $content.style.height = "0px"; $content.style.opacity = 0; $content.style.overflow = "hidden"; $collapse.classList.add("collapsed"); } else { $content.style.height = "auto"; $content.style.opacity = 1; $content.style.overflow = "visible"; $collapse.classList.remove("collapsed"); } let isAnimating = false, animationFrame; let startTime, startHeight, startOpacity, targetHeight, targetOpacity; const duration = 300; const ease = t => t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t; const animate = timestamp => { if (!startTime) startTime = timestamp; const elapsed = timestamp - startTime; const progress = Math.min(elapsed / duration, 1); const eased = ease(progress); const height = startHeight + (targetHeight - startHeight) * eased; const opacity = startOpacity + (targetOpacity - startOpacity) * eased; $content.style.height = `${height}px`; $content.style.opacity = opacity; if (progress < 1) animationFrame = requestAnimationFrame(animate); else { if (!collapsed) { $content.style.height = "auto"; $content.style.overflow = "visible"; } else $content.style.overflow = "hidden"; isAnimating = false; animationFrame = null; startTime = null; } }; const toggle = () => { if (isAnimating) { cancelAnimationFrame(animationFrame); const computedHeight = $content.getBoundingClientRect().height; startHeight = computedHeight; startOpacity = parseFloat(getComputedStyle($content).opacity); } else { startHeight = collapsed ? 0 : $content.scrollHeight; startOpacity = collapsed ? 0 : 1; } collapsed = !collapsed; $header.textContent = titleCallback(collapsed); $collapse.classList.toggle("collapsed", collapsed); $content.style.overflow = "hidden"; if (collapsed) { targetHeight = 0; targetOpacity = 0; } else { targetHeight = $content.scrollHeight; targetOpacity = 1; } isAnimating = true; startTime = null; animationFrame = requestAnimationFrame(animate); }; $header.addEventListener("click", toggle); return $content; } start() { electron.onOpenChangelog(() => { var _this$open; return (_this$open = void this.open()) !== null && _this$open !== void 0 ? _this$open : this.changelog(); }); let cockBlock = 0; document.querySelector("#settings-container").addEventListener("click", e => { if (e.target.id === "settings-container" && !(cockBlock = Math.max(0, cockBlock))) this.close(); }); document.querySelector("#settings-general-button").addEventListener("click", this.general.bind(this)); document.querySelector("#settings-audio-button").addEventListener("click", this.audio.bind(this)); document.querySelector("#settings-controls-button").addEventListener("click", this.controls.bind(this)); document.querySelector("#settings-zen-button").addEventListener("click", this.zen.bind(this)); document.querySelector("#settings-app-button").addEventListener("click", this.app.bind(this)); document.querySelector("#settings-queue-button").addEventListener("click", this.queue.bind(this)); document.querySelector("#settings-accessibility-button").addEventListener("click", this.accessibility.bind(this)); document.querySelector("#settings-AI-button").addEventListener("click", this.AI.bind(this)); document.querySelector("#settings-auto-reporting-button").addEventListener("click", this.autoReporting.bind(this)); document.querySelector("#settings-gadgets-button").addEventListener("click", this.gadgets.bind(this)); document.querySelector("#settings-whitelist-users-button").addEventListener("click", this.whitelist.bind(this, "user")); document.querySelector("#settings-whitelist-pages-button").addEventListener("click", this.whitelist.bind(this, "page")); document.querySelector("#settings-whitelist-tags-button").addEventListener("click", this.whitelist.bind(this, "tag")); document.querySelector("#settings-highlight-users-button").addEventListener("click", this.highlight.bind(this, "user")); document.querySelector("#settings-highlight-pages-button").addEventListener("click", this.highlight.bind(this, "page")); document.querySelector("#settings-highlight-tags-button").addEventListener("click", this.highlight.bind(this, "tag")); document.querySelector("#settings-statistics-button").addEventListener("click", this.statistics.bind(this)); document.querySelector("#settings-save-button").addEventListener("click", this.save.bind(this)); document.querySelector("#settings-changelog-button").addEventListener("click", this.changelog.bind(this)); document.querySelector("#settings-about-button").addEventListener("click", this.about.bind(this)); { const $slider = document.querySelector("#settings-ores-bias"); const $track = $slider.querySelector(".settings-slider-track"); const $thumb = $slider.querySelector(".settings-slider-thumb"); const $leftLabel = $slider.querySelector(".settings-slider-label-left"); const $leftPercent = $leftLabel.querySelector(".percent"); const $rightLabel = $slider.querySelector(".settings-slider-label-right"); const $rightPercent = $rightLabel.querySelector(".percent"); const updateValue = value => { this.ws.store.settings.queue.ores_bias = +value.toFixed(2); value = Math.max(0, Math.min(100, Math.round(value * 100))); $thumb.style.left = `${value}%`; $track.style.setProperty("--fill", `${value}%`); const left = 100 - value; $leftPercent.textContent = `${left}%`; $leftLabel.classList.toggle("active", left > 0); const right = value; $rightPercent.textContent = `${right}%`; $rightLabel.classList.toggle("active", right > 0); }; const getValue = e => { const rect = $track.getBoundingClientRect(); return (e.clientX - rect.left) / rect.width; }; $track.addEventListener("click", e => updateValue(getValue(e))); let dragging = false; $thumb.addEventListener("mousedown", e => { e.preventDefault(); dragging = true; cockBlock++; $thumb.classList.add("dragging"); }); window.addEventListener("mousemove", e => { if (!dragging) return; updateValue(getValue(e)); }); window.addEventListener("mouseup", () => { if (!dragging) return; dragging = false; cockBlock--; $thumb.classList.remove("dragging"); }); updateValue(this.ws.store.settings.queue.ores_bias); } { const $edits = document.querySelector("#settings-maximum-edit-count"); $edits.value = this.ws.store.settings.queue.max_edits; $edits.addEventListener("change", e => { const max = +e.target.value; this.ws.store.settings.queue.max_edits = max; for (const [user, count] of this.ws.queue.bypass.entries()) if (count <= max) this.ws.queue.bypass.delete(user); }); const $size = document.querySelector("#settings-maximum-queue-size"); $size.value = this.ws.store.settings.queue.max_size; $size.addEventListener("change", e => this.ws.store.settings.queue.max_size = +e.target.value); const $ores = document.querySelector("#settings-minimum-ores-score"); $ores.value = this.ws.store.settings.queue.min_ores; $ores.addEventListener("change", e => this.ws.store.settings.queue.min_ores = +e.target.value); const $watchlist = document.querySelector("#settings-watchlist-expiry"); $watchlist.value = this.ws.store.settings.expiry.watchlist; $watchlist.addEventListener("change", e => this.ws.store.settings.expiry.watchlist = e.target.value); const $ns = document.querySelector("#settings-namespaces-container"); $ns.innerHTML = ""; _namespaces.namespaces.forEach(ns => { const $item = document.createElement("div"); $item.className = "namespace-item"; $item.dataset.namespaceId = ns.id; $item.innerHTML = `\n\t\t\t\t\t<label class="checkbox-box">\n\t\t\t\t\t\t<input type="checkbox" autoComplete="off">\n\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t</label>\n\t\t\t\t\t<span class="namespace-name">${ns.name}</span>\n\t\t\t\t`; const $checkbox = $item.querySelector("input[type=checkbox]"); $checkbox.checked = this.ws.store.settings.namespaces.includes(ns.id); $checkbox.addEventListener("change", e => { if (e.target.checked) { if (!this.ws.store.settings.namespaces.includes(ns.id)) this.ws.store.settings.namespaces.push(ns.id); } else { const index = this.ws.store.settings.namespaces.indexOf(ns.id); if (index !== -1) this.ws.store.settings.namespaces.splice(index, 1); } }); $ns.appendChild($item); }); } { const $ores = document.querySelector("#settings-ORES-alert-toggle"); $ores.value = this.ws.store.settings.audio.ores_alert.enabled; $ores.addEventListener("change", e => { this.ws.store.settings.audio.ores_alert.enabled = $ores.value; }); const $threshold = document.querySelector("#settings-ORES-alert-threshold"); $threshold.value = this.ws.store.settings.audio.ores_alert.threshold; $threshold.addEventListener("change", e => { this.ws.store.settings.audio.ores_alert.threshold = +$threshold.value; }); const $master = document.querySelector("#settings-master-volume"); $master.value = this.ws.store.settings.audio.volume.master; $master.addEventListener("change", e => { this.ws.store.settings.audio.volume.master = +$master.value; }); const build = { sound: ($el, path, title, desc, preview) => { const key = [ "master", ...path ].join("."); const $volume = document.createElement("volume-control"); $volume.setAttribute("title", title); $volume.setAttribute("description", desc); if (preview) $volume.setPreview(this.ws.audio, path); $volume.value = this.ws.store.settings.audio.volume[key]; $volume.addEventListener("change", () => { const current = this.ws.store.settings.audio.volume[key]; this.ws.store.settings.audio.volume[key] = $volume.value; if (current !== $volume.value) this.ws.audio.onvolumechanged(); }); $el.appendChild($volume); }, category: ($el, path, title, desc) => { const key = [ "master", ...path ].join("."); const $section = this.collapsible($el, collapsed => title, desc, true); const $volume = document.createElement("volume-control"); $volume.setAttribute("title", "Category Volume"); $volume.value = this.ws.store.settings.audio.volume[key]; $volume.addEventListener("change", () => { const current = this.ws.store.settings.audio.volume[key]; this.ws.store.settings.audio.volume[key] = $volume.value; if (current !== $volume.value) this.ws.audio.onvolumechanged(); }); $section.appendChild($volume); const $content = document.createElement("div"); $content.className = "settings-content"; $section.appendChild($content); return $content; } }; const loop = (obj, path, $el) => { for (const [key, value] of Object.entries(obj)) { switch (value.type) { case "sound": { var _value$preview; build.sound($el, [ ...path, key ], value.title, value.description, (_value$preview = value.preview) !== null && _value$preview !== void 0 ? _value$preview : true); } break; case "category": { loop(value.properties, [ ...path, key ], build.category($el, [ ...path, key ], value.title, value.description)); } break; } } }; loop(this.ws.audio.audio, [], document.querySelector("#settings-sounds-container")); } { const $repeatScripts = document.querySelector("#repeat-control-scripts-toggle"); $repeatScripts.value = this.ws.store.settings.repeat_control_scripts; $repeatScripts.addEventListener("change", e => this.ws.store.settings.repeat_control_scripts = $repeatScripts.value); document.querySelector("#settings-new-control-script").addEventListener("click", async () => { this.ws.store.control_scripts.unshift({ keys: [], actions: [] }); this.controls(); }); } { const $zen = document.querySelector("#settings-zen-mode"); $zen.value = this.ws.store.settings.zen_mode.enabled; $zen.addEventListener("change", e => { this.ws.store.settings.zen_mode.enabled = $zen.value; this.ws.gui.updateZenMode(); }); const $sound = document.querySelector("#settings-zen-mode-sound"); $sound.value = this.ws.store.settings.zen_mode.sound.enabled; $sound.addEventListener("change", e => { this.ws.store.settings.zen_mode.sound.enabled = $sound.value; this.ws.gui.updateZenMode(); }); const $music = document.querySelector("#settings-zen-mode-music"); $music.value = this.ws.store.settings.zen_mode.music.enabled; $music.addEventListener("change", e => { this.ws.store.settings.zen_mode.music.enabled = $music.value; this.ws.gui.updateZenMode(); }); const $alerts = document.querySelector("#settings-zen-mode-alerts"); $alerts.value = this.ws.store.settings.zen_mode.alerts.enabled; $alerts.addEventListener("change", e => { this.ws.store.settings.zen_mode.alerts.enabled = $alerts.value; this.ws.gui.updateZenMode(); }); const $messages = document.querySelector("#settings-zen-mode-messages"); $messages.value = this.ws.store.settings.zen_mode.messages.enabled; $messages.addEventListener("change", e => { this.ws.store.settings.zen_mode.messages.enabled = $messages.value; this.ws.gui.updateZenMode(); }); const $toasts = document.querySelector("#settings-zen-mode-toasts"); $toasts.value = this.ws.store.settings.zen_mode.toasts.enabled; $toasts.addEventListener("change", e => { this.ws.store.settings.zen_mode.toasts.enabled = $toasts.value; this.ws.gui.updateZenMode(); }); const $badges = document.querySelector("#settings-zen-mode-badges"); $badges.value = this.ws.store.settings.zen_mode.badges.enabled; $badges.addEventListener("change", e => { this.ws.store.settings.zen_mode.badges.enabled = $badges.value; this.ws.gui.updateZenMode(); }); } { if (false) // removed by dead control flow {} if (!window.isElectron) { const $launch = document.querySelector("#settings-launch-behavior"); document.querySelectorAll("#settings-launch-behavior .selected").forEach($el => $el.classList.remove("selected")); document.querySelector(`#settings-launch-behavior [data-value=${electron.localStorage.get("WikiShield:OpenExternally") ? "new_tab" : "current_tab"}]`).classList.add("selected"); const $current = $launch.querySelector("[data-value=current_tab]"); $current.addEventListener("click", () => { $launch.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $current.classList.add("selected"); electron.localStorage.set("WikiShield:OpenExternally", false); }); const $new = $launch.querySelector("[data-value=new_tab]"); $new.addEventListener("click", () => { $launch.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $new.classList.add("selected"); electron.localStorage.set("WikiShield:OpenExternally", true); }); } { const $performance = document.querySelector("#settings-startup-performance"); document.querySelectorAll("#settings-startup-performance .selected").forEach($el => $el.classList.remove("selected")); document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected"); const $off = $performance.querySelector("[data-value=always_off]"); $off.addEventListener("click", () => { $performance.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $off.classList.add("selected"); this.ws.store.settings.performance.startup = "always_off"; }); const $adaptive = $performance.querySelector("[data-value=adaptive]"); $adaptive.addEventListener("click", () => { $performance.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $adaptive.classList.add("selected"); this.ws.store.settings.performance.startup = "adaptive"; }); const $on = $performance.querySelector("[data-value=always_on]"); $on.addEventListener("click", () => { $performance.querySelectorAll(".selected").forEach($el => $el.classList.remove("selected")); $on.classList.add("selected"); this.ws.store.settings.performance.startup = "always_on"; }); } } { const $queue = document.querySelector("#settings-queues"); _queue.Queue.types.map(type => ({ type, data: this.ws.store.settings.queue[type] })).sort((a, b) => a.data.order - b.data.order).forEach(queue => { var _recent$pending$users; const $item = document.createElement("draggable-order-item"); $item.setAttribute("key", queue.type); $item.setAttribute("name", (_recent$pending$users = { recent: "Recent changes", pending: "Pending changes", users: "User creations", watchlist: "Watchlist", abuselog: "Abuse log" }[queue.type]) !== null && _recent$pending$users !== void 0 ? _recent$pending$users : queue.type); $item.enabled = queue.data.enabled; $queue.addItem($item, queue.type); }); $queue.addEventListener("toggle", e => { var _e$target$closest; const queueType = (_e$target$closest = e.target.closest("draggable-order-item")) === null || _e$target$closest === void 0 ? void 0 : _e$target$closest.getAttribute("key"); if (queueType) { this.ws.store.settings.queue[queueType].enabled = e.detail.enabled; this.ws.gui.reorderQueues(); } }); $queue.addEventListener("reorder", e => { e.detail.keys.forEach((key, index) => { this.ws.store.settings.queue[key].order = index; this.ws.gui.reorderQueues(); }); }); const $palettes = document.querySelector("#settings-palette-selector"); Object.entries(_gui.GUI.palettes).forEach(([key, palette]) => { const $palette = document.createElement("div"); $palette.className = "palette-option"; $palette.classList.toggle("selected", this.ws.store.UI.theme.palette === key); $palette.dataset.palette = key; $palette.addEventListener("click", () => { document.querySelectorAll(".palette-option.selected").forEach($el => $el.classList.remove("selected")); $palette.classList.add("selected"); this.ws.store.UI.theme.palette = key; this.ws.gui.updatePalette(); }); $palettes.appendChild($palette); const $name = document.createElement("div"); $name.className = "palette-name"; $name.textContent = new _text.Text(key).case(_text.Text.Case.Title).get(); $palette.appendChild($name); const $preview = document.createElement("div"); $preview.className = "palette-preview"; $palette.appendChild($preview); const len = palette.length; const paper = document.createElement("canvas"); paper.width = len; paper.height = 1; const pen = paper.getContext("2d"); const imgData = pen.createImageData(len, 1); palette.forEach((color, i) => { const rgb = color.match(/\d+/g).map(v => parseInt(v, 10)); const offset = i * 4; imgData.data[offset] = rgb[0]; imgData.data[offset + 1] = rgb[1]; imgData.data[offset + 2] = rgb[2]; imgData.data[offset + 3] = 255; }); pen.putImageData(imgData, 0, 0); $preview.appendChild(paper); }); } { /* const $colorblind = document.querySelector("#settings-colorblind-mode"); $colorblind.value = this.ws.store.settings.accessibility.colorblind; $colorblind.addEventListener("change", e => { this.ws.store.settings.accessibility.colorblind = $colorblind.value; this.ws.gui.updateAccessibility(); }); */ const $dyslexia = document.querySelector("#settings-dyslexia-font"); $dyslexia.value = this.ws.store.settings.accessibility.dyslexia; $dyslexia.addEventListener("change", e => { this.ws.store.settings.accessibility.dyslexia = $dyslexia.value; this.ws.gui.updateAccessibility(); }); /* const $contrast = document.querySelector("#settings-high-contrast-mode"); $contrast.value = this.ws.store.settings.accessibility.high_contrast; $contrast.addEventListener("change", e => { this.ws.store.settings.accessibility.high_contrast = $contrast.value; this.ws.gui.updateAccessibility(); }); */ const $motion = document.querySelector("#settings-reduce-motion"); $motion.value = this.ws.store.settings.accessibility.reduce_motion; $motion.addEventListener("change", e => { this.ws.store.settings.accessibility.reduce_motion = $motion.value; this.ws.gui.updateAccessibility(); }); } { const $AI = document.querySelector("#settings-AI-toggle"); $AI.value = this.ws.store.settings.AI.enabled; $AI.addEventListener("change", e => { var _this$ws$AI; (_this$ws$AI = this.ws.AI) === null || _this$ws$AI === void 0 || _this$ws$AI.cancel.all(true); this.ws.store.settings.AI.enabled = $AI.value; if (this.ws.store.settings.AI.enabled) switch (this.ws.store.settings.AI.provider) { case "Ollama": { this.ws.AI = new _class.AI.providers.Ollama(this.ws, this.ws.store.settings.AI.Ollama); } break; default: { this.ws.AI = null; } break; } else this.ws.AI = null; }); const $editAnalysis = document.querySelector("#settings-AI-edit-analysis-toggle"); $editAnalysis.value = this.ws.store.settings.AI.edit_analysis.enabled; $editAnalysis.addEventListener("change", e => this.ws.store.settings.AI.edit_analysis.enabled = e.target.value); const $usernameAnalysis = document.querySelector("#settings-AI-username-analysis-toggle"); $usernameAnalysis.value = this.ws.store.settings.AI.username_analysis.enabled; $usernameAnalysis.addEventListener("change", e => this.ws.store.settings.AI.username_analysis.enabled = e.target.value); const $url = document.querySelector("#ollama-url-input"); $url.value = this.ws.store.settings.AI.Ollama.server; $url.addEventListener("change", e => { this.ws.store.settings.AI.Ollama.server = $url.value.trim(); if (this.ws.store.settings.AI.provider === "Ollama" && this.ws.AI) this.ws.AI.cancel.all(true); }); const $test = document.querySelector("#settings-ollama-test-connection"); $test.addEventListener("click", async () => { var _this$ws$AI2; if ($test.disabled) return; $test.disabled = true; const $status = document.querySelector("#settings-ollama-connection-status"); const $container = $status.parentElement; $container.classList.add("testing"); $container.classList.remove("connected", "failed"); $status.classList.add("animate-loading-dots"); $status.textContent = "Testing connection"; let temp; switch (this.ws.store.settings.AI.provider) { case "Ollama": { temp = new _class.AI.providers.Ollama(this.ws, this.ws.store.settings.AI.Ollama); } break; } (_this$ws$AI2 = this.ws.AI) === null || _this$ws$AI2 === void 0 || _this$ws$AI2.cancel.all(true); if (temp instanceof _class.AI && await temp.test()) { $container.classList.add("connected"); $container.classList.remove("testing", "failed"); $status.innerHTML = "<span class='fa fa-check-circle'></span> Connected!"; } else { $container.classList.add("failed"); $container.classList.remove("testing", "connected"); $status.innerHTML = "<span class='fa fa-times-circle'></span> Failed to connect.<br><small>Make sure you have followed the setup instructions (see below)</small>"; } $status.classList.remove("animate-loading-dots"); $test.disabled = false; }); const $refresh = document.querySelector("#settings-ollama-refresh-models"); $refresh.addEventListener("click", async () => { var _this$ws$AI3; if ($refresh.disabled) return; $refresh.disabled = true; const $models = document.querySelector("#settings-ollama-models"); const $status = document.querySelector("#settings-ollama-models-status"); const $container = $status.parentElement; $status.textContent = "Searching"; $container.classList.add("searching", "animate-loading-dots"); $container.classList.remove("none", "error"); (_this$ws$AI3 = this.ws.AI) === null || _this$ws$AI3 === void 0 || _this$ws$AI3.cancel.all(true); try { let temp; switch (this.ws.store.settings.AI.provider) { case "Ollama": { temp = new _class.AI.providers.Ollama(this.ws, this.ws.store.settings.AI.Ollama); } break; } const models = temp instanceof _class.AI && await temp.models() || []; if (models.length > 0) { $container.classList.remove("searching", "none", "error", "animate-loading-dots"); $status.innerHTML = `<span class="fa fa-check-circle"></span> Found ${models.length} ${new _text.Text("model").get(models.length)}.`; $models.innerHTML = ""; models.forEach(model => { const isSelected = model.name === this.ws.store.settings.AI.Ollama.model; const $model = document.createElement("div"); $model.className = "model"; $model.classList.toggle("selected", isSelected); $model.dataset.model = model.name; $models.appendChild($model); const $top = document.createElement("div"); $top.className = "model-top"; $model.appendChild($top); const $button = document.createElement("span"); $button.className = "indicator fa"; $button.classList.add(isSelected ? "fa-check-circle" : "fa-circle"); $top.appendChild($button); const $name = document.createElement("span"); $name.className = "model-name"; $name.textContent = model.name; $top.appendChild($name); /* LOL i just found this comment in the old code, and i still can't be bothered to fix it here's the comment if anyone is actually reading this: // i don't feel like figuring out the css to truly center the model name, so just add an invisible element to take up space */ const $psuedo = document.createElement("span"); $psuedo.className = "psuedo-indicator fa fa-circle"; $top.appendChild($psuedo); const $bottom = document.createElement("div"); $bottom.className = "model-bottom"; $model.appendChild($bottom); const $size = document.createElement("span"); $size.className = "model-size"; $size.textContent = this.ws.util.formatBytes(model.size); $bottom.appendChild($size); const $modified = document.createElement("span"); $modified.className = "model-modified"; $modified.textContent = new Date(model.modified_at).toLocaleDateString(); $bottom.appendChild($modified); $model.addEventListener("click", () => { var _this$ws$AI4; (_this$ws$AI4 = this.ws.AI) === null || _this$ws$AI4 === void 0 || _this$ws$AI4.cancel.all(true); switch (this.ws.store.settings.AI.provider) { case "Ollama": { this.ws.store.settings.AI.Ollama.model = model.name; } break; } $models.querySelectorAll(".model.selected").forEach($el => { $el.classList.remove("selected"); const $indicator = $el.querySelector(".indicator"); $indicator.classList.remove("fa-circle"); $indicator.classList.add("fa-check-circle"); }); $model.classList.add("selected"); const $indicator = $model.querySelector(".indicator"); $indicator.classList.remove("fa-circle"); $indicator.classList.add("fa-check-circle"); }); }); } else { $container.classList.add("none"); $container.classList.remove("searching", "error", "animate-loading-dots"); $status.textContent = "No models found."; } } catch (error) { $container.classList.add("error"); $container.classList.remove("searching", "none", "animate-loading-dots"); $status.innerHTML = "<span class='fa fa-times-circle'></span> Error fetching models."; } $refresh.disabled = false; }); } { const $reporting = document.querySelector("#settings-auto-reporting-toggle"); $reporting.value = this.ws.store.settings.auto_report.enabled; $reporting.addEventListener("change", e => { this.ws.store.settings.auto_report.enabled = $reporting.value; }); const $warnings = document.querySelector("#settings-auto-reporting-warnings-container"); Object.entries(_warnings.warningsLookup).filter(([key, warning]) => warning.reportable).sort((a, b) => a[1].title.localeCompare(b[1].title)).forEach(([key, warning]) => { const $item = document.createElement("div"); $item.className = "auto-reportable-warning-item"; $item.innerHTML = `\n\t\t\t\t\t\t<label class="checkbox-box" data-warning-key="${key}">\n\t\t\t\t\t\t\t<input type="checkbox" autoComplete="off" ${this.ws.store.settings.auto_report.for.has(key) ? "checked" : ""}>\n\t\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<span class="checkbox-name">${warning.title}</span>\n\t\t\t\t\t`; $item.querySelector("input[type=checkbox]").addEventListener("change", e => { if (e.target.checked) { if (!this.ws.store.settings.auto_report.for.has(key)) this.ws.store.settings.auto_report.for.add(key); } else this.ws.store.settings.auto_report.for.delete(key); }); $warnings.appendChild($item); }); } { const $welcome = document.querySelector("#settings-auto-welcome-toggle"); $welcome.value = this.ws.store.settings.auto_welcome.enabled; $welcome.addEventListener("change", e => { this.ws.store.settings.auto_welcome.enabled = $welcome.value; }); const $popups = document.querySelector("#settings-wikipedia-popups-toggle"); $popups.value = this.ws.store.settings.wikipedia_popups.enabled; $popups.addEventListener("change", e => { this.ws.store.settings.wikipedia_popups.enabled = $popups.value; }); const $talkPageThanksForTemporaryUsersToggle = document.querySelector("#talk-page-thanks-for-temporary-users-toggle"); $talkPageThanksForTemporaryUsersToggle.value = this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled; $talkPageThanksForTemporaryUsersToggle.addEventListener("change", e => { this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled = $talkPageThanksForTemporaryUsersToggle.value; }); const $highlight = document.querySelector("#settings-username-highlighting-toggle"); $highlight.value = this.ws.store.settings.username_highlighting.enabled; $highlight.addEventListener("change", e => { this.ws.store.settings.username_highlighting.enabled = $highlight.value; }); const $fuzzy = document.querySelector("#settings-username-highlighting-fuzzy-toggle"); $fuzzy.value = this.ws.store.settings.username_highlighting.fuzzy; $fuzzy.addEventListener("change", e => { this.ws.store.settings.username_highlighting.fuzzy = $fuzzy.value; }); } { const $status = document.querySelector("#settings-save-status"); const $export = document.querySelector("#settings-export-button"); $export.addEventListener("click", async e => { try { const b64 = this.ws.export(); await electron.copyToClipboard(b64); $status.classList.remove("hidden", "error", "info"); $status.classList.add("success"); $status.innerHTML = `\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings exported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">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`; } catch (error) { $status.classList.remove("hidden", "success", "info"); $status.classList.add("error"); $status.innerHTML = `\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Export failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${error.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`; } }); const $import = document.querySelector("#settings-import-button"); $import.addEventListener("click", async e => { try { const b64 = await this.ws.gui.dialog.input("Import Settings", "Please paste the base64 string of your exported settings below:"); if (!b64) throw new Error("No input provided."); const logs = await this.ws.noinit(b64); const [expected, unexpected] = logs.reduce((acc, log) => { if (log.expected) acc[0].push(log); else acc[1].push(log); return acc; }, [ [], [] ]); $status.classList.remove("hidden", "error", "info"); $status.classList.add("success"); $status.innerHTML = `\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings imported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">\n\t\t\t\t\t\t\t\t\t${unexpected.length > 0 ? `<br><br><strong>Encountered ${new _text.Text("%n issue").get(unexpected.length)}:</strong><br>${unexpected.map(log => `- ${log.message}`).join("<br>")}` : ""}\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`; } catch (error) { $status.classList.remove("hidden", "success", "info"); $status.classList.add("error"); $status.innerHTML = `\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Import failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${error.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`; } }); const $reset = document.querySelector("#settings-reset-button"); $reset.addEventListener("click", async e => { const confirm = await this.ws.gui.dialog.confirm("Reset Settings", "Are you sure you want to reset all settings to their default values? This action cannot be undone.", "Reset Settings", true); if (!confirm) return; this.ws.noinit("e30="); // "{}" in base64 $status.classList.remove("hidden", "error", "success"); $status.classList.add("info"); $status.innerHTML = `\n\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t<i class="fa fa-info-circle status-icon"></i>\n\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t<div class="status-title">Settings reset successfully.</div>\n\t\t\t\t\t\t\t<div class="status-desc">All settings have been restored to their default values.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`; }); } { document.querySelectorAll("#settings-container > .settings > .settings-right > .about [data-link]").forEach($el => { $el.addEventListener("click", event => this.ws.open($el.dataset.link, event.altKey)); }); } } // update all values update() { { document.querySelector("#settings-maximum-edit-count").value = this.ws.store.settings.queue.max_edits; document.querySelector("#settings-maximum-queue-size").value = this.ws.store.settings.queue.max_size; document.querySelector("#settings-minimum-ores-score").value = this.ws.store.settings.queue.min_ores; document.querySelector("#settings-watchlist-expiry").value = this.ws.store.settings.expiry.watchlist; document.querySelectorAll("#settings-namespaces-container .namespace-item").forEach($item => { const ns = parseInt($item.dataset.namespaceId, 10); $item.querySelector("input[type=checkbox]").checked = this.ws.store.settings.namespaces.includes(ns); }); } { document.querySelector("#settings-zen-mode").value = this.ws.store.settings.zen_mode.enabled; document.querySelector("#settings-zen-mode-sound").value = this.ws.store.settings.zen_mode.sound.enabled; document.querySelector("#settings-zen-mode-music").value = this.ws.store.settings.zen_mode.music.enabled; document.querySelector("#settings-zen-mode-alerts").value = this.ws.store.settings.zen_mode.alerts.enabled; document.querySelector("#settings-zen-mode-messages").value = this.ws.store.settings.zen_mode.messages.enabled; document.querySelector("#settings-zen-mode-toasts").value = this.ws.store.settings.zen_mode.toasts.enabled; document.querySelector("#settings-zen-mode-badges").value = this.ws.store.settings.zen_mode.badges.enabled; } { document.querySelectorAll("#settings-startup-performance .selected").forEach($el => $el.classList.remove("selected")); document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected"); } { const $queue = document.querySelector("#settings-queues"); $queue.clearItems(); _queue.Queue.types.map(type => ({ type, data: this.ws.store.settings.queue[type] })).sort((a, b) => a.data.order - b.data.order).forEach(queue => { var _recent$pending$users2; const $item = document.createElement("draggable-order-item"); $item.setAttribute("key", queue.type); $item.setAttribute("name", (_recent$pending$users2 = { recent: "Recent changes", pending: "Pending changes", users: "User creations", watchlist: "Watchlist" }[queue.type]) !== null && _recent$pending$users2 !== void 0 ? _recent$pending$users2 : queue.type); $item.enabled = queue.data.enabled; $queue.addItem($item, queue.type); }); document.querySelectorAll(".palette-option").forEach($el => { $el.classList.toggle("selected", $el.dataset.palette === this.ws.store.UI.theme.palette); }); } { document.querySelector("#settings-AI-toggle").value = this.ws.store.settings.AI.enabled; document.querySelector("#settings-AI-edit-analysis-toggle").value = this.ws.store.settings.AI.edit_analysis.enabled; document.querySelector("#settings-AI-username-analysis-toggle").value = this.ws.store.settings.AI.username_analysis.enabled; document.querySelector("#ollama-url-input").value = this.ws.store.settings.AI.Ollama.server; { const $status = document.querySelector("#settings-ollama-connection-status"); const $container = $status.parentElement; $status.innerHTML = ""; $container.classList.remove("testing", "connected", "failed"); } { const $models = document.querySelector("#settings-ollama-models"); $models.querySelectorAll(".model").forEach($el => $el.remove()); const $status = document.querySelector("#settings-ollama-models-status"); const $container = $status.parentElement; $status.innerHTML = ""; $container.classList.remove("searching", "none", "error"); } } { document.querySelector("#settings-auto-reporting-toggle").value = this.ws.store.settings.auto_report.enabled; document.querySelectorAll("#settings-auto-reporting-warnings-container .auto-reportable-warning-item").forEach($item => { const key = $item.querySelector("label").dataset.warningKey; $item.querySelector("input[type=checkbox]").checked = this.ws.store.settings.auto_report.for.has(key); }); } { document.querySelector("#settings-auto-welcome-toggle").value = this.ws.store.settings.auto_welcome.enabled; document.querySelector("#settings-wikipedia-popups-toggle").value = this.ws.store.settings.wikipedia_popups.enabled; document.querySelector("#settings-username-highlighting-toggle").value = this.ws.store.settings.username_highlighting.enabled; document.querySelector("#settings-username-highlighting-fuzzy-toggle").value = this.ws.store.settings.username_highlighting.fuzzy; } } open() { document.querySelector("#settings-container").classList.add("show"); this.general(); _classPrivateFieldSet(_promise, this, new Promise(resolve => { _classPrivateFieldSet(_promiseResolve, this, resolve); })); } close() { this.deselect(); this.ws.audio.stopPreviews(); document.querySelector("#settings-container").classList.remove("show"); if (_classPrivateFieldGet(_promiseResolve, this)) { _classPrivateFieldGet(_promiseResolve, this).call(this); _classPrivateFieldSet(_promiseResolve, this, null); } } waitForClose() { return _classPrivateFieldGet(_promise, this); } deselect() { document.querySelectorAll("#settings-container > .settings > .settings-left .settings-left-menu-item.selected").forEach($item => $item.classList.remove("selected")); document.querySelectorAll("#settings-container > .settings > .settings-right > :not(.hidden)").forEach($section => $section.classList.add("hidden")); } general() { this.deselect(); document.querySelector("#settings-general-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .general").classList.remove("hidden"); } performance() { this.deselect(); document.querySelector("#settings-performance-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .performance").classList.remove("hidden"); } audio() { this.deselect(); document.querySelector("#settings-audio-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .audio").classList.remove("hidden"); } controls() { this.deselect(); document.querySelector("#settings-controls-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .controls").classList.remove("hidden"); { const findParentAction = (action, parent) => { if (parent.actions.includes(action)) return parent; for (const act of parent.actions) if (act.name === "if" || act.name === "if not") { const found = findParentAction(action, act); if (found) return found; } return null; }; const createActionItem = ($action, action, script, callback) => { const $item = document.createElement("div"); $item.className = "control-action"; $action.appendChild($item); if (action.name === "if" || action.name === "if not") { var _action$condition, _condition$name, _condition$params; $item.innerHTML = `\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t\t\t${action.name === "if" ? "If" : "If not"} <select></select> <span class="params"></span> then:\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`; const $select = $item.querySelector("select"); Object.entries(_conditions.conditions).forEach(([key, condition]) => { if ("title" in condition) $select.innerHTML += `<option value="${key}">${condition.title}</option>`; else $select.innerHTML += `<option value="${key}">${key}</option>`; }); const condition = (_action$condition = action.condition) !== null && _action$condition !== void 0 ? _action$condition : { name: Object.keys(_conditions.conditions)[0], params: {} }; (_condition$name = condition.name) !== null && _condition$name !== void 0 ? _condition$name : condition.name = Object.keys(_conditions.conditions)[0]; (_condition$params = condition.params) !== null && _condition$params !== void 0 ? _condition$params : condition.params = {}; $select.value = condition.name; $select.addEventListener("change", e => { condition.name = $select.value; callback(); }); const dependencyMap = new Map; for (const param of (0, _scripts.sortDependencies)(((_conditions$condition = (_conditions$condition2 = _conditions.conditions[condition.name]).parameters) === null || _conditions$condition === void 0 ? void 0 : _conditions$condition.call(_conditions$condition2)) || [])) { var _conditions$condition, _conditions$condition2; const $param = document.createElement("div"); $param.className = "condition-parameter"; $item.querySelector(".params").appendChild($param); const dependencies = {}; for (const dependent of (_param$dependencies = param.dependencies) !== null && _param$dependencies !== void 0 ? _param$dependencies : []) { var _param$dependencies; dependencies[dependent] = condition.params[dependent]; } const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; let callback = null; switch (param.type) { case "choice": { const $select = document.createElement("select"); $select.dataset.paramid = param.id; $param.appendChild($select); const options = typeof param.options === "function" ? param.options(dependencies) : param.options; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $select.appendChild($option); } if (condition.params[param.id] !== undefined) { $select.value = condition.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $select.value = _default; condition.params[param.id] = _default; } callback = () => { const dependencies = {}; for (const dependent of (_param$dependencies2 = param.dependencies) !== null && _param$dependencies2 !== void 0 ? _param$dependencies2 : []) { var _param$dependencies2; dependencies[dependent] = condition.params[dependent]; } const value = $select.value; const options = typeof param.options === "function" ? param.options(dependencies) : param.options; $select.innerHTML = ""; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $select.appendChild($option); } if (options.includes(value)) $select.value = value; else { const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; $select.value = _default; condition.params[param.id] = _default; } }; $select.addEventListener("change", () => { condition.params[param.id] = $select.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "text": { const $input = document.createElement("input"); $input.type = "text"; $input.dataset.paramid = param.id; $param.appendChild($input); if (condition.params[param.id] !== undefined) { $input.value = condition.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.value = _default; condition.params[param.id] = _default; } $input.addEventListener("change", () => { condition.params[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "boolean": { const $input = document.createElement("input"); $input.type = "checkbox"; $input.dataset.paramid = param.id; $param.appendChild($input); if (condition.params[param.id] !== undefined) { $input.checked = condition.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.checked = _default; condition.params[param.id] = _default; } $input.addEventListener("change", () => { condition.params[param.id] = $input.checked; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "number": { const $input = document.createElement("input"); $input.type = "number"; $input.dataset.paramid = param.id; if ("min" in param) $input.min = param.min; if ("max" in param) $input.max = param.max; $param.appendChild($input); if (condition.params[param.id] !== undefined) { $input.value = condition.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.value = _default; condition.params[param.id] = _default; } $input.addEventListener("change", () => { condition.params[param.id] = parseFloat($input.value); for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; } if (typeof callback === "function") for (const dependent of (_param$dependencies3 = param.dependencies) !== null && _param$dependencies3 !== void 0 ? _param$dependencies3 : []) { var _param$dependencies3; if (!dependencyMap.has(dependent)) dependencyMap.set(dependent, []); dependencyMap.get(dependent).push(callback); } } for (const subaction of action.actions) createActionItem($item, subaction, script, callback); } else { const event = _events.events[action.name]; $item.innerHTML = `\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="${"icon" in event ? event.icon : "fas fa-bolt"}"></span>\n\t\t\t\t\t\t\t\t${"title" in event ? event.title : action.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`; const dependencyMap = new Map; for (const param of (0, _scripts.sortDependencies)(((_event$parameters = event.parameters) === null || _event$parameters === void 0 ? void 0 : _event$parameters.call(event)) || [])) { var _event$parameters; const $param = document.createElement("div"); $param.className = "action-parameter"; $param.innerHTML = `<div class="parameter-title">${param.title}</div>`; $item.appendChild($param); const dependencies = {}; for (const dependent of (_param$dependencies4 = param.dependencies) !== null && _param$dependencies4 !== void 0 ? _param$dependencies4 : []) { var _param$dependencies4; dependencies[dependent] = action.params[dependent]; } const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; let callback = null; switch (param.type) { case "choice": { const $select = document.createElement("select"); $select.dataset.paramid = param.id; $param.appendChild($select); const options = typeof param.options === "function" ? param.options(dependencies) : param.options; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $select.appendChild($option); } if (action.params[param.id] !== undefined) { $select.value = action.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $select.value = _default; action.params[param.id] = _default; } callback = () => { const dependencies = {}; for (const dependent of (_param$dependencies5 = param.dependencies) !== null && _param$dependencies5 !== void 0 ? _param$dependencies5 : []) { var _param$dependencies5; dependencies[dependent] = action.params[dependent]; } const value = $select.value; const options = typeof param.options === "function" ? param.options(dependencies) : param.options; $select.innerHTML = ""; for (const option of options !== null && options !== void 0 ? options : []) { const $option = document.createElement("option"); $option.value = option; $option.textContent = option; $select.appendChild($option); } if (options.includes(value)) $select.value = value; else { const _default = typeof param.default === "function" ? param.default(dependencies) : param.default; $select.value = _default; action.params[param.id] = _default; } }; $select.addEventListener("change", () => { action.params[param.id] = $select.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "text": { const $input = document.createElement("input"); $input.type = "text"; $input.dataset.paramid = param.id; $param.appendChild($input); if (action.params[param.id] !== undefined) { $input.value = action.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.value = _default; action.params[param.id] = _default; } $input.addEventListener("change", () => { action.params[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "boolean": { const $input = document.createElement("input"); $input.type = "checkbox"; $input.dataset.paramid = param.id; $param.appendChild($input); if (action.params[param.id] !== undefined) { $input.checked = action.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.checked = _default; action.params[param.id] = _default; } $input.addEventListener("change", () => { action.params[param.id] = $input.checked; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; case "duration": { const $input = document.createElement("duration-input"); $input.dataset.paramid = param.id; $param.appendChild($input); if (action.params[param.id] !== undefined) { $input.value = action.params[param.id]; for (const cb of dependencyMap.get(param.id) || []) cb(); } else if ("default" in param) { $input.value = _default; action.params[param.id] = _default; } $input.addEventListener("change", () => { action.params[param.id] = $input.value; for (const cb of dependencyMap.get(param.id) || []) cb(); }); } break; } if (typeof callback === "function") for (const dependent of (_param$dependencies6 = param.dependencies) !== null && _param$dependencies6 !== void 0 ? _param$dependencies6 : []) { var _param$dependencies6; if (!dependencyMap.has(dependent)) dependencyMap.set(dependent, []); dependencyMap.get(dependent).push(callback); } } } $item.querySelector(".move-action-up").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); const parent = findParentAction(action, script); const index = parent.actions.indexOf(action); if (parent.actions.indexOf(action) === 0) { if (parent.name !== "if" && parent.name !== "if not") return; const grandparent = findParentAction(parent, script); grandparent.actions.splice(grandparent.actions.indexOf(parent), 0, action); parent.actions.splice(index, 1); } else { const temp = parent.actions[index - 1]; if (temp.name === "if" || temp.name === "if not") { temp.actions.push(action); parent.actions.splice(index, 1); } else { parent.actions.splice(index, 1); parent.actions.splice(index - 1, 0, action); } } callback(); }); $item.querySelector(".move-action-down").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); const parent = findParentAction(action, script); const index = parent.actions.indexOf(action); if (parent.actions.indexOf(action) === parent.actions.length - 1) { if (parent.name !== "if" && parent.name !== "if not") return; const grandparent = findParentAction(parent, script); grandparent.actions.splice(grandparent.actions.indexOf(parent) + 1, 0, action); parent.actions.splice(index, 1); } else { const temp = parent.actions[index + 1]; if (temp.name === "if" || temp.name === "if not") { temp.actions.unshift(action); parent.actions.splice(index, 1); } else { parent.actions.splice(index, 1); parent.actions.splice(index + 1, 0, action); } } callback(); }); $item.querySelector(".delete-action").addEventListener("click", async e => { this.ws.audio.playSound([ "ui", "click" ]); if (e.shiftKey || await this.ws.gui.dialog.confirm("Delete Action", "Are you sure you want to delete this action?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>", null, true)) { const parent = findParentAction(action, script); parent.actions.splice(parent.actions.indexOf(action), 1); callback(); } }); }; const duplicates = () => { const keys = new Set; const overflow = new Set; this.ws.store.control_scripts.forEach(script => { script.keys.forEach(key => { if (keys.has(key)) overflow.add(key); else keys.add(key); }); }); document.querySelectorAll(".control-keys div[data-key]").forEach($key => { $key.classList.toggle("duplicate", overflow.has($key.dataset.key)); }); }; const buildScriptInterface = ($script, script) => { $script.innerHTML = `\n\t\t\t\t\t<div class="control-container">\n\t\t\t\t\t\t<div class="control-container-title">When these keys are pressed</div>\n\t\t\t\t\t\t<div class="control-keys"></div>\n\t\t\t\t\t\t<div class="control-container-title margin-top">Complete these actions</div>\n\t\t\t\t\t\t<div class="control-actions"></div>\n\t\t\t\t\t</div>\n\t\t\t\t`; const $keys = $script.querySelector(".control-keys"); for (const key of script.keys) { const $key = document.createElement("div"); $key.dataset.key = key; $key.innerHTML = `\n\t\t\t\t\t\t<span class="key-elem-title">${key === " " ? "space" : key}</span>\n\t\t\t\t\t\t<span class="fas fa-trash-can remove"></span>\n\t\t\t\t\t`; $keys.appendChild($key); $key.querySelector(".remove").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); script.keys.splice(script.keys.indexOf(key), 1); buildScriptInterface($script, script); duplicates(); }); } const $addKey = document.createElement("div"); $addKey.className = "add"; $addKey.innerHTML = `<span class="fas fa-plus"></span>`; $keys.appendChild($addKey); $addKey.addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); document.querySelectorAll(".key-select").forEach($el => $el.remove()); const $keySelect = document.createElement("div"); $keySelect.className = "key-select animate-loading-dots"; $keySelect.textContent = "Press a key"; $keys.insertBefore($keySelect, $addKey); const remove = () => { $keySelect.remove(); _classPrivateFieldSet(_keypressListener, this, null); }; $keySelect.addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); remove(); }); _classPrivateFieldSet(_keypressListener, this, (key, final, event) => { if (key === "escape") remove(); else if (final) { if (!(0, _controlKeys.validateShortcut)(key)) { remove(); this.ws.gui.dialog.toast("Invalid Key", "The key you pressed is not a valid shortcut key.", "error"); return; } if (!script.keys.includes(key)) script.keys.push(key); remove(); buildScriptInterface($script, script); duplicates(); } else $keySelect.textContent = key || "Press a key"; }); }); const $actions = $script.querySelector(".control-actions"); for (const action of script.actions) createActionItem($actions, action, script, () => { this.controls(); }); const $bottom = document.createElement("div"); $bottom.className = "control-bottom-container"; $bottom.innerHTML = `\n\t\t\t\t\t<div class="add-action-button"></div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<button class="add-action-button control-delete" style="--background: 211, 51, 51;">Delete</button>\n\t\t\t\t\t</div>\n\t\t\t\t`; $actions.appendChild($bottom); $bottom.querySelector(".control-delete").addEventListener("click", async e => { this.ws.audio.playSound([ "ui", "click" ]); if (e.shiftKey || await this.ws.gui.dialog.confirm("Delete Control Script", "Are you sure you want to delete this control script? This action cannot be undone?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>", null, true)) { this.ws.store.control_scripts.splice(this.ws.store.control_scripts.indexOf(script), 1); this.controls(); } }); const resetAddAction = () => { const $addAction = $bottom.querySelector(".add-action-button"); $addAction.innerHTML = `<button class="add-action-button new-button"><span class="fa fa-plus"></span> Add Action</button>`; $addAction.querySelector(".new-button").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); $addAction.innerHTML = `\n\t\t\t\t\t\t\t<select style="height: 35px;"></select>\n\t\t\t\t\t\t\t<button class="add-action-button cancel-button" style="margin-left: 10px;">Cancel</button>\n\t\t\t\t\t\t\t<button class="add-action-button create-button" style="margin-left: 10px;">Create</button>\n\t\t\t\t\t\t`; const $select = $addAction.querySelector("select"); $select.innerHTML += `<option value="if">If Condition</option>`; $select.innerHTML += `<option value="if not">If Not Condition</option>`; Object.entries(_events.events).forEach(([key, event]) => { if ("title" in event) $select.innerHTML += `<option value="${key}">${event.title}</option>`; else $select.innerHTML += `<option value="${key}">${key}</option>`; }); $addAction.querySelector(".cancel-button").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); resetAddAction(); }); $addAction.querySelector(".create-button").addEventListener("click", () => { this.ws.audio.playSound([ "ui", "click" ]); if ($select.value === "if" || $select.value === "if not" || $select.value in _events.events) { const action = { name: $select.value, params: {} }; if ($select.value === "if" || $select.value === "if not") { action.condition = { name: Object.keys(_conditions.conditions)[0] }; action.actions = []; } script.actions.push(action); buildScriptInterface($script, script); } }); }); }; resetAddAction(); }; const $content = document.querySelector("#settings-container > .settings > .settings-right > .controls"); $content.querySelectorAll(".control-script-item").forEach(script => script.remove()); for (const script of this.ws.store.control_scripts) { const $script = document.createElement("div"); $script.className = "settings-section control-script-item"; $content.appendChild($script); buildScriptInterface($script, script); } duplicates(); } } zen() { this.deselect(); document.querySelector("#settings-zen-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .zen").classList.remove("hidden"); } app() { this.deselect(); document.querySelector("#settings-app-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .app").classList.remove("hidden"); } queue() { this.deselect(); document.querySelector("#settings-queue-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .queue").classList.remove("hidden"); } accessibility() { this.deselect(); document.querySelector("#settings-accessibility-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .accessibility").classList.remove("hidden"); } AI() { this.deselect(); document.querySelector("#settings-AI-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .AI").classList.remove("hidden"); } autoReporting() { this.deselect(); document.querySelector("#settings-auto-reporting-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .auto-reporting").classList.remove("hidden"); } gadgets() { this.deselect(); document.querySelector("#settings-gadgets-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .gadgets").classList.remove("hidden"); } whitelist(type) { this.deselect(); document.querySelector(`#settings-whitelist-${type}s-button`).classList.add("selected"); document.querySelector(`#settings-container > .settings > .settings-right > .whitelist.${type}s`).classList.remove("hidden"); { const $whitelist = document.querySelector(`#settings-whitelist-${type}s-expiry`); $whitelist.value = this.ws.store.settings.expiry.whitelist[`${type}s`]; $whitelist.addEventListener("change", e => this.ws.store.settings.expiry.whitelist[`${type}s`] = e.target.value); const $input = document.querySelector(`#settings-whitelist-${type}s-input`); const add = () => { const value = $input.value.trim(); if (value) { $input.value = ""; this.ws.store.whitelist[`${type}s`].set(value, [ Date.now(), this.ws.util.expiryToDate(this.ws.store.settings.expiry.whitelist[`${type}s`]).valueOf() ]); this.ws.store.statistics.items_whitelisted.total++; this.ws.store.statistics.items_whitelisted[`${type}s`]++; this.ws.gui.renderQueue(); this.whitelist(type); } }; if (type === "tag") if (this.wikipediaTags) { const tags = this.wikipediaTags.map(tag => tag.name).sort(); for (const tag of tags) { const $option = document.createElement("option"); $option.value = tag; $option.textContent = tag; $input.appendChild($option); } $input.setAttribute("list", $input.id + "-datalist"); const $datalist = document.createElement("datalist"); $datalist.id = $input.id + "-datalist"; $input.parentElement.appendChild($datalist); for (const tag of tags) { const $option = document.createElement("option"); $option.value = tag; $datalist.appendChild($option); } } document.querySelector(`#settings-whitelist-${type}s-add-button`).addEventListener("click", add); $input.addEventListener("keydown", e => { if (e.key === "Enter") { add(); e.preventDefault(); } }); } { const $container = document.querySelector(`#settings-whitelist-${type}s-list`); $container.innerHTML = ""; const link = value => { switch (type) { case "user": return this.ws.page(`Special:Contributions/${value}`); case "page": return this.ws.page(value); case "tag": return this.ws.page(`Special:Tags/${value}`); } }; const sorted = [ ...this.ws.store.whitelist[`${type}s`] ].sort((a, b) => b[1][1] - a[1][1]); for (const [value, time] of sorted) { const $item = document.createElement("div"); const date = new Date(time[0]); const expires = time[1] === Infinity ? "Never" : `${new Date(time[1]).toLocaleDateString()} ${new Date(time[1]).toLocaleTimeString()}`; $item.innerHTML = `\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${link(value)}">${value}</a>\n\t\t\t\t\t\t<span>Added: ${date.toLocaleDateString()} ${date.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now() > time[1] ? "expired" : ""}">\n\t\t\t\t\t\t\t${Date.now() > time[1] ? "Expired" : "Expires"}: ${expires}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from whitelisted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`; $item.querySelector(".remove-button").addEventListener("click", () => { this.ws.store.whitelist[`${type}s`].delete(value); this.ws.gui.renderQueue(); this.whitelist(type); }); $container.appendChild($item); } if (sorted.length === 0) $container.innerHTML = `<div class="empty">No whitelisted ${type}s.</div>`; } } highlight(type) { this.deselect(); document.querySelector(`#settings-highlight-${type}s-button`).classList.add("selected"); document.querySelector(`#settings-container > .settings > .settings-right > .highlight.${type}s`).classList.remove("hidden"); { const $whitelist = document.querySelector(`#settings-highlight-${type}s-expiry`); $whitelist.value = this.ws.store.settings.expiry.highlight[`${type}s`]; $whitelist.addEventListener("change", e => this.ws.store.settings.expiry.highlight[`${type}s`] = e.target.value); const $input = document.querySelector(`#settings-highlight-${type}s-input`); const add = () => { const value = $input.value.trim(); if (value) { $input.value = ""; this.ws.store.highlight[`${type}s`].set(value, [ Date.now(), this.ws.util.expiryToDate(this.ws.store.settings.expiry.highlight[`${type}s`]).valueOf() ]); this.ws.store.statistics.items_highlighted.total++; this.ws.store.statistics.items_highlighted[`${type}s`]++; this.ws.gui.renderQueue(); this.highlight(type); } }; if (type === "tag") if (this.wikipediaTags) { const tags = this.wikipediaTags.map(tag => tag.name).sort(); for (const tag of tags) { const $option = document.createElement("option"); $option.value = tag; $option.textContent = tag; $input.appendChild($option); } $input.setAttribute("list", $input.id + "-datalist"); const $datalist = document.createElement("datalist"); $datalist.id = $input.id + "-datalist"; $input.parentElement.appendChild($datalist); for (const tag of tags) { const $option = document.createElement("option"); $option.value = tag; $datalist.appendChild($option); } } document.querySelector(`#settings-highlight-${type}s-add-button`).addEventListener("click", add); $input.addEventListener("keydown", e => { if (e.key === "Enter") { add(); e.preventDefault(); } }); } { const $container = document.querySelector(`#settings-highlight-${type}s-list`); $container.innerHTML = ""; const link = value => { switch (type) { case "user": return this.ws.page(`Special:Contributions/${value}`); case "page": return this.ws.page(value); case "tag": return this.ws.page(`Special:Tags/${value}`); } }; const sorted = [ ...this.ws.store.highlight[`${type}s`] ].sort((a, b) => b[1][1] - a[1][1]); for (const [value, time] of sorted) { const $item = document.createElement("div"); const date = new Date(time[0]); const expires = time[1] === Infinity ? "Never" : `${new Date(time[1]).toLocaleDateString()} ${new Date(time[1]).toLocaleTimeString()}`; $item.innerHTML = `\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${link(value)}">${value}</a>\n\t\t\t\t\t\t<span>Added: ${date.toLocaleDateString()} ${date.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now() > time[1] ? "expired" : ""}">\n\t\t\t\t\t\t\t${Date.now() > time[1] ? "Expired" : "Expires"}: ${expires}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from highlighted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`; $item.querySelector(".remove-button").addEventListener("click", () => { this.ws.store.highlight[`${type}s`].delete(value); this.ws.gui.renderQueue(); this.highlight(type); }); $container.appendChild($item); } if (sorted.length === 0) $container.innerHTML = `<div class="empty">No highlighted ${type}s.</div>`; } } statistics() { this.deselect(); document.querySelector("#settings-statistics-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .statistics").classList.remove("hidden"); { const $reset = document.querySelector("#reset-statistics-button"); $reset.addEventListener("click", async () => { if (await this.ws.gui.dialog.confirm("Reset statistics", "Are you sure you want to reset all statistics? This action cannot be undone.", undefined, true)) { this.ws.store.statistics = {}; this.ws.storage.load(this.ws.store); this.ws.time.load = performance.now(); this.statistics(); } }); } const stats = this.ws.store.statistics; { const $edits = document.querySelector("#stats-total-reviewed"); $edits.textContent = (stats.edits_reviewed.total || 0).toLocaleString(); const $thanks = document.querySelector("#stats-thanks-percentage"); $thanks.textContent = (stats.edits_reviewed.thanked / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $recent = document.querySelector("#stats-recent-changes-reviewed"); $recent.textContent = (stats.recent_changes_reviewed.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-recent-changes-percentage"); $percentage.textContent = (stats.recent_changes_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $pending = document.querySelector("#stats-pending-changes-reviewed"); $pending.textContent = (stats.pending_changes_reviewed.total || 0).toLocaleString(); const $accepted = document.querySelector("#stats-pending-changes-accepted"); $accepted.textContent = (stats.pending_changes_reviewed.accepted || 0).toLocaleString(); const $acceptedPercentage = document.querySelector("#stats-pending-changes-accepted-percentage"); $acceptedPercentage.textContent = (stats.pending_changes_reviewed.accepted / stats.pending_changes_reviewed.total * 100 || 0).toFixed(2); const $rejected = document.querySelector("#stats-pending-changes-rejected"); $rejected.textContent = (stats.pending_changes_reviewed.rejected || 0).toLocaleString(); const $rejectedPercentage = document.querySelector("#stats-pending-changes-rejected-percentage"); $rejectedPercentage.textContent = (stats.pending_changes_reviewed.rejected / stats.pending_changes_reviewed.total * 100 || 0).toFixed(2); const $percentage = document.querySelector("#stats-pending-changes-percentage"); $percentage.textContent = (stats.pending_changes_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $users = document.querySelector("#stats-user-creations-reviewed"); $users.textContent = (stats.users_reviewed.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-user-creations-percentage"); $percentage.textContent = (stats.users_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $watchlist = document.querySelector("#stats-watchlist-changes-reviewed"); $watchlist.textContent = (stats.watchlist_changes_reviewed.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-watchlist-changes-percentage"); $percentage.textContent = (stats.watchlist_changes_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $abuselog = document.querySelector("#stats-abuselog-changes-reviewed"); $abuselog.textContent = (stats.abuselogs_reviewed.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-abuselog-changes-percentage"); $percentage.textContent = (stats.abuselogs_reviewed.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); } { const $reverts = document.querySelector("#stats-reverts-made"); $reverts.textContent = (stats.reverts_made.total || 0).toLocaleString(); const $percentage = document.querySelector("#stats-reverts-percentage"); $percentage.textContent = (stats.reverts_made.total / stats.edits_reviewed.total * 100 || 0).toFixed(2); const $goodfaith = document.querySelector("#stats-goodfaith-reverts-percentage"); $goodfaith.textContent = (stats.reverts_made.good_faith / stats.reverts_made.total * 100 || 0).toFixed(2); const $recent = document.querySelector("#stats-recent-reverts-percentage"); $recent.textContent = (stats.reverts_made.from_recent_changes / stats.reverts_made.total * 100 || 0).toFixed(2); const $pending = document.querySelector("#stats-pending-reverts-percentage"); $pending.textContent = (stats.reverts_made.from_pending_changes / stats.reverts_made.total * 100 || 0).toFixed(2); const $watchlist = document.querySelector("#stats-watchlist-reverts-percentage"); $watchlist.textContent = (stats.reverts_made.from_watchlist / stats.reverts_made.total * 100 || 0).toFixed(2); const $abuselog = document.querySelector("#stats-abuselog-reverts-percentage"); $abuselog.textContent = (stats.reverts_made.from_abuselogs / stats.reverts_made.total * 100 || 0).toFixed(2); const $other = document.querySelector("#stats-other-reverts-percentage"); $other.textContent = (stats.reverts_made.from_loaded_edits / stats.reverts_made.total * 100 || 0).toFixed(2); } { const $welcomed = document.querySelector("#stats-users-welcomed"); $welcomed.textContent = (stats.users_welcomed.total || 0).toLocaleString(); const $message = document.querySelector("#stats-users-welcomed-message"); if (stats.edits_reviewed.total === stats.users_welcomed.total) $message.textContent = `You welcome every user whose edit you review! (${stats.users_welcomed.total.toLocaleString()})`; else { if (stats.users_welcomed.total === 0) $message.innerHTML = `For every Infinity edits you review, you still won&rsquo;t welcome a new user.`; else $message.textContent = `For every ${(stats.edits_reviewed.total / stats.users_welcomed.total || 0).toFixed(3)} edits you review, you welcome a new user.`; } } { const $warnings = document.querySelector("#stats-warnings"); $warnings.textContent = (stats.warnings_issued.total || 0).toLocaleString(); const $level1 = document.querySelector("#stats-warning-1-percentage"); $level1.textContent = (stats.warnings_issued.level_1 / stats.warnings_issued.total * 100 || 0).toFixed(2); const $level2 = document.querySelector("#stats-warning-2-percentage"); $level2.textContent = (stats.warnings_issued.level_2 / stats.warnings_issued.total * 100 || 0).toFixed(2); const $level3 = document.querySelector("#stats-warning-3-percentage"); $level3.textContent = (stats.warnings_issued.level_3 / stats.warnings_issued.total * 100 || 0).toFixed(2); const $level4 = document.querySelector("#stats-warning-4-percentage"); $level4.textContent = (stats.warnings_issued.level_4 / stats.warnings_issued.total * 100 || 0).toFixed(2); const $level4im = document.querySelector("#stats-warning-4im-percentage"); $level4im.textContent = (stats.warnings_issued.level_4im / stats.warnings_issued.total * 100 || 0).toFixed(2); } { const $reports = document.querySelector("#stats-reports"); $reports.textContent = (stats.reports_filed.total || 0).toLocaleString(); const $AIV = document.querySelector("#stats-AIV-reports-percentage"); $AIV.textContent = (stats.reports_filed.AIV / stats.reports_filed.total * 100 || 0).toFixed(2); const $UAA = document.querySelector("#stats-UAA-reports-percentage"); $UAA.textContent = (stats.reports_filed.UAA / stats.reports_filed.total * 100 || 0).toFixed(2); const $block = document.querySelector("#stats-global-block-reports-percentage"); $block.textContent = (stats.reports_filed.global_block / stats.reports_filed.total * 100 || 0).toFixed(2); const $lock = document.querySelector("#stats-global-lock-reports-percentage"); $lock.textContent = (stats.reports_filed.global_lock / stats.reports_filed.total * 100 || 0).toFixed(2); const $RFPP = document.querySelector("#stats-RFPP-reports-percentage"); $RFPP.textContent = (stats.reports_filed.RFPP / stats.reports_filed.total * 100 || 0).toFixed(2); } { const $watched = document.querySelector("#stats-pages-watched"); $watched.textContent = (stats.watchlist.watched || 0).toLocaleString(); const $unwatched = document.querySelector("#stats-pages-unwatched"); $unwatched.textContent = (stats.watchlist.unwatched || 0).toLocaleString(); } { const $whitelisted = document.querySelector("#stats-items-whitelisted"); $whitelisted.textContent = (stats.items_whitelisted.total || 0).toLocaleString(); const $users = document.querySelector("#stats-users-whitelisted"); $users.textContent = (stats.items_whitelisted.users || 0).toLocaleString(); const $usersPercentage = document.querySelector("#stats-users-whitelisted-percentage"); $usersPercentage.textContent = (stats.items_whitelisted.users / stats.items_whitelisted.total * 100 || 0).toFixed(2); const $pages = document.querySelector("#stats-pages-whitelisted"); $pages.textContent = (stats.items_whitelisted.pages || 0).toLocaleString(); const $pagesPercentage = document.querySelector("#stats-pages-whitelisted-percentage"); $pagesPercentage.textContent = (stats.items_whitelisted.pages / stats.items_whitelisted.total * 100 || 0).toFixed(2); const $tags = document.querySelector("#stats-tags-whitelisted"); $tags.textContent = (stats.items_whitelisted.tags || 0).toLocaleString(); const $tagsPercentage = document.querySelector("#stats-tags-whitelisted-percentage"); $tagsPercentage.textContent = (stats.items_whitelisted.tags / stats.items_whitelisted.total * 100 || 0).toFixed(2); } { const $highlighted = document.querySelector("#stats-items-highlighted"); $highlighted.textContent = (stats.items_highlighted.total || 0).toLocaleString(); const $users = document.querySelector("#stats-users-highlighted"); $users.textContent = (stats.items_highlighted.users || 0).toLocaleString(); const $usersPercentage = document.querySelector("#stats-users-highlighted-percentage"); $usersPercentage.textContent = (stats.items_highlighted.users / stats.items_highlighted.total * 100 || 0).toFixed(2); const $pages = document.querySelector("#stats-pages-highlighted"); $pages.textContent = (stats.items_highlighted.pages || 0).toLocaleString(); const $pagesPercentage = document.querySelector("#stats-pages-highlighted-percentage"); $pagesPercentage.textContent = (stats.items_highlighted.pages / stats.items_highlighted.total * 100 || 0).toFixed(2); const $tags = document.querySelector("#stats-tags-highlighted"); $tags.textContent = (stats.items_highlighted.tags || 0).toLocaleString(); const $tagsPercentage = document.querySelector("#stats-tags-highlighted-percentage"); $tagsPercentage.textContent = (stats.items_highlighted.tags / stats.items_highlighted.total * 100 || 0).toFixed(2); } { const time = stats.session_time + (performance.now() - this.ws.time.load); const $time = document.querySelector("#stats-session-time"); $time.textContent = formatTime(time); const $reports = document.querySelector("#stats-reports-per-day"); $reports.textContent = (stats.reports_filed.total / (time / 864e5 || 1) || 0).toFixed(2); const $reverts = document.querySelector("#stats-reverts-per-hour"); $reverts.textContent = (stats.reverts_made.total / (time / 36e5 || 1) || 0).toFixed(2); const $reviews = document.querySelector("#stats-reviews-per-minute"); $reviews.textContent = (stats.edits_reviewed.total / (time / 6e4 || 1) || 0).toFixed(2); } } save() { this.deselect(); document.querySelector("#settings-save-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .save").classList.remove("hidden"); document.querySelector("#settings-save-status").classList.add("hidden"); } changelog() { this.deselect(); document.querySelector("#settings-changelog-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .changelog").classList.remove("hidden"); const $changelog = document.querySelector("#settings-container > .settings > .settings-right > .changelog > div > .changelog-content"); $changelog.innerHTML = "<em class='animate-loading-dots'>Loading changelog</em>"; _wikishield.WikiShield.config.changelog.HTML.then(html => $changelog.innerHTML = html); } about() { this.deselect(); document.querySelector("#settings-about-button").classList.add("selected"); document.querySelector("#settings-container > .settings > .settings-right > .about").classList.remove("hidden"); document.querySelector("#settings-about-version").textContent = _wikishield.WikiShield.config.version; document.querySelectorAll("#settings-container > .settings > .settings-right > .about > .randomize").forEach($el => { for (let i = $el.children.length; i >= 0; i--) $el.appendChild($el.children[Math.random() * i | 0]); }); } } exports.Settings = Settings; /***/ }, /***/ 7698(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.BuildPalette = BuildPalette; function BuildPalette(steps, ...colors) { const paper = document.createElement("canvas"); paper.width = steps; paper.height = 1; const pen = paper.getContext("2d"); const gradient = pen.createLinearGradient(0, 0, paper.width, 0); const step = 1 / (colors.length - 1); colors.forEach((color, index) => { gradient.addColorStop(step * index, color); }); pen.fillStyle = gradient; pen.fillRect(0, 0, paper.width, paper.height); const data = pen.getImageData(0, 0, paper.width, 1).data; return Array.from({ length: steps }, (_, i) => { const offset = i * 4; return `rgb(${data[offset]}, ${data[offset + 1]}, ${data[offset + 2]})`; }); } /***/ }, /***/ 3241(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.expiryRegex = exports.Utility = void 0; var _scriptEsm = __webpack_require__(4551); function _wrapRegExp() { _wrapRegExp = function(e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap; function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), _setPrototypeOf(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function(r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o]; else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length; ) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function(r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function(t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function(e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function() { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } const expiryRegex = exports.expiryRegex = _wrapRegExp(/(infinity|^(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)W)?(([0-9]+)D)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?)$/, { years: 3, months: 5, weeks: 7, days: 9, hours: 11, minutes: 13, seconds: 15 }); function hasApproxSubstring(needle, haystack, k) { const n = needle.length; const m = haystack.length; if (n === 0) return true; if (m === 0) return n <= k; let prev = new Array(m + 1).fill(0); let curr = new Array(m + 1).fill(0); for (let j = 0; j <= m; j++) prev[j] = 0; for (let i = 1; i <= n; i++) { curr[0] = i; let rowMin = curr[0]; for (let j = 1; j <= m; j++) { const cost = needle[i - 1] === haystack[j - 1] ? 0 : 1; const del = prev[j] + 1; const ins = curr[j - 1] + 1; const sub = prev[j - 1] + cost; const d = Math.min(del, ins, sub); curr[j] = d; if (d < rowMin) rowMin = d; if (i === n && d <= k) return true; } if (rowMin > k) return false; [prev, curr] = [ curr, prev ]; } return false; } class Utility { constructor(ws) { this.ws = ws; } escapeRegex(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } escape(text) { const div = document.createElement("div"); div.textContent = text; return div.innerHTML; } utcString(date) { if (date === Infinity) return "indefinite"; const pad = this.padString; return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1, 2)}-${pad(date.getUTCDate(), 2)}T${pad(date.getUTCHours(), 2)}:${pad(date.getUTCMinutes(), 2)}:${pad(date.getUTCSeconds(), 2)}`; } padString(str, len) { str = str.toString(); while (str.length < len) { str = `0${str}`; } return str; } getMonth(n) { const monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; return monthNames[n]; } monthSectionName() { return `${this.getMonth((new Date).getUTCMonth())} ${(new Date).getUTCFullYear()}`; } escape(str) { return (str || "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;"); } textify(str) { const div = document.createElement("div"); div.innerHTML = str; return div.textContent || div.innerText || ""; } pageLink(title, usePhpString = false, encode = true) { return usePhpString ? `https://${this.ws.server}/w/index.php${title}` : `https://${this.ws.server}/wiki/${encode ? encodeURIComponent(title) : title}`; } truncate(text, length) { return (0, _scriptEsm.truncate)(text, length); } formatBytes(bytes) { const sizes = [ "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB" ]; if (bytes === 0) return "0 B"; const i = Math.floor(Math.log(bytes) / Math.log(1024)); return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + " " + sizes[i]; } getChangeColor(delta) { if (delta === 0) return "#888"; // Gray for no change if (delta > 0) { if (delta >= 1e3) return "#00b894"; if (delta >= 500) return "#00d4a1"; if (delta >= 100) return "#26de81"; return "#55efc4"; } else { const absDelta = Math.abs(delta); if (absDelta >= 1e3) return "#d63031"; if (absDelta >= 500) return "#e74c3c"; if (absDelta >= 100) return "#ff6b6b"; return "#ff8787"; } } getChangeString(delta) { return delta > 0 ? "+" + delta : delta === 0 ? "0" : `&ndash;${Math.abs(delta).toString()}`; } formatNotificationTime(date, now = new Date) { const seconds = Math.floor((now - date) / 1e3); if (seconds <= 0) return "Now"; else if (seconds < 60) return `${seconds}s ago`; else if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`; else if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`; else if (seconds < 2592e3) return `${Math.floor(seconds / 86400)}d ago`; else if (seconds < 31536e3) return `${Math.floor(seconds / 2592e3)}mo ago`; else return `${Math.floor(seconds / 31536e3)}y ago`; } formatDuration(date, now = new Date) { const seconds = Math.floor((now - date) / 1e3); if (seconds <= 0) return "0s"; else if (seconds < 60) return `${seconds}s`; else if (seconds < 3600) return `${Math.floor(seconds / 60)}m`; else if (seconds < 86400) return `${Math.floor(seconds / 3600)}h`; else if (seconds < 2592e3) return `${Math.floor(seconds / 86400)}d`; else if (seconds < 31536e3) return `${Math.floor(seconds / 2592e3)}mo`; else return `${Math.floor(seconds / 31536e3)}y`; } match(needle, haystack) { if (this.ws.store.settings.username_highlighting.fuzzy) { return hasApproxSubstring(needle, haystack, 2); } else { return haystack.toLowerCase().includes(needle.toLowerCase()); } } isIPv4Address(address) { const byte = "(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|0?[0-9]{1,2})"; const regex = new RegExp(`^(${byte}\\.){3}${byte}$`); return regex.test(address); } isIPv6Address(address) { const regex = new RegExp("^(?::(?::|(?::[0-9A-Fa-f]{1,4}){1,7})|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,6}::|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){7})$"); if (regex.test(address)) return true; return new RegExp("^[0-9A-Fa-f]{1,4}(?:::?[0-9A-Fa-f]{1,4}){1,6}$").test(address) && /::/.test(address) && !/::.*::/.test(address); } isIPAddress(address) { return this.isIPv4Address(address) || this.isIPv6Address(address); } isTempAccount(username) { return /^~[0-9]{4,}(-[0-9A-Fa-f]{5})*(-[0-9A-Fa-f]{1,5})$/.test(username); } expiryToDate(string) { if (string === "infinity") return Infinity; const now = new Date; const match = expiryRegex.exec(string); if (!match) return now; return new Date(now.getFullYear() + (parseInt(match.groups.years) || 0), now.getMonth() + (parseInt(match.groups.months) || 0), now.getDate() + (parseInt(match.groups.weeks) || 0) * 7 + (parseInt(match.groups.days) || 0), now.getHours() + (parseInt(match.groups.hours) || 0), now.getMinutes() + (parseInt(match.groups.minutes) || 0), now.getSeconds() + (parseInt(match.groups.seconds) || 0)); } getPageSections(content) { // split into [ { title, level, content }, ... ] const lines = content.split("\n"); const sections = []; let currentSection = { title: "", heading: "", level: 0, content: "" }; for (const line of lines) { const match = /^(=+)\s*(.*?)\s*\1\s*$/.exec(line); if (match) { if (currentSection.title !== "") sections.push(currentSection); currentSection = { title: match[2], heading: match[0], level: match[1].length, content: "" }; } else { if (currentSection.content !== "") currentSection.content += "\n"; currentSection.content += line; } } if (currentSection.content !== "" || currentSection.title !== "") sections.push(currentSection); return sections; } } exports.Utility = Utility; /***/ }, /***/ 5564(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.sortDependencies = sortDependencies; function sortDependencies(items) { const map = new Map(items.map(item => [ item.id, item ])); const visited = new Set; const stack = new Set; const result = []; const visit = (id, path) => { if (visited.has(id)) return; else if (stack.has(id)) { const start = path.indexOf(id); const cycle = path.slice(start).concat(id).join(" -> "); throw new Error(`Cyclic dependency detected: ${cycle}`); } const node = map.get(id); if (!node) throw new Error(`Unknown dependency: ${id}`); stack.add(id); path.push(id); const dependencies = node.dependencies || []; for (const dependency of dependencies) visit(dependency, path); path.pop(); visited.add(id); stack.delete(id); result.push(node); }; for (const item of items) if (!visited.has(item.id)) visit(item.id, []); return result; } /***/ }, /***/ 2069(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Text = void 0; var _Text; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class Case {} _defineProperty(Case, "Lower", Symbol("lower case")); _defineProperty(Case, "Upper", Symbol("UPPER CASE")); _defineProperty(Case, "Title", Symbol("Title Case")); _defineProperty(Case, "Sentence", Symbol("Sentence case")); _defineProperty(Case, "Camel", Symbol("camelCase")); _defineProperty(Case, "Pascal", Symbol("PascalCase")); _defineProperty(Case, "Snake", Symbol("snake_Case")); _defineProperty(Case, "Split", Symbol("split,case")); var _inSentenceCase = new WeakMap; var _single = new WeakMap; var _plural = new WeakMap; var _Text_brand = new WeakSet; class Text { static pluralize(word, n, plural) { return new Text(word).plural(plural).get(n); } constructor(text, currentCase = Case.Sentence) { _classPrivateMethodInitSpec(this, _Text_brand); _classPrivateFieldInitSpec(this, _inSentenceCase, false); _classPrivateFieldInitSpec(this, _single, void 0); _classPrivateFieldInitSpec(this, _plural, void 0); const fromCase = _fromCase.call(Text, text, currentCase); _classPrivateFieldSet(_inSentenceCase, this, fromCase.inSentenceCase); _classPrivateFieldSet(_single, this, fromCase.words); _classPrivateFieldSet(_plural, this, _assertClassBrand(_Text_brand, this, _getPlural).call(this)); } plural() { _classPrivateFieldSet(_plural, this, _assertClassBrand(_Text_brand, this, _getPlural).apply(this, arguments)); return this; } case(type = Case.Sentence) { const format = text => { switch (type) { case Case.Lower: return text.map(word => word.toLowerCase()).join(" "); case Case.Upper: return text.map(word => word.toUpperCase()).join(" "); case Case.Title: return text.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" "); case Case.Sentence: if (_classPrivateFieldGet(_inSentenceCase, this)) return text.join(" "); let punctuation = true; return text.map(word => { let rtn = punctuation ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word.toLowerCase(); punctuation = /[.!?]$/.test(word); return rtn; }).join(" "); case Case.Camel: return text.map((word, i) => i === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(""); case Case.Pascal: return text.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(""); case Case.Snake: return text.map(word => word.toLowerCase()).join("_"); case Case.Split: return text; default: throw new TypeError("Invalid case type, must be a Case value"); } }; const [single, plural] = [ format(_classPrivateFieldGet(_single, this)), format(_classPrivateFieldGet(_plural, this)) ]; return Object.freeze({ get(n = 1) { const text = Number.isNaN(Number(n)) || n === 1 || n === 1n || n === "1" ? single : plural; return text.replace(/(?<!\\)%n/g, n); } }); } get(n = 1) { return this.case().get(n); } } exports.Text = Text; _Text = Text; // convert from case to array of words function _fromCase(text, type) { const temp = (text => { switch (type) { case Case.Lower: case Case.Upper: case Case.Title: case Case.Sentence: return text.split(/\s+/); case Case.Camel: case Case.Pascal: return text.split(/(?=[A-Z])/); case Case.Snake: return text.split(/_/g); case Case.Split: throw new TypeError("Split case is only used for output, not input"); default: throw new TypeError("Invalid case type, must be a Case value"); } })(text.toString().trim()); if (type === Case.Sentence) return { inSentenceCase: true, words: temp.map(word => word.trim()).filter(word => word.length > 0) }; return { inSentenceCase: false, words: temp.map(word => word.trim().toLowerCase()).filter(word => word.length > 0) }; } function _getPlural(plural) { if (plural !== null && plural !== void 0 ? plural : true === true) { const temp = [ ..._classPrivateFieldGet(_single, this) ]; const end = temp.length - 1; temp[end] = (single => { let temp; // s, sh, ch, x, z, consonant + o -> -es temp = single.replace(/(?<=sh?|ch|x|z|[^aeiou]o)$/i, "es"); if (temp !== single) return temp; // consonant + y -> -ies temp = single.replace(/(?<=[^aeiou])y$/i, "ies"); if (temp !== single) return temp; // f, fe -> -ves temp = single.replace(/fe?$/i, "ves"); if (temp !== single) return temp; return `${single}s`; })(_classPrivateFieldGet(_single, this)[end]); return temp; } else if (plural === false) return [ ..._classPrivateFieldGet(_single, this) ]; else if (plural instanceof _Text) return plural.case(Case.Split).get(); else throw new TypeError("Invalid plural argument, must be boolean or Text instance"); } _defineProperty(Text, "Case", Case); }, /***/ 8878(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MediaWikiAPI = void 0; var _scriptEsm = __webpack_require__(1289); var _scriptEsm2 = __webpack_require__(4551); var _scriptEsm3 = __webpack_require__(2852); var _scriptEsm4 = __webpack_require__(6873); var _ores = __webpack_require__(505); var _servers = __webpack_require__(8582); function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } const Logger = console; const __tags__ = new Set(_servers.__servers__.filter(s => s.tag).map(s => s.host)); const __pendingChanges__ = new Set(_servers.__servers__.filter(s => s.pending_changes).map(s => s.host)); class MediaWikiAPI { static get pendingChangesServers() { return Array.from(__pendingChanges__); } static hasPendingChanges(server) { return __pendingChanges__.has(server); } static chunk(array, size = 50) { const chunks = []; const len = array.length; for (let i = 0; i < len; i += size) chunks.push(array.slice(i, i + size)); return chunks; } static paramify(param) { if (!Array.isArray(param)) param = [ param ]; return [ ...new Set(param) ]; } static join(param) { return param.join("|").replace(/\|\|+/g, "|"); } static getUsername(oauth, server) { return oauth.fetch(`https://${server}/w/api.php`, { action: "query", meta: "userinfo", uiprop: "name", format: "json", formatversion: 2 }, undefined, "POST", true).then(data => { var _data$query; return (data === null || data === void 0 || (_data$query = data.query) === null || _data$query === void 0 || (_data$query = _data$query.userinfo) === null || _data$query === void 0 ? void 0 : _data$query.name) || null; }); } constructor(glob, oauth, server, username) { var _MediaWikiAPI$cache, _MediaWikiAPI$cache$s; this.glob = glob; this.oauth = oauth; this.server = server; this.username = username; this.tokens = {}; (_MediaWikiAPI$cache$s = (_MediaWikiAPI$cache = MediaWikiAPI.cache)[server]) !== null && _MediaWikiAPI$cache$s !== void 0 ? _MediaWikiAPI$cache$s : _MediaWikiAPI$cache[server] = { parse: new _scriptEsm4.Trie({ size: 1e3 }), pending: new _scriptEsm3.Memory({ size: 2500, timeout: 60 * 60 * 1e3 }), abuse: new _scriptEsm3.Memory({ size: 2500, timeout: 15 * 60 * 1e3 }), ores: new _scriptEsm3.Memory({ size: 1e4, timeout: 15 * 60 * 1e3 }), diff: new _scriptEsm3.Memory({ size: 500, timeout: 5 * 60 * 1e3 }) }; } close() { this.stream.disconnect(); } get cache() { return MediaWikiAPI.cache[this.server]; } build(opts = {}, serverOverride = null) { return { tags: __tags__.has(serverOverride !== null && serverOverride !== void 0 ? serverOverride : this.server) ? "WikiShield script" : "", assertuser: this.username, discussiontoolsautosubscribe: "no", ...opts }; } user(username) { return `[[Special:Contribs/${username}|${username}]] ([[User talk:${username}|talk]])`; } revision(revid) { return `[[Special:Diff/${revid}|${revid}]]`; } centralAuthUser(username) { return `[[Special:CentralAuth/${username}|${username}]]`; } summary(base, custom) { const watermark = " ([[:en:WP:WikiShield|WS]])"; // tehehe const message = `${base}${custom ? `: ${custom}` : ""}`; return `${(0, _scriptEsm2.truncate)(message, 500 - watermark.length)}${watermark}`; } async post(params, bypass = false, serverOverride = null) { try { const data = await this.oauth.fetch(`https://${serverOverride || this.server}/w/api.php`, this.build({ ...params, format: "json", formatversion: 2 }, serverOverride), undefined, "POST", bypass, serverOverride); if (data.error) { if (data.error.code === "alreadyrolled" || data.error.code === "editconflict") return "editconflict"; else if (data.error.code === "missingcontent" && params.action === "compare") // uh oh, it got revdel'd or oversighted return { compare: { body: "" } }; else throw new Error(`API Error: ${data.error.code} - ${data.error.info}`); } return data; } catch (err) { Logger.error("Error in API POST request:", err, JSON.stringify(params)); throw err; } } async continuous(params, cancel, bypass, serverOverride) { try { let cont = null; const responses = []; do { const data = await this.post({ ...params, ...cont || {} }, bypass, serverOverride); responses.push(data); cont = data.continue || null; if (typeof cancel === "function" && await cancel(data, responses) === true) cont = false; } while (cont); return { stopped: cont !== null, responses }; } catch (err) { Logger.error("Error in API continuous request:", err, JSON.stringify(params)); return { stopped: true, responses: [] }; } } async getToken(type = "csrf", bypass, serverOverride) { const id = `${serverOverride !== null && serverOverride !== void 0 ? serverOverride : this.server}:${type}`; if (this.tokens[id] === undefined) { try { return this.tokens[id] = this.post({ action: "query", meta: "tokens", type }, bypass, serverOverride).then(data => { var _data$query2; return (data === null || data === void 0 || (_data$query2 = data.query) === null || _data$query2 === void 0 || (_data$query2 = _data$query2.tokens) === null || _data$query2 === void 0 ? void 0 : _data$query2[`${type}token`]) || null; }); } catch (err) { Logger.error("Error fetching token:", err); throw err; } } else return this.tokens[id]; } async postWithToken(params, type = "csrf", bypass, serverOverride) { try { return await this.post({ ...params, token: await this.getToken(type, bypass, serverOverride) }, bypass, serverOverride); } catch (err) { Logger.error("Post with token error:", err); throw err; } } async account(bypass, serverOverride) { try { var _await$this$post; return ((_await$this$post = await this.post({ action: "query", meta: "userinfo", uiprop: "*" }, bypass, serverOverride)) === null || _await$this$post === void 0 || (_await$this$post = _await$this$post.query) === null || _await$this$post === void 0 ? void 0 : _await$this$post.userinfo) || {}; } catch (err) { var _Logger$error; return (_Logger$error = void Logger.error("Error fetching account info:", err)) !== null && _Logger$error !== void 0 ? _Logger$error : {}; } // removed by dead control flow } async getGlobalUserInfo(username, bypass, serverOverride) { try { var _response$query; const response = await this.post({ action: "query", meta: "globaluserinfo", guiuser: username, guiprop: "groups|rights" }, bypass, serverOverride); return ((_response$query = response.query) === null || _response$query === void 0 ? void 0 : _response$query.globaluserinfo) || {}; } catch (err) { var _Logger$error2; return (_Logger$error2 = void Logger.error("Error fetching global user info:", err)) !== null && _Logger$error2 !== void 0 ? _Logger$error2 : {}; } } async markWatchlistSeen(page, id, bypass, serverOverride) { try { await this.postWithToken({ action: "setnotificationtimestamp", titles: page, newerthanrevid: id }, "csrf", bypass, serverOverride); } catch (err) { var _Logger$error3; return (_Logger$error3 = void Logger.error("Error marking watchlist item as seen:", err)) !== null && _Logger$error3 !== void 0 ? _Logger$error3 : { valid: false, reason: err.message }; } } async append(title, section, content, summary, check = null, bypass, serverOverride) { try { if (check !== null) { const text = (await this.getPagesContent([ title ], bypass, serverOverride))[title] || ""; return { needsCheck: true, text }; } const result = await this.postWithToken({ action: "edit", title, ...(section !== null && section !== void 0 ? section : null) === null ? {} : { section }, appendtext: `\n${content}`, summary }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error4; return (_Logger$error4 = void Logger.error("Error appending to section:", err)) !== null && _Logger$error4 !== void 0 ? _Logger$error4 : { valid: false, reason: err.message }; } } async editSection(title, index, section, content, summary, check = null, bypass, serverOverride) { try { if (check !== null) { const text = (await this.getPagesContent([ title ], bypass, serverOverride))[title] || ""; return { needsCheck: true, text }; } const result = await this.postWithToken({ action: "edit", title, section: index, sectiontitle: section, text: content, summary }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error5; return (_Logger$error5 = void Logger.error("Error editing section:", err)) !== null && _Logger$error5 !== void 0 ? _Logger$error5 : { valid: false, reason: err.message }; } } async acceptPendingEdit(id, summary, bypass, serverOverride) { try { await this.postWithToken({ action: "review", revid: id, comment: summary }, "csrf", bypass, serverOverride); return { valid: true }; } catch (err) { return { valid: false, reason: "Edit could not be accepted." }; } } async rejectPendingEdit(id, prior, title, summary, bypass, serverOverride) { try { const stable = (await this.getRevisionsContent([ prior ], bypass, serverOverride))[prior] || ""; const result = await this.postWithToken({ action: "edit", title, text: stable, summary, baserevid: id }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { return { valid: false, reason: "Edit could not be rejected." }; } } async rollbackEdit(title, user, summary, bypass, serverOverride) { try { var _result$rollback; const result = await this.postWithToken({ action: "rollback", title, user, summary }, "rollback", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; else if (result === "onlyauthor") return { valid: false, reason: "Cannot rollback edits as the no other user has edited the page." }; else if (!((_result$rollback = result.rollback) !== null && _result$rollback !== void 0 && _result$rollback.revid)) return { valid: false, reason: "Edit conflict." }; const data = await this.getRevision(title, result.rollback.revid, bypass, serverOverride); if (data.user !== this.username) return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error6; return (_Logger$error6 = void Logger.error("Error rolling back edit:", err)) !== null && _Logger$error6 !== void 0 ? _Logger$error6 : { valid: false, reason: err.message }; } } async undoEdit(title, revid, summary, bypass, serverOverride) { try { var _result$edit; const result = await this.postWithToken({ action: "edit", title, undo: revid, summary }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; else if (!((_result$edit = result.edit) !== null && _result$edit !== void 0 && _result$edit.newrevid)) return { valid: false, reason: "Edit conflict." }; const data = await this.getRevision(title, result.edit.newrevid, bypass, serverOverride); if (data.user !== this.username) return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error7; return (_Logger$error7 = void Logger.error("Error undoing edit:", err)) !== null && _Logger$error7 !== void 0 ? _Logger$error7 : { valid: false, reason: err.message }; } } async restoreEdit(title, revid, summary, bypass, serverOverride) { try { var _result$edit2; const start = (0, _scriptEsm.convertToUTCString)(new Date); const content = (await this.getRevisionsContent([ revid ], bypass, serverOverride))[revid] || ""; const result = await this.postWithToken({ action: "edit", title, text: content, summary, starttimestamp: start }, "csrf", bypass, serverOverride); if (result === "editconflict") return { valid: false, reason: "Edit conflict." }; else if (!((_result$edit2 = result.edit) !== null && _result$edit2 !== void 0 && _result$edit2.newrevid)) return { valid: false, reason: "Edit conflict." }; const data = await this.getRevision(title, result.edit.newrevid, bypass, serverOverride); if (data.user !== this.username) return { valid: false, reason: "Edit conflict." }; return { valid: true }; } catch (err) { var _Logger$error8; return (_Logger$error8 = void Logger.error("Error restoring edit:", err)) !== null && _Logger$error8 !== void 0 ? _Logger$error8 : { valid: false, reason: err.message }; } } async thankRevision(revid, bypass, serverOverride) { try { await this.postWithToken({ action: "thank", rev: revid }, "csrf", bypass, serverOverride); return { valid: true }; } catch (err) { var _Logger$error9; return (_Logger$error9 = void Logger.error("Error thanking revision:", err)) !== null && _Logger$error9 !== void 0 ? _Logger$error9 : { valid: false, reason: err.message }; } } async watchPage(title, expiry, bypass, serverOverride) { try { await this.postWithToken({ action: "watch", title, expiry }, "watch", bypass, serverOverride); return { valid: true }; } catch (err) { var _Logger$error0; return (_Logger$error0 = void Logger.error("Error watching page:", err)) !== null && _Logger$error0 !== void 0 ? _Logger$error0 : { valid: false, reason: err.message }; } } async unwatchPage(title, bypass, serverOverride) { try { await this.postWithToken({ action: "watch", title, unwatch: true }, "watch", bypass, serverOverride); return { valid: true }; } catch (err) { var _Logger$error1; return (_Logger$error1 = void Logger.error("Error unwatching page:", err)) !== null && _Logger$error1 !== void 0 ? _Logger$error1 : { valid: false, reason: err.message }; } } async parse(wt, title, preview = false, bypass, serverOverride) { title !== null && title !== void 0 ? title : title = undefined; const cacheKey = [ title, wt ].filter(item => item !== undefined); if (this.cache.parse.has(...cacheKey)) return this.cache.parse.get(...cacheKey); try { var _await$this$post2; const text = ((_await$this$post2 = await this.post({ action: "parse", prop: "text", preview, text: wt, title, contentmodel: "wikitext" }, bypass, serverOverride)) === null || _await$this$post2 === void 0 || (_await$this$post2 = _await$this$post2.parse) === null || _await$this$post2 === void 0 ? void 0 : _await$this$post2.text) || ""; this.cache.parse.set(...cacheKey, text); return text; } catch (err) { var _Logger$error10; return (_Logger$error10 = void Logger.error("Error parsing wikitext:", err)) !== null && _Logger$error10 !== void 0 ? _Logger$error10 : ""; } } async getTags(bypass, serverOverride) { try { return (await this.continuous({ action: "query", list: "tags", tglimit: "max" }, undefined, bypass, serverOverride)).responses.flatMap(r => { var _r$query; return ((_r$query = r.query) === null || _r$query === void 0 ? void 0 : _r$query.tags) || []; }); } catch (err) { var _Logger$error11; return (_Logger$error11 = void Logger.error("Error fetching revisions between IDs:", err)) !== null && _Logger$error11 !== void 0 ? _Logger$error11 : []; } } async getPagesContent(titles, bypass, serverOverride) { titles = MediaWikiAPI.paramify(titles); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(titles, 50).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "content", rvslots: "*", titles: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const pages = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query = promise.value.query) === null || _promise$value$query === void 0 ? void 0 : _promise$value$query.pages) || []) { var _promise$value$query, _page$revisions; pages[page.title] = ((_page$revisions = page.revisions) === null || _page$revisions === void 0 || (_page$revisions = _page$revisions[0]) === null || _page$revisions === void 0 || (_page$revisions = _page$revisions.slots) === null || _page$revisions === void 0 || (_page$revisions = _page$revisions.main) === null || _page$revisions === void 0 ? void 0 : _page$revisions.content) || ""; } } return pages; } catch (err) { var _Logger$error12; return (_Logger$error12 = void Logger.error("Error fetching pages content:", err)) !== null && _Logger$error12 !== void 0 ? _Logger$error12 : {}; } } async getRevisionsContent(revids, bypass, serverOverride) { revids = MediaWikiAPI.paramify(revids); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(revids, 500).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "ids|content", rvslots: "*", revids: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const revisions = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query2 = promise.value.query) === null || _promise$value$query2 === void 0 ? void 0 : _promise$value$query2.pages) || []) { var _promise$value$query2; for (const rev of page.revisions || []) { var _rev$slots; revisions[rev.revid] = ((_rev$slots = rev.slots) === null || _rev$slots === void 0 || (_rev$slots = _rev$slots.main) === null || _rev$slots === void 0 ? void 0 : _rev$slots.content) || ""; } } } return revisions; } catch (err) { var _Logger$error13; return (_Logger$error13 = void Logger.error("Error fetching revisions content:", err)) !== null && _Logger$error13 !== void 0 ? _Logger$error13 : {}; } } async getLatestIds(titles, bypass, serverOverride) { titles = MediaWikiAPI.paramify(titles); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(titles, 50).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "ids", titles: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const pages = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query3 = promise.value.query) === null || _promise$value$query3 === void 0 ? void 0 : _promise$value$query3.pages) || []) { var _promise$value$query3, _page$revisions2; pages[page.title] = ((_page$revisions2 = page.revisions) === null || _page$revisions2 === void 0 || (_page$revisions2 = _page$revisions2[0]) === null || _page$revisions2 === void 0 ? void 0 : _page$revisions2.revid) || null; } } return pages; } catch (err) { var _Logger$error14; return (_Logger$error14 = void Logger.error("Error fetching latest IDs:", err)) !== null && _Logger$error14 !== void 0 ? _Logger$error14 : {}; } } async getRevisionsBetween(title, from, to, bypass, serverOverride) { try { return (await this.continuous({ action: "query", prop: "revisions", titles: title, rvstartid: to, rvendid: from, rvprop: "title|ids|flags|user|timestamp|comment|parsedcomment|size|tags", rvlimit: "max" }, undefined, bypass, serverOverride)).responses.flatMap(r => { var _r$query2; return ((_r$query2 = r.query) === null || _r$query2 === void 0 || (_r$query2 = _r$query2.pages) === null || _r$query2 === void 0 || (_r$query2 = _r$query2[0]) === null || _r$query2 === void 0 ? void 0 : _r$query2.revisions) || []; }); } catch (err) { var _Logger$error15; return (_Logger$error15 = void Logger.error("Error fetching revisions between IDs:", err)) !== null && _Logger$error15 !== void 0 ? _Logger$error15 : []; } } async getEditCounts(usernames, bypass, serverOverride) { usernames = MediaWikiAPI.paramify(usernames); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(usernames, 500).map(async chunk => await this.post({ action: "query", list: "users", usprop: "editcount", ususers: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const users = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const user of ((_promise$value$query4 = promise.value.query) === null || _promise$value$query4 === void 0 ? void 0 : _promise$value$query4.users) || []) { var _promise$value$query4; users[user.name] = user.editcount; } } return users; } catch (err) { var _Logger$error16; return (_Logger$error16 = void Logger.error("Error fetching edit counts:", err)) !== null && _Logger$error16 !== void 0 ? _Logger$error16 : {}; } } async areUsersBlocked(usernames, bypass, serverOverride) { usernames = MediaWikiAPI.paramify(usernames); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(usernames, 500).map(async chunk => await this.post({ action: "query", list: "blocks", bkusers: MediaWikiAPI.join(chunk), bkprop: "id|user|by|reason|expiry|flags" }, bypass, serverOverride))); const users = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const block of ((_promise$value$query5 = promise.value.query) === null || _promise$value$query5 === void 0 ? void 0 : _promise$value$query5.blocks) || []) { var _promise$value$query5; users[block.user] = block; } } return users; } catch (err) { var _Logger$error17; return (_Logger$error17 = void Logger.error("Error fetching blocked users:", err)) !== null && _Logger$error17 !== void 0 ? _Logger$error17 : {}; } } async isUserGloballyLocked(username, bypass, serverOverride) { try { var _response$query2; const response = await this.post({ action: "query", meta: "globaluserinfo", guiuser: username }, bypass, serverOverride); return ((_response$query2 = response.query) === null || _response$query2 === void 0 || (_response$query2 = _response$query2.globaluserinfo) === null || _response$query2 === void 0 ? void 0 : _response$query2.locked) === true; } catch (err) { var _Logger$error18; return (_Logger$error18 = void Logger.error("Error checking if user is globally locked:", err)) !== null && _Logger$error18 !== void 0 ? _Logger$error18 : false; } } async getContributions(username, limit = 10, bypass, serverOverride) { try { var _await$this$post$quer; return ((_await$this$post$quer = (await this.post({ action: "query", list: "usercontribs", ucuser: username, uclimit: limit, ucprop: "ids|title|timestamp|comment|parsedcomment|flags|tags|sizediff|flags" }, bypass, serverOverride)).query) === null || _await$this$post$quer === void 0 ? void 0 : _await$this$post$quer.usercontribs) || []; } catch (err) { var _Logger$error19; return (_Logger$error19 = void Logger.error("Error fetching contributions:", err)) !== null && _Logger$error19 !== void 0 ? _Logger$error19 : []; } } async getBlocks(username, bypass, serverOverride) { try { return (await this.continuous({ action: "query", list: "logevents", letype: "block", letitle: `User:${username}`, leaction: "block/block", lelimit: "max", leprop: "id|timestamp|details|user|comment|parsedcomment" }, undefined, bypass, serverOverride)).responses.flatMap(r => { var _r$query3; return ((_r$query3 = r.query) === null || _r$query3 === void 0 ? void 0 : _r$query3.logevents) || []; }); } catch (err) { var _Logger$error20; return (_Logger$error20 = void Logger.error("Error fetching blocks:", err)) !== null && _Logger$error20 !== void 0 ? _Logger$error20 : []; } } async pagesExist(titles, bypass, serverOverride) { titles = MediaWikiAPI.paramify(titles); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(titles, 50).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "content", rvslots: "*", titles: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const pages = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query6 = promise.value.query) === null || _promise$value$query6 === void 0 ? void 0 : _promise$value$query6.pages) || []) { var _promise$value$query6, _page$revisions3; pages[page.title] = page.missing ? undefined : (_page$revisions3 = page.revisions) === null || _page$revisions3 === void 0 || (_page$revisions3 = _page$revisions3[0].slots) === null || _page$revisions3 === void 0 || (_page$revisions3 = _page$revisions3.main) === null || _page$revisions3 === void 0 ? void 0 : _page$revisions3.content; } } return pages; } catch (err) { var _Logger$error21; return (_Logger$error21 = void Logger.error("Error checking page existence:", err)) !== null && _Logger$error21 !== void 0 ? _Logger$error21 : []; } } async getPagesDetails(titles, bypass, serverOverride) { titles = MediaWikiAPI.paramify(titles); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(titles, 50).map(async chunk => await this.continuous({ action: "query", prop: "info|categories|templates", titles: MediaWikiAPI.join(chunk), inprop: "protection|watched", cllimit: "max", tllimit: "max", tlnamespace: "10" }, undefined, bypass, serverOverride))); const pages = {}; for (const result of promises) { if (result.status !== "fulfilled") continue; for (const page of result.value.responses.flatMap(response => { var _response$query3; return ((_response$query3 = response.query) === null || _response$query3 === void 0 ? void 0 : _response$query3.pages) || []; })) { var _page$title, _pages$_page$title, _pages$page$title, _page$categories; (_pages$_page$title = pages[_page$title = page.title]) !== null && _pages$_page$title !== void 0 ? _pages$_page$title : pages[_page$title] = { protection: null, watched: false, categories: [], metadata: [] }; let highest = ((_pages$page$title = pages[page.title]) === null || _pages$page$title === void 0 || (_pages$page$title = _pages$page$title.protection) === null || _pages$page$title === void 0 ? void 0 : _pages$page$title.level) || null; for (const prot of page.protection || []) { if (prot.type !== "edit") continue; if (prot.level === "sysop" || highest === "sysop") highest = "sysop"; else if (prot.level === "autoconfirmed" || highest === "autoconfirmed") highest = "autoconfirmed"; else if (prot.level === "extendedconfirmed" || highest === "extendedconfirmed") highest = "extendedconfirmed"; } const metadata = []; for (const template of page.templates || []) { const title = template.title.replace(/^Template:/i, ""); if (title.match(/^use\s/i)) metadata.push(title); } pages[page.title] = { protection: highest === null ? { protected: false } : { protected: true, level: highest }, watched: page.watched === true || pages[page.title].watched, categories: pages[page.title].categories.concat(((_page$categories = page.categories) === null || _page$categories === void 0 ? void 0 : _page$categories.map(cat => cat.title)) || []), metadata: pages[page.title].metadata.concat(metadata) }; } } return pages; } catch (err) { var _Logger$error22; return (_Logger$error22 = void Logger.error("Error fetching page details:", err)) !== null && _Logger$error22 !== void 0 ? _Logger$error22 : {}; } } async getHistory(title, limit = 10, bypass, serverOverride) { try { var _await$this$post$quer2; const page = (_await$this$post$quer2 = (await this.post({ action: "query", prop: "revisions", titles: title, rvlimit: limit + 1, // +1 bc we need sizediff rvprop: "ids|user|timestamp|comment|parsedcomment|flags|tags|size|flags" }, bypass, serverOverride)).query) === null || _await$this$post$quer2 === void 0 || (_await$this$post$quer2 = _await$this$post$quer2.pages) === null || _await$this$post$quer2 === void 0 ? void 0 : _await$this$post$quer2[0]; if (!(page !== null && page !== void 0 && page.revisions)) return []; const len = page.revisions.length; const count = Math.min(limit, len || 0); for (let i = 0; i < count; i++) { const rev = page.revisions[i]; rev.ns = page.ns; rev.pageid = page.pageid; rev.title = page.title; if (i + 1 < len) rev.sizediff = rev.size - page.revisions[i + 1].size; else rev.sizediff = rev.size; } return page.revisions.slice(0, count); } catch (err) { var _Logger$error23; return (_Logger$error23 = void Logger.error("Error fetching page history:", err)) !== null && _Logger$error23 !== void 0 ? _Logger$error23 : []; } } async countPageReverts(title, username, bypass, serverOverride) { const check = tag => tag === "mw-undo" || tag === "mw-rollback" || tag === "mw-manual-revert"; try { const data = await this.continuous({ action: "query", prop: "revisions", titles: title, rvdir: "newer", rvstart: (0, _scriptEsm.convertToUTCString)(new Date(Date.now() - 864e5)), // 1 day rvprop: "tags", rvuser: username, rvlimit: "max" }, undefined, bypass, serverOverride); let count = 0; for (const response of data.responses) { var _response$query4; count += ((_response$query4 = response.query) === null || _response$query4 === void 0 || (_response$query4 = _response$query4.pages) === null || _response$query4 === void 0 || (_response$query4 = _response$query4[0]) === null || _response$query4 === void 0 || (_response$query4 = _response$query4.revisions) === null || _response$query4 === void 0 ? void 0 : _response$query4.filter(rev => rev.tags.some(check)).length) || 0; } return count; } catch (err) { var _Logger$error24; return (_Logger$error24 = void Logger.error("Error counting page reverts:", err)) !== null && _Logger$error24 !== void 0 ? _Logger$error24 : 0; } } async getORES(revids, bias, bypass, serverOverride) { revids = MediaWikiAPI.paramify(revids); try { const ores = {}; revids = revids.filter(id => { var _ores$id; const cached = this.cache.ores.get(id); if (cached) return (_ores$id = void (ores[id] = cached)) !== null && _ores$id !== void 0 ? _ores$id : false; return true; }); const chunks = MediaWikiAPI.chunk(revids, 50); const promises = await Promise.allSettled(chunks.map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "ids|oresscores", rvslots: "*", revids: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query7 = promise.value.query) === null || _promise$value$query7 === void 0 ? void 0 : _promise$value$query7.pages) || []) { var _promise$value$query7; for (const rev of page.revisions || []) ores[rev.revid] = rev.oresscores || {}; } } return _ores.ORES.extract(ores, bias); } catch (err) { var _Logger$error25; return (_Logger$error25 = void Logger.error("Error fetching ORES scores:", err)) !== null && _Logger$error25 !== void 0 ? _Logger$error25 : {}; } } async extractORES(ores, bias = .5) { return _ores.ORES.extract(ores, bias); } async getDiff(from, to, format = "table", bypass, serverOverride) { from !== null && from !== void 0 ? from : from = false; const cacheKey = `${format}@${from}-${to}`; if (this.cache.diff.has(cacheKey)) return this.cache.diff.get(cacheKey); try { var _await$this$post$comp; const params = { action: "compare", prop: "diff", difftype: format, torev: to }; if (from == false) { params.fromslots = "main"; params["fromtext-main"] = ""; } else params.fromrev = from; const diff = ((_await$this$post$comp = (await this.post(params, bypass, serverOverride)).compare) === null || _await$this$post$comp === void 0 ? void 0 : _await$this$post$comp.body) || ""; this.cache.diff.set(cacheKey, diff); return diff; } catch (err) { var _Logger$error26; return (_Logger$error26 = void Logger.error("Error fetching diff:", err)) !== null && _Logger$error26 !== void 0 ? _Logger$error26 : ""; } } async getWikitextDiff(from, to, format = "table", bypass, serverOverride) { from !== null && from !== void 0 ? from : from = false; try { var _await$this$post$comp2; return ((_await$this$post$comp2 = (await this.post({ action: "compare", prop: "diff", difftype: format, fromslots: "main", "fromtext-main": from === false ? "" : from, toslots: "main", "totext-main": to }, bypass, serverOverride)).compare) === null || _await$this$post$comp2 === void 0 ? void 0 : _await$this$post$comp2.body) || ""; } catch (err) { var _Logger$error27; return (_Logger$error27 = void Logger.error("Error fetching wikitext diff:", err)) !== null && _Logger$error27 !== void 0 ? _Logger$error27 : ""; } } async getSizeDiff(from, to, bypass, serverOverride) { try { var _this$post$query; const revisions = await ((_this$post$query = this.post({ action: "query", prop: "revisions", rvprop: "size", revids: `${from}|${to}` }, bypass, serverOverride).query) === null || _this$post$query === void 0 || (_this$post$query = _this$post$query.pages) === null || _this$post$query === void 0 || (_this$post$query = _this$post$query[0]) === null || _this$post$query === void 0 ? void 0 : _this$post$query.revisions) || []; if (revisions.length === 0) return 0; else if (revisions.length === 1) return revisions[0].size; return revisions[1].size - revisions[0].size; } catch (err) { var _Logger$error28; return (_Logger$error28 = void Logger.error("Error fetching size diff:", err)) !== null && _Logger$error28 !== void 0 ? _Logger$error28 : 0; } } async getRevision(title, revid, bypass, serverOverride) { try { var _await$this$post$quer3, _page$revisions4, _page$revisions$; const page = (_await$this$post$quer3 = (await this.post({ action: "query", prop: "revisions", titles: title, rvprop: "ids|user|comment|parsedcomment|timestamp|size|tags|flags", rvslots: "*", rvstartid: revid, rvlimit: 2 }, bypass, serverOverride)).query) === null || _await$this$post$quer3 === void 0 || (_await$this$post$quer3 = _await$this$post$quer3.pages) === null || _await$this$post$quer3 === void 0 ? void 0 : _await$this$post$quer3[0]; if (!(page !== null && page !== void 0 && (_page$revisions4 = page.revisions) !== null && _page$revisions4 !== void 0 && _page$revisions4.length)) return {}; const rev = page.revisions[0]; return { revid: rev.revid, parentid: rev.parentid, user: rev.user, parsedcomment: rev.parsedcomment, comment: rev.comment, timestamp: rev.timestamp, size: rev.size, oldlen: ((_page$revisions$ = page.revisions[1]) === null || _page$revisions$ === void 0 ? void 0 : _page$revisions$.size) || 0, minor: rev.minor || false, tags: rev.tags || [] }; } catch (err) { var _Logger$error29; return (_Logger$error29 = void Logger.error("Error fetching revision:", err)) !== null && _Logger$error29 !== void 0 ? _Logger$error29 : {}; } } async getRevisions(revids, bypass, serverOverride) { revids = MediaWikiAPI.paramify(revids); try { const promises = await Promise.allSettled(MediaWikiAPI.chunk(revids, 500).map(async chunk => await this.post({ action: "query", prop: "revisions", rvprop: "ids|user|comment|parsedcomment|timestamp|size|tags|flags|oresscores", rvslots: "*", revids: MediaWikiAPI.join(chunk) }, bypass, serverOverride))); const revisions = {}; for (const promise of promises) { if (promise.status !== "fulfilled") continue; for (const page of ((_promise$value$query8 = promise.value.query) === null || _promise$value$query8 === void 0 ? void 0 : _promise$value$query8.pages) || []) { var _promise$value$query8; for (const rev of page.revisions || []) revisions[rev.revid] = rev; } } return revisions; } catch (err) { var _Logger$error30; return (_Logger$error30 = void Logger.error("Error fetching revisions:", err)) !== null && _Logger$error30 !== void 0 ? _Logger$error30 : {}; } } async getConsecutiveEdits(page, revid, username, bypass, serverOverride) { try { var _last, _prior; const data = await this.continuous({ action: "query", prop: "revisions", titles: page, rvprop: "ids|timestamp|user|size|parsedcomment", rvlimit: "max", rvstartid: revid }, data => { var _data$query3; return (_data$query3 = data.query) === null || _data$query3 === void 0 || (_data$query3 = _data$query3.pages) === null || _data$query3 === void 0 || (_data$query3 = _data$query3[0]) === null || _data$query3 === void 0 ? void 0 : _data$query3.revisions.some(rev => rev.user !== username); }, bypass, serverOverride); const revisions = data.responses.flatMap(response => { var _response$query5; return ((_response$query5 = response.query) === null || _response$query5 === void 0 || (_response$query5 = _response$query5.pages) === null || _response$query5 === void 0 || (_response$query5 = _response$query5[0]) === null || _response$query5 === void 0 ? void 0 : _response$query5.revisions) || []; }); let last, prior; const first = revisions[0]; if ((first === null || first === void 0 ? void 0 : first.user) !== username) return { count: 0, sizediff: 0, timestamp: { new: null, old: null }, diff: null, edits: [] }; const result = { count: 0, sizediff: 0, timestamp: { new: null, old: null }, diff: null, edits: [] }; const len = revisions.length; for (let i = 0; i < len; i++) { const rev = revisions[i]; prior = rev; if (rev.user !== username) break; result.edits.push(rev); last = rev; result.count++; if (i + 1 < len) result.sizediff += rev.size - revisions[i + 1].size || 0; else result.sizediff += rev.size || 0; } result.timestamp.new = (first === null || first === void 0 ? void 0 : first.timestamp) || null; result.timestamp.old = ((_last = last) === null || _last === void 0 ? void 0 : _last.timestamp) || null; if (data.stopped) result.diff = await this.getDiff(((_prior = prior) === null || _prior === void 0 ? void 0 : _prior.revid) || null, first.revid, "table", bypass, serverOverride); else result.diff = await this.getDiff(null, first.revid, "table", bypass, serverOverride); return result; } catch (err) { Logger.error("Get consecutive edits error:", err); return { count: 0, sizediff: 0, timestamp: { new: null, old: null }, diff: null }; } } async parseUsers(usernames, simple, bypass, serverOverride) { usernames = MediaWikiAPI.paramify(usernames); const result = Array.from({ length: usernames.length }, () => ({ user: {} })); try { const promises = []; promises.push(this.getEditCounts(usernames, bypass, serverOverride).then(data => { usernames.forEach((name, i) => result[i].user.edits = data[name] || 0); }), this.areUsersBlocked(usernames, bypass, serverOverride).then(data => { usernames.forEach((name, i) => result[i].user.blocked = data[name] || null); }), this.pagesExist(usernames.map(name => `User talk:${name}`), bypass, serverOverride).then(data => { usernames.forEach((name, i) => result[i].user.talk = data[`User talk:${name}`]); })); if (!simple) promises.push((async () => { await Promise.all(usernames.map(async (name, i) => { [result[i].user.contributions, result[i].user.blocks] = await Promise.all([ this.getContributions(name, undefined, bypass, serverOverride), this.getBlocks(name, bypass, serverOverride) ]); })); })()); await Promise.all(promises); return result; } catch (err) { var _Logger$error31; return (_Logger$error31 = void Logger.error("Parse user error:", err)) !== null && _Logger$error31 !== void 0 ? _Logger$error31 : result; } } async parseEdits(items, simple, oresBias, bypass, serverOverride) { items = MediaWikiAPI.paramify(items); const users = MediaWikiAPI.paramify(items.map(item => item.item.user)); const revids = MediaWikiAPI.paramify(items.map(item => item.item.revid)); const titles = MediaWikiAPI.paramify(items.map(item => item.item.title)); const result = items.map(({item, prior}) => ({ item, prior, data: { user: {}, page: {}, edit: {} } })); try { const promises = []; promises.push(this.parseUsers(users, simple, bypass, serverOverride).then(data => { items.forEach((item, i) => { const userIndex = users.indexOf(item.item.user); result[i].data.user = data[userIndex].user; }); }), this.getPagesDetails(titles, bypass, serverOverride).then(data => { items.forEach((item, i) => { var _data$item$item$title, _data$item$item$title2, _data$item$item$title3, _data$item$item$title4; result[i].data.page.protection = ((_data$item$item$title = data[item.item.title]) === null || _data$item$item$title === void 0 ? void 0 : _data$item$item$title.protection) || { protected: false }; result[i].data.page.watched = ((_data$item$item$title2 = data[item.item.title]) === null || _data$item$item$title2 === void 0 ? void 0 : _data$item$item$title2.watched) || false; result[i].data.page.categories = ((_data$item$item$title3 = data[item.item.title]) === null || _data$item$item$title3 === void 0 ? void 0 : _data$item$item$title3.categories) || []; result[i].data.page.metadata = ((_data$item$item$title4 = data[item.item.title]) === null || _data$item$item$title4 === void 0 ? void 0 : _data$item$item$title4.metadata) || []; }); }), this.getORES(revids, oresBias, bypass, serverOverride).then(data => { items.forEach((item, i) => { result[i].data.edit.ores = data[item.item.revid] || 0; }); })); if (!simple) promises.push((async () => { await Promise.all(items.map(async (item, i) => { [result[i].data.page.consecutive, result[i].data.page.reverts, result[i].data.page.history, result[i].data.edit.diff] = await Promise.all([ this.getConsecutiveEdits(item.item.title, item.item.revid, item.item.user, bypass, serverOverride), this.countPageReverts(item.item.title, this.username, bypass, serverOverride), this.getHistory(item.item.title, undefined, bypass, serverOverride), this.getDiff(item.prior || null, item.item.revid, "table", bypass, serverOverride) ]); })); })()); await Promise.all(promises); return result; } catch (err) { var _Logger$error32; return (_Logger$error32 = void Logger.error("Parse edit error:", err)) !== null && _Logger$error32 !== void 0 ? _Logger$error32 : result; } } async parseAbuselogs(items, simple, bypass, serverOverride) { items = MediaWikiAPI.paramify(items); const users = MediaWikiAPI.paramify(items.map(item => item.user)); const titles = MediaWikiAPI.paramify(items.map(item => item.title)); const result = items.map(item => ({ item, data: { user: {}, page: {}, edit: {} } })); try { const promises = []; promises.push((async () => { await Promise.all(items.map(async (item, i) => { [result[i].data.parsedcomment] = await Promise.all([ this.parse(item.comment, undefined, false, bypass, serverOverride) ]); })); })(), this.parseUsers(users, simple, bypass, serverOverride).then(data => { items.forEach((item, i) => { const userIndex = users.indexOf(item.user); result[i].data.user = data[userIndex].user; }); }), this.getPagesDetails(titles, bypass, serverOverride).then(data => { items.forEach((item, i) => { var _data$item$title, _data$item$title2, _data$item$title3, _data$item$title4; result[i].data.page.protection = ((_data$item$title = data[item.title]) === null || _data$item$title === void 0 ? void 0 : _data$item$title.protection) || { protected: false }; result[i].data.page.watched = ((_data$item$title2 = data[item.title]) === null || _data$item$title2 === void 0 ? void 0 : _data$item$title2.watched) || false; result[i].data.page.categories = ((_data$item$title3 = data[item.title]) === null || _data$item$title3 === void 0 ? void 0 : _data$item$title3.categories) || []; result[i].data.page.metadata = ((_data$item$title4 = data[item.title]) === null || _data$item$title4 === void 0 ? void 0 : _data$item$title4.metadata) || []; }); })); if (!simple) promises.push((async () => { await Promise.all(items.map(async (item, i) => { [result[i].data.page.reverts, result[i].data.page.history, result[i].data.edit.diff] = await Promise.all([ this.countPageReverts(item.title, this.username, bypass, serverOverride), this.getHistory(item.title, undefined, bypass, serverOverride), !item.diff ? Promise.resolve(null) : this.getWikitextDiff(item.diff.old, item.diff.new, "table", bypass, serverOverride) ]); })); })()); await Promise.all(promises); return result; } catch (err) { var _Logger$error33; return (_Logger$error33 = void Logger.error("Parse abuselog error:", err)) !== null && _Logger$error33 !== void 0 ? _Logger$error33 : result; } } async getAbuseLogRevid(logid, bypass, serverOverride) { try { var _await$this$post$quer4, _data$find; const data = ((_await$this$post$quer4 = (await this.post({ action: "query", list: "abuselog", afllogids: logid, aflprop: "ids|revid" }, bypass, serverOverride)).query) === null || _await$this$post$quer4 === void 0 ? void 0 : _await$this$post$quer4.abuselog) || []; return ((_data$find = data.find(entry => entry.id === logid)) === null || _data$find === void 0 ? void 0 : _data$find.revid) || null; } catch (err) { var _Logger$error34; return (_Logger$error34 = void Logger.error("Error fetching abuse log revids:", err)) !== null && _Logger$error34 !== void 0 ? _Logger$error34 : {}; } } async feeds(recent = null, pending = null, users = null, watchlist = null, abuselog = null) { [recent, pending, users, watchlist, abuselog] = [ recent, pending, users, watchlist, abuselog ].map(feed => typeof feed === "object" ? feed : {}); try { const options = { action: "query", list: [] }; if (recent !== null) { options.list.push("recentchanges"); options.rctype = "edit"; options.rcprop = "title|ids|sizes|flags|user|timestamp|comment|parsedcomment|tags|oresscores"; options.rcshow = "!bot"; options.rcnamespace = recent.ns || "*"; if (recent.since) options.rcstart = recent.since; options.rcdir = recent.since ? "newer" : "older"; options.rclimit = "max"; } if (pending !== null && __pendingChanges__.has(this.server)) { options.list.push("oldreviewedpages"); options.ornamespace = pending.ns || "*"; options.orlimit = "max"; } if (users !== null) { options.list.push("logevents"); options.letype = "newusers"; options.wlprop = "ids|title|type|user|timestamp|comment|details|parsedcomment"; if (users.since) options.lestart = users.since; options.ledir = users.since ? "newer" : "older"; options.lelimit = "max"; } if (watchlist !== null) { options.list.push("watchlist"); options.wltype = "edit"; options.wlprop = "title|ids|sizes|flags|user|timestamp|comment|tags|oresscores|parsedcomment"; options.wlexcludeuser = this.username; options.wlnamespace = watchlist.ns || "*"; if (watchlist.since) options.wlstart = watchlist.since; options.wldir = watchlist.since ? "newer" : "older"; options.wllimit = "max"; } if (abuselog !== null) { options.list.push("abuselog"); options.aflnamespace = abuselog.ns || "*"; if (abuselog.since) options.aflstart = abuselog.since; options.afldir = abuselog.since ? "newer" : "older"; options.aflprop = "ids|user|title|action|result|timestamp|hidden|revid|filter|details"; options.afllimit = "max"; } options.list = MediaWikiAPI.join(options.list); const data = { recent: [], pending: [], users: [], watchlist: [], abuselog: [] }; (await this.continuous(options)).responses.forEach(response => { const query = response.query || {}; if (query.recentchanges) data.recent = data.recent.concat(query.recentchanges); if (query.oldreviewedpages) data.pending = data.pending.concat(query.oldreviewedpages).slice(0, 100); // pending changes feed can be very large, so we limit it to 100 entries if (query.logevents) data.users = data.users.concat(query.logevents.filter(entry => !entry.temp)); if (query.watchlist) data.watchlist = data.watchlist.concat(query.watchlist); if (query.abuselog) data.abuselog = data.abuselog.concat(query.abuselog); }); if (data.pending.length > 0) { const stability = new Map; const temp = {}; await Promise.allSettled(data.pending.map(async item => { var _await$stability$get, _rev$query, _page$revisions5; if (!this.cache.pending.has(item.revid)) this.cache.pending.set(item.revid, await this.post({ action: "query", prop: "revisions", titles: item.title, rvstartid: item.revid, rvlimit: 1, rvprop: "ids|flags|user|timestamp|comment|parsedcomment|size|tags" })); const rev = this.cache.pending.get(item.revid); if (!stability.has(item.title)) stability.set(item.title, this.post({ action: "query", list: "logevents", letype: "stable", leprop: "ids|title|type|user|timestamp|comment|details|parsedcomment", letitle: item.title, lelimit: 1 })); item.stability = ((_await$stability$get = await stability.get(item.title)) === null || _await$stability$get === void 0 || (_await$stability$get = _await$stability$get.query) === null || _await$stability$get === void 0 || (_await$stability$get = _await$stability$get.logevents) === null || _await$stability$get === void 0 ? void 0 : _await$stability$get[0]) || {}; const page = (_rev$query = rev.query) === null || _rev$query === void 0 || (_rev$query = _rev$query.pages) === null || _rev$query === void 0 ? void 0 : _rev$query[0]; temp[item.title] = { title: item.title, sizediff: item.diff_size, ...(_page$revisions5 = page.revisions) === null || _page$revisions5 === void 0 ? void 0 : _page$revisions5[0], pending: item }; })); data.pending = Object.values(temp); if (pending.full === true) { const full = {}; await Promise.allSettled(data.pending.map(async item => { const between = await this.getRevisionsBetween(item.title, item.pending.stable_revid, item.revid); if (between.length < 2) return; const stable = between.pop(); full[item.title] = { count: between.length, users: between.reduce((acc, rev) => { if (rev.user in acc) acc[rev.user]++; else acc[rev.user] = 1; return acc; }, {}), edits: between, revid: item.revid, prior: stable.revid, sizediff: item.size - stable.size, timestamp: { new: item.timestamp, old: between[between.length - 1].timestamp }, pending: item.pending }; })); data.pending = full; } } if (data.abuselog.length > 0) { const logsById = {}; data.abuselog.forEach(log => { if (log.action !== "edit") return; const id = `${log.user}|${log.title}|${log.timestamp}`; if (id in logsById) logsById[id].push(log); else logsById[id] = [ log ]; }); const temp = []; await Promise.allSettled(Object.entries(logsById).map(async ([, log]) => { var _revision$revid, _publicEntry$details$, _publicEntry$details, _publicEntry$details$2, _publicEntry$details2; const last = log[log.length - 1]; const result = new Set(log.flatMap(e => e.result.split(","))); const revision = log.find(e => e.revid !== "" && e.revid !== undefined); const publicEntry = log.find(e => Object.keys(e.details).length); temp.push({ id: last.id, revision: revision !== undefined, private: !publicEntry, result, action: last.action, revid: (_revision$revid = revision === null || revision === void 0 ? void 0 : revision.revid) !== null && _revision$revid !== void 0 ? _revision$revid : null, diff: publicEntry.details ? { new: publicEntry.details.new_wikitext, old: publicEntry.details.old_wikitext, size: publicEntry.details.edit_delta } : null, timestamp: last.timestamp, comment: (_publicEntry$details$ = publicEntry === null || publicEntry === void 0 || (_publicEntry$details = publicEntry.details) === null || _publicEntry$details === void 0 ? void 0 : _publicEntry$details.summary) !== null && _publicEntry$details$ !== void 0 ? _publicEntry$details$ : null, user: last.user, editcount: (_publicEntry$details$2 = publicEntry === null || publicEntry === void 0 || (_publicEntry$details2 = publicEntry.details) === null || _publicEntry$details2 === void 0 ? void 0 : _publicEntry$details2.user_editcount) !== null && _publicEntry$details$2 !== void 0 ? _publicEntry$details$2 : null, ns: last.ns, title: last.title, entries: log }); })); data.abuselog = temp; } return data; } catch (err) { Logger.error("Feeds error:", err); return { recent: [], pending: pending.full ? {} : [], users: [], watchlist: [], abuselog: [] }; } } } exports.MediaWikiAPI = MediaWikiAPI; _defineProperty(MediaWikiAPI, "cache", {}); /***/ }, /***/ 2486(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.build = build; var _index = _interopRequireDefault(__webpack_require__(5540)); var _style = _interopRequireDefault(__webpack_require__(4279)); var _style2 = _interopRequireDefault(__webpack_require__(2459)); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } async function build() { document.head.querySelectorAll("link[rel=stylesheet]").forEach(link => link.remove()); // Clear existing stylesheets const parser = new DOMParser; const doc = parser.parseFromString(_index.default, "text/html"); document.title = doc.title; doc.head.querySelectorAll("link[rel=stylesheet]").forEach(link => { document.head.appendChild(Object.assign(document.createElement("link"), { rel: "stylesheet", href: link.href })); }); const styles = [ _style.default, _style2.default ].filter(Boolean).forEach(css => { const $style = document.createElement("style"); $style.textContent = css; document.head.appendChild($style); }); document.body.innerHTML = doc.body.innerHTML; // load body after CSS so everything is styled on load await new Promise(requestAnimationFrame); // wait for next frame to ensure everything is rendered } /***/ }, /***/ 4112(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.MediaWikiOAuth2 = void 0; function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _start = new WeakMap; var _count = new WeakMap; class Throttle { constructor(delay) { _classPrivateFieldInitSpec(this, _start, void 0); _classPrivateFieldInitSpec(this, _count, 0); _classPrivateFieldSet(_start, this, Date.now()); this.delay = delay; this.last = 0; } get count() { return _classPrivateFieldGet(_count, this); } per(divisor = 1) { return Math.floor(_classPrivateFieldGet(_count, this) / ((Date.now() - _classPrivateFieldGet(_start, this)) / divisor)) || 0; } call(fn, bypass = false) { var _this$count, _this$count2; _classPrivateFieldSet(_count, this, (_this$count = _classPrivateFieldGet(_count, this), _this$count2 = _this$count++, _this$count)), _this$count2; const now = Date.now(); const wait = Math.max(0, this.last + this.delay - now); this.last = now + wait; if (bypass || wait === 0) return fn(); else return new Promise(resolve => setTimeout(async () => resolve(await fn()), wait)); } } class MediaWikiOAuth2 { constructor(userAgent) { this.userAgent = userAgent; this.throttle = new Throttle(0); this.api = new mw.Api; } getOrigin(url) { const origin = `${location.protocol}//${location.host}`; try { const apiUrl = new URL(url); const apiOrigin = `${apiUrl.protocol}//${apiUrl.host}`; if (apiOrigin === origin) return undefined; } catch (_unused) {} return origin; } async fetch(url, params = {}, signal = null, method = "POST", bypass) { return await this.throttle.call(async () => { const origin = this.getOrigin(url); if (origin) url += (url.includes("?") ? "&" : "?") + `origin=${encodeURIComponent(origin)}`; return await this.api.ajax({ ...params, origin }, { url, method, ...origin ? { xhrFields: { withCredentials: true } } : {} }).catch(error => { console.error(`[WikiSHield] Failed to parse OAuth2 response (rpm: ${this.throttle.per(6e4)}):`, error); throw error; }); }, bypass); } } exports.MediaWikiOAuth2 = MediaWikiOAuth2; /***/ }, /***/ 505(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.ORES = void 0; class ORES { static extract(data, bias = .5) { const models = [ { key: "goodfaith", field: "false", bias }, { key: "damaging", field: "true", bias: 1 - bias } ]; const result = {}; for (const [revid, scores] of Object.entries(data)) { const values = []; for (const model of models) { var _score$probability$mo, _score$probability; const score = scores[model.key]; if (!score) continue; let value = (_score$probability$mo = (_score$probability = score.probability) === null || _score$probability === void 0 ? void 0 : _score$probability[model.field]) !== null && _score$probability$mo !== void 0 ? _score$probability$mo : score[model.field]; if (value === undefined && score.prediction !== undefined) value = +score.prediction; if (value !== undefined && !isNaN(value)) values.push(value * (model.bias || 0)); } result[revid] = values.length === 0 ? NaN : values.reduce((a, b) => a + b, 0) / values.length; } return result; } } exports.ORES = ORES; /***/ }, /***/ 8582(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.__servers__ = void 0; const __servers__ = exports.__servers__ = [ { name: "English", host: "en.wikipedia.org", language_code: "en", tag: true, pending_changes: true }, { name: "seperator" }, { name: "Test", host: "test2.wikipedia.org", language_code: "en", tag: false, pending_changes: true } ]; /***/ }, /***/ 2535(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", { value: true }); exports.API = void 0; var _scriptEsm = __webpack_require__(4551); var _api = __webpack_require__(8878); var _oauth = __webpack_require__(4112); function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } const serversWithPendingChanges = new Set([]); let API = exports.API = void 0; if (window.isElectron) { var _ws, _server, _account; exports.API = API = (_ws = new WeakMap, _server = new WeakMap, _account = new WeakMap, class API { static chunk(array, size = 50) { const chunks = []; const len = array.length; for (let i = 0; i < len; i += size) chunks.push(array.slice(i, i + size)); return chunks; } static paramify(param) { if (!Array.isArray(param)) param = [ param ]; return [ ...new Set(param) ].filter(p => typeof p === "string" && p.trim()); } get username() { return _classPrivateFieldGet(_account, this); } get hasPendingChanges() { return serversWithPendingChanges.has(_classPrivateFieldGet(_server, this)); } constructor(ws, server, username, pendingChangesServers) { _classPrivateFieldInitSpec(this, _ws, null); _classPrivateFieldInitSpec(this, _server, null); _classPrivateFieldInitSpec(this, _account, null); _classPrivateFieldSet(_ws, this, ws); _classPrivateFieldSet(_server, this, server); _classPrivateFieldSet(_account, this, username); for (const pcServer of pendingChangesServers) serversWithPendingChanges.add(pcServer); } build(opts = {}) { return { assertuser: _classPrivateFieldGet(_account, this), discussiontoolsautosubscribe: "no", ...opts }; } summary(base, custom) { const watermark = " ([[:en:WP:WikiShield|WS]])"; const message = `${base}${custom ? `: ${custom}` : ""}`; return `${(0, _scriptEsm.truncate)(message, 500 - watermark.length)}${watermark}`; } user(username) { return `[[Special:Contribs/${username}|${username}]] ([[User talk:${username}|talk]])`; } revision(revid) { return `[[Special:Diff/${revid}|${revid}]]`; } centralAuthUser(username) { return `[[Special:CentralAuth/${username}|${username}]]`; } async post(params, bypass, serverOverride) { try { return await electron.mwapi("post", params, bypass, serverOverride); } catch (error) { var _error$message; if (error === "assertnameduserfailed" || (_error$message = error.message) !== null && _error$message !== void 0 && _error$message.includes("assertnameduserfailed")) return _classPrivateFieldGet(_ws, this).disable("Invalid account", "Your account was logged out or changed."); throw error; } } async continuous(params, cancel, bypass, serverOverride) { try { let continueObject = null; const responses = []; do { const data = await this.post({ ...params, ...continueObject || {} }, bypass, serverOverride); responses.push(data); continueObject = data.continue || null; if (typeof cancel === "function") if (await cancel(data, responses) === true) { continueObject = true; break; } } while (continueObject); return { stopped: continueObject !== null, responses }; } catch (error) { console.error("Continuous error:", error); return { stopped: true, responses: [] }; } } async getToken(type = "csrf", bypass, serverOverride) { return await electron.mwapi("getToken", type, bypass, serverOverride); } async postWithToken(params, type = "csrf", bypass, serverOverride) { return await electron.mwapi("postWithToken", params, type, bypass, serverOverride); } async account(bypass, serverOverride) { return await electron.mwapi("account", bypass, serverOverride); } async getGlobalUserInfo(username, bypass, serverOverride) { return await electron.mwapi("getGlobalUserInfo", username, bypass, serverOverride); } async markWatchlistSeen(page, id, bypass, serverOverride) { return await electron.mwapi("markWatchlistSeen", page, id, bypass, serverOverride); } async append(title, section, content, summary, check, bypass, serverOverride) { if (typeof check === "function") { const result = await electron.mwapi("append", title, section, content, summary, true, bypass, serverOverride); if (result.needsCheck) { const validity = await check(result.text); if (!validity.valid) return { valid: false, reason: validity.reason || "Append check failed." }; return await electron.mwapi("append", title, section, content, summary, undefined, bypass, serverOverride); } return result; } return await electron.mwapi("append", title, section, content, summary, undefined, bypass, serverOverride); } async editSection(title, index, section, content, summary, check, bypass, serverOverride) { if (typeof check === "function") { const result = await electron.mwapi("editSection", title, index, section, content, summary, true, bypass, serverOverride); if (result.needsCheck) { const validity = await check(result.text); if (!validity.valid) return { valid: false, reason: validity.reason || "Edit section check failed." }; return await electron.mwapi("editSection", title, index, section, content, summary, undefined, bypass, serverOverride); } return result; } return await electron.mwapi("editSection", title, index, section, content, summary, undefined, bypass, serverOverride); } async acceptPendingEdit(id, summary, bypass, serverOverride) { return await electron.mwapi("acceptPendingEdit", id, summary, bypass, serverOverride); } async rejectPendingEdit(id, prior, title, summary, bypass, serverOverride) { return await electron.mwapi("rejectPendingEdit", id, prior, title, summary, bypass, serverOverride); } async rollbackEdit(title, user, summary, bypass, serverOverride) { return await electron.mwapi("rollbackEdit", title, user, summary, bypass, serverOverride); } async undoEdit(title, revid, summary, bypass, serverOverride) { return await electron.mwapi("undoEdit", title, revid, summary, bypass, serverOverride); } async restoreEdit(title, revid, summary, bypass, serverOverride) { return await electron.mwapi("restoreEdit", title, revid, summary, bypass, serverOverride); } async thankRevision(revid, bypass, serverOverride) { return await electron.mwapi("thankRevision", revid, bypass, serverOverride); } async watchPage(title, expiry, bypass, serverOverride) { return await electron.mwapi("watchPage", title, expiry, bypass, serverOverride); } async unwatchPage(title, bypass, serverOverride) { return await electron.mwapi("unwatchPage", title, bypass, serverOverride); } async parse(wt, title, preview = false, bypass, serverOverride) { return await electron.mwapi("parse", wt, title, preview, bypass, serverOverride); } async getTags(bypass, serverOverride) { return await electron.mwapi("getTags", bypass, serverOverride); } async getPagesContent(titles, bypass, serverOverride) { return await electron.mwapi("getPagesContent", titles, bypass, serverOverride); } async getRevisionContent(revids, bypass, serverOverride) { return await electron.mwapi("getRevisionContent", revids, bypass, serverOverride); } async getLatestIds(titles, bypass, serverOverride) { return await electron.mwapi("getLatestIds", titles, bypass, serverOverride); } async getEditCounts(usernames, bypass, serverOverride) { return await electron.mwapi("getEditCounts", usernames, bypass, serverOverride); } async areUsersBlocked(usernames, bypass, serverOverride) { return await electron.mwapi("areUsersBlocked", usernames, bypass, serverOverride); } async isUserGloballyLocked(username, bypass, serverOverride) { return await electron.mwapi("isUserGloballyLocked", username, bypass, serverOverride); } async getContributions(username, limit, bypass, serverOverride) { return await electron.mwapi("getContributions", username, limit, bypass, serverOverride); } async getBlocks(username, bypass, serverOverride) { return await electron.mwapi("getBlocks", username, bypass, serverOverride); } async pagesExist(titles, bypass, serverOverride) { return await electron.mwapi("pagesExist", titles, bypass, serverOverride); } async getPagesDetails(titles, bypass, serverOverride) { return await electron.mwapi("getPagesDetails", titles, bypass, serverOverride); } async countPageReverts(title, username, bypass, serverOverride) { return await electron.mwapi("countPageReverts", title, username, bypass, serverOverride); } async getHistory(title, limit, bypass, serverOverride) { return await electron.mwapi("getHistory", title, limit, bypass, serverOverride); } async getORES(revids, bias, bypass, serverOverride) { return await electron.mwapi("getORES", revids, bias, bypass, serverOverride); } async extractORES(ores, bias) { return await electron.mwapi("extractORES", ores, bias); } async getDiff(from, to, format, bypass, serverOverride) { return await electron.mwapi("getDiff", from, to, format, bypass, serverOverride); } async getRevision(title, revid, bypass, serverOverride) { return await electron.mwapi("getRevision", title, revid, bypass, serverOverride); } async getRevisionsBetween(title, from, to, bypass, serverOverride) { return await electron.mwapi("getRevisionsBetween", title, from, to, bypass, serverOverride); } async parseUsers(usernames, simple, bypass, serverOverride) { return await electron.mwapi("parseUsers", usernames, simple, bypass, serverOverride); } async parseEdits(items, simple, oresBias, bypass, serverOverride) { return await electron.mwapi("parseEdits", items, simple, oresBias, bypass, serverOverride); } async parseAbuselogs(items, simple, bypass, serverOverride) { return await electron.mwapi("parseAbuselogs", items, simple, bypass, serverOverride); } async getConsecutiveEdits(page, revid, username, bypass, serverOverride) { return await electron.mwapi("getConsecutiveEdits", page, revid, username, bypass, serverOverride); } async getAbuseLogRevid(logids, bypass, serverOverride) { return await electron.mwapi("getAbuseLogRevid", logids, bypass, serverOverride); } async feeds(recent, pending, users, watchlist, abuselog) { return await electron.mwapi("feeds", recent, pending, users, watchlist, abuselog); } }); } else { var _ws2; exports.API = API = (_ws2 = new WeakMap, class API extends _api.MediaWikiAPI { get hasPendingChanges() { return serversWithPendingChanges.has(this.server); } constructor(ws, server, username, pendingChangesServers) { super(ws, new _oauth.MediaWikiOAuth2(`WikiShield (${server}; ${username})`), server, username); _classPrivateFieldInitSpec(this, _ws2, null); _classPrivateFieldSet(_ws2, this, ws); this.server = server; this.username = username; for (const pcServer of pendingChangesServers) serversWithPendingChanges.add(pcServer); } } /***/); } }, /***/ 691(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.Killswitch = void 0; function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); } function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); } function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _api = new WeakMap; var _interval = new WeakMap; var _events = new WeakMap; var _Killswitch_brand = new WeakSet; class Killswitch { constructor(ws) { _classPrivateMethodInitSpec(this, _Killswitch_brand); _classPrivateFieldInitSpec(this, _api, null); _classPrivateFieldInitSpec(this, _interval, null); _classPrivateFieldInitSpec(this, _events, { okay: [], unsafe: [], update: [], "force-update": [], kill: [] }); _classPrivateFieldSet(_api, this, ws.api); } on(event, callback, options = {}) { if (_classPrivateFieldGet(_events, this)[event]) _classPrivateFieldGet(_events, this)[event].push({ callback, options }); return this; } async check() { try { var _await$_classPrivateF, _await$_classPrivateF2, _JSON$parse, _data$reload$soft, _data$reload, _data$reload$hard, _data$reload2; const content = (_await$_classPrivateF = (_await$_classPrivateF2 = await _classPrivateFieldGet(_api, this).getPagesContent([ _page._ ], true, "en.wikipedia.org")) === null || _await$_classPrivateF2 === void 0 ? void 0 : _await$_classPrivateF2[_page._]) !== null && _await$_classPrivateF !== void 0 ? _await$_classPrivateF : ""; const data = (_JSON$parse = JSON.parse(content)) === null || _JSON$parse === void 0 ? void 0 : _JSON$parse.WikiShield; if (!data) throw new Error("No killswitch found"); if (data.disabled) return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "kill"); const soft = (_data$reload$soft = (_data$reload = data.reload) === null || _data$reload === void 0 ? void 0 : _data$reload.soft) !== null && _data$reload$soft !== void 0 ? _data$reload$soft : 0; const hard = (_data$reload$hard = (_data$reload2 = data.reload) === null || _data$reload2 === void 0 ? void 0 : _data$reload2.hard) !== null && _data$reload$hard !== void 0 ? _data$reload$hard : 0; if (hard > _hard._) return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "force-update"); else if (soft > _soft._) { _soft._ = soft; return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "update"); } return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "okay"); } catch (error) { return _assertClassBrand(_Killswitch_brand, this, _emit).call(this, "unsafe"); } } monitor(interval = 10 * 1e3) { if (_classPrivateFieldGet(_interval, this)) clearInterval(_classPrivateFieldGet(_interval, this)); _classPrivateFieldSet(_interval, this, setInterval(() => this.check(), +interval)); return this; } } exports.Killswitch = Killswitch; function _emit(event) { if (_classPrivateFieldGet(_events, this)[event]) for (const listener of _classPrivateFieldGet(_events, this)[event]) try { listener.callback(); } catch (_unused) {} finally { var _listener$options; if (((_listener$options = listener.options) === null || _listener$options === void 0 ? void 0 : _listener$options.once) === true) _classPrivateFieldGet(_events, this)[event] = _classPrivateFieldGet(_events, this)[event].filter(l => l !== listener); } return this; } var _page = { _: "User:LuniZunie/JSON/Killswitch.json" }; var _soft = { _: 11 }; var _hard = { _: 1 }; /***/ } /******/ }; /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ if (!(moduleId in __webpack_modules__)) { /******/ delete __webpack_module_cache__[moduleId]; /******/ var e = new Error("Cannot find module '" + moduleId + "'"); /******/ e.code = "MODULE_NOT_FOUND"; /******/ throw e; /******/ } /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ var __webpack_exports__ = {}; /*!******************************************!*\ !*** ./src/wikishield/web-port/index.js ***! \******************************************/ var _script = __webpack_require__(8816); var _build = __webpack_require__(2486); // <nowiki> { var _mw$util$addPortletLi, _history$state; "use strict"; function start() { (0, _build.build)().then(_script.run).catch(error => { console.error("Error during build:", error); alert("An error occurred while starting WikiShield. Please check the console for details."); }); } (_mw$util$addPortletLi = mw.util.addPortletLink("p-personal", mw.util.getUrl("Wikipedia:WikiShield/run"), "Run WikiShield", "pt-wikishield", "WikiShield", undefined, "#pt-notifications")) === null || _mw$util$addPortletLi === void 0 || _mw$util$addPortletLi.addEventListener("click", event => { event.preventDefault(); history.pushState({ page: "WikiShield" }, "", location.href); start(); }); addEventListener("popstate", event => { var _event$state; if (((_event$state = event.state) === null || _event$state === void 0 ? void 0 : _event$state.page) === "WikiShield") start(); }); switch ((_history$state = history.state) === null || _history$state === void 0 ? void 0 : _history$state.page) { case "WikiShield": { history.replaceState(null, "", location.href); } break; case "WikiShield-reload": { history.replaceState({ page: "WikiShield" }, "", location.href); start(); } break; } if (mw.config.get("wgRelevantPageName") === "Wikipedia:WikiShield/run" && mw.config.get("wgAction") === "view") { history.pushState({ page: "WikiShield" }, "", location.href); start(); } } // </nowiki> /******/})(); //# sourceMappingURL=wikishield.js.map cctrh1pykj73vnb32i74j5d9nz1iuwt 613758 613756 2026-05-25T17:14:30Z LuniZunie 25284 add ghost functions, compact bc making it readable crashes 613758 javascript text/javascript !function(){"use strict";var e={4279(e){e.exports="@import url('https://fonts.googleapis.com/css2?family=Varela+Round&display=swap');\r\n\r\n:root {\r\n\t--max-z-index: 2147483647;\r\n\r\n --body-color: rgba(241, 245, 255, 1);\r\n --body-background: rgba(20, 20, 30, 1);\r\n\r\n font-family: 'Inter', sans-serif;\r\n \tfont-optical-sizing: auto;\r\n -webkit-font-smoothing: antialiased;\r\n\t-moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n* {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n::-webkit-scrollbar {\r\n\twidth: 10px;\r\n\theight: 10px;\r\n}\r\n\r\n::-webkit-scrollbar-track {\r\n\tbackground: transparent;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n\tborder: 2px solid transparent;\r\n border-radius: 10px;\r\n\r\n\t/* Theme dependent */\r\n\tbackground: rgba(255, 255, 255, .1);\r\n\tbackground-clip: content-box;\r\n\r\n\t&:hover {\r\n\t\tborder: 2px solid transparent;\r\n\t\tborder-radius: 10px;\r\n\r\n\t\t/* Theme dependent */\r\n\t\tbackground: rgba(255, 255, 255, .2);\r\n\t\tbackground-clip: content-box;\r\n\t}\r\n}\r\n\r\nhtml, body {\r\n width: 100%;\r\n\theight: 100%;\r\n\r\n\toverflow: hidden;\r\n\r\n /* Theme dependent */\r\n background: linear-gradient(135deg,\r\n\t\trgba(20, 30, 48, 1),\r\n\t\trgba(36, 59, 85, 1)\r\n\t);\r\n}\r\n\r\n@keyframes loading-dots {\r\n\t0%, 100% {\r\n\t\tcontent: '';\r\n\t}\r\n\t25% {\r\n\t\tcontent: '.';\r\n\t}\r\n\t50% {\r\n\t\tcontent: '..';\r\n\t}\r\n\t75% {\r\n\t\tcontent: '...';\r\n\t}\r\n}\r\n\r\n.animate-loading-dots::after {\r\n\tcontent: '';\r\n\r\n\tdisplay: inline-block;\r\n\r\n\tanimation: loading-dots 1.5s steps(3, start) infinite;\r\n}\r\n\r\n.auto-scroll {\r\n white-space: nowrap;\r\n overflow: auto hidden;\r\n\r\n scrollbar-width: none;\r\n -ms-overflow-style: none;\r\n\r\n\t&::-webkit-scrollbar { display: none; }\r\n\r\n & > .auto-scroll-item {\r\n display: inline-block;\r\n\r\n\t\t&:not(:last-child) {\r\n\t\t\tmargin-right: 20px;\r\n\t\t}\r\n }\r\n &:not(:has(> .auto-scroll-item)) {\r\n opacity: 0;\r\n }\r\n}"},5540(e){e.exports='<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <meta http-equiv="Content-Security-Policy">\n\n <title>WikiShield</title>\n\n <link rel="stylesheet" href="https://fonts.cdnfonts.com/css/open-dyslexic">\n <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.0/css/all.min.css">\n\n <link rel="stylesheet" href="../common/style.css">\n <link rel="stylesheet" href="style.css">\n\n <script type="module" src="script.js"><\/script>\n </head>\n <body>\n <div id="loading">\n <img class="icon" src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n </div>\n <div id="initial" class="hidden">\n\t\t\t<canvas id="dots-canvas"></canvas>\n\t\t\t<div id="welcome-container" class="shimmer shimmer-border">\n\t\t\t\t<div class="shield-container">\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="shield-icon">\n\t\t\t\t\t\t<img src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<h1>Welcome to <span id="wikishield-sikiwhield">WikiShield</span></h1>\n\t\t\t\t<div class="about-links">\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="about-link">About</a>\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia talk:WikiShield" target="_blank" class="about-link">Discuss</a>\n\t\t\t\t\t<span class="about-link">v<span class="VERSION"></span></span>\n\t\t\t\t</div>\n\t\t\t\t<div id="rollback-needed" class="hidden">\n\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<p>You can apply for rollback rights <a rel="noopener" class="request-link" href="https://www.wikidata.org/wiki/Q7765871" target="_blank">here</a>.</p>\n\t\t\t\t</div>\n\t\t\t\t<button type="button" id="start-button">\n\t\t\t\t\tStart WikiShield <i class="fas fa-arrow-right"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n <div id="app" class="hidden">\n <div id="container">\n <div id="queue">\n <div id="queue-top">\n <div id="queue-top-left" class="queue-button-cluster" data-zen-show="alerts,messages">\n <span class="fa fa-bell" id="alerts-icon" data-tooltip="Alerts" data-zen-show="alerts">\n <span id="alerts-count" class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n <span class="fa fa-inbox" id="messages-icon" data-tooltip="Messages" data-zen-show="messages">\n <span id="messages-count" class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="DEFCON">\n <div class="dot"></div>\n <span><span class="DEFCON-RPM">0</span> RPM</span>\n </div>\n <div id="queue-top-right" class="queue-button-cluster">\n <span class="fa fa-envelope" id="email-button" data-tooltip="Email Emergency, ArbCom, or Oversight" data-multiple-hrefs="email" href></span>\n <span class="fa fa-gear" id="settings-icon" data-tooltip="Settings"></span>\n </div>\n </div>\n <div id="queue-tabs">\n <div id="queue-tab-recent" class="queue-tab selected" data-tooltip="Recent edits">\n <span class="fas fa-stopwatch">\n <span class="icon-count hidden gray" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-pending" class="queue-tab" data-tooltip="Pending edits">\n <span class="fas fa-flag">\n <span class="icon-count hidden orange" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-users" class="queue-tab" data-tooltip="User creation logs">\n <span class="fas fa-user">\n <span class="icon-count hidden green" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-watchlist" class="queue-tab" data-tooltip="Watchlist edits">\n <span class="fas fa-book-bookmark">\n <span class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-abuselog" class="queue-tab" data-tooltip="Abuse logs">\n <span class="fas fa-filter-circle-xmark">\n <span class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n </div>\n </div>\n <div id="queue-items" class="queue-list">\n <div class="queue-empty">\n No edits in queue.\n </div>\n </div>\n <div class="width-adjust" id="queue-width-adjust"></div>\n <div id="clear-queue">\n <span class="fa fa-trash"></span>\n </div>\n </div>\n <div id="alerts-panel" class="notification-panel">\n <div id="alerts-header" class="notification-header">\n <span>Alerts</span>\n <span id="mark-all-alerts-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="alerts-list" class="notification-list"></div>\n </div>\n <div id="messages-panel" class="notification-panel">\n <div id="messages-header" class="notification-header">\n <span>Messages</span>\n <span id="mark-all-messages-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="messages-list" class="notification-list"></div>\n </div>\n <div id="right-container">\n <div id="right-content">\n <div id="main-container">\n <div id="edit-details">\n <div class="central">Nothing selected</div>\n </div>\n <div id="previous-item-button" class="nav-item-button">\n <i class="fas fa-chevron-left"></i>\n </div>\n <div id="next-item-button" class="nav-item-button">\n <i class="fas fa-chevron-right"></i>\n </div>\n <div id="ai-analysis-container" class="hidden shimmer shimmer-border">\n <div class="header">\n <i class="fas fa-robot"></i>\n <span class="title">AI Analysis</span>\n <span class="assessment"></span>\n <span class="confidence"></span>\n </div>\n <div class="explanation"></div>\n <div class="issues"></div>\n </div>\n <div id="diff-scroll-up" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-up"></i>\n </div>\n <div id="diff-container"></div>\n <div id="diff-scroll-down" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-down"></i>\n </div>\n <div id="pending-changes-container" class="hidden">\n <div class="accept">Accept</div>\n <div class="reject">Reject</div>\n </div>\n <div id="progress-bar-container"></div>\n <div id="bottom-tools" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-item" data-menu="revert" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-undo"></i>\n <span>Revert</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="warn" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-exclamation-triangle"></i>\n <span>Warn</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="user" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-user"></i>\n <span>User</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="page" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-file-lines"></i>\n <span>Page</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="edit" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-pen-to-square"></i>\n <span>Edit</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n </div>\n <div id="copy-link" data-tooltip="Copy link" data-queue-type="edit,logevent,abuselog">\n <div>\n <i class="fas fa-link"></i>\n </div>\n </div>\n </div>\n <div id="right-details">\n <div id="right-top">\n <div class="tabs">\n <div id="latest-edits-tab" class="tab hidden selected" data-tooltip="Latest edit">\n <i class="fas fa-user"></i>\n </div>\n <div id="consecutive-edits-tab" class="tab hidden" data-tooltip="Consecutive edits">\n <i class="fas fa-users"></i>\n </div>\n </div>\n\n <div class="icons"></div>\n </div>\n\n <div id="user-contributions" class="section" data-queue-type="edit,logevent,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-user-contributions" class="fas fa-rotate"></i> Contributions</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View all contributions</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div id="page-history" class="section" data-queue-type="edit,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-page-history" class="fas fa-rotate"></i> Page History</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View full page history</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div class="width-adjust" id="details-width-adjust"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="bottom-tool-menu" id="revert-menu"></div>\n <div class="bottom-tool-menu" id="warn-menu"></div>\n <div class="bottom-tool-menu" id="user-menu">\n <div id="user-open-user-page" class="menu-option">\n <i class="fas fa-user-circle"></i>\n <span>Open user page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-open-user-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open user talk</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-contribs" class="menu-option">\n <i class="fas fa-list"></i>\n <span>View contributions</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-filter-log" class="menu-option">\n <i class="fas fa-filter"></i>\n <span>View filter log</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="user-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist user</span>\n </div>\n <div id="user-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist user</span>\n </div>\n <div id="user-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight user</span>\n </div>\n <div id="user-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight user</span>\n </div>\n <div class="menu-divider"></div>\n <div id="user-welcome" class="menu-option submenu-trigger">\n <i class="fas fa-paper-plane"></i>\n <span>Welcome</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-aiv" class="menu-option submenu-trigger">\n <i class="fas fa-flag"></i>\n <span>Report (AIV)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-uaa" class="menu-option submenu-trigger">\n <i class="fas fa-user-slash"></i>\n <span>Report (UAA)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-request-global-block" class="menu-option submenu-trigger">\n <i class="fas fa-ban"></i>\n <span>Request global block</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-request-global-lock" class="menu-option submenu-trigger">\n <i class="fas fa-lock"></i>\n <span>Request global lock</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>Message user</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="page-menu">\n <div id="page-open-page" class="menu-option">\n <i class="fas fa-file"></i>\n <span>Open page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-open-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open talk page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-view-history" class="menu-option">\n <i class="fas fa-clock-rotate-left"></i>\n <span>View page history</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="page-watch" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>Watch page</span>\n </div>\n <div id="page-unwatch" class="menu-option">\n <i class="fas fa-eye-slash"></i>\n <span>Unwatch page</span>\n </div>\n <div id="page-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist page</span>\n </div>\n <div id="page-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist page</span>\n </div>\n <div id="page-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight page</span>\n </div>\n <div id="page-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight page</span>\n </div>\n <div class="menu-divider"></div>\n <div id="page-request-protection" class="menu-option submenu-trigger">\n <i class="fas fa-shield-halved"></i>\n <span>Request protection</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="page-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>New talk page topic</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="edit-menu">\n <div id="edit-view-revision" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>View revision</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="edit-view-diff" class="menu-option">\n <i class="fas fa-code-compare"></i>\n <span>View diff</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="edit-thank-user" class="menu-option">\n <i class="fas fa-heart"></i>\n <span>Thank user</span>\n </div>\n <div id="edit-rollback" class="menu-option submenu-trigger">\n <i class="fas fa-rotate-left"></i>\n <span>Rollback</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-rollback-goodfaith" class="menu-option submenu-trigger">\n <i class="fas fa-handshake"></i>\n <span>Rollback (good faith)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-undo" class="menu-option submenu-trigger">\n <i class="fas fa-arrow-rotate-left"></i>\n <span>Undo</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n\n <div id="settings-container">\n <div class="settings">\n <div class="settings-left">\n <div class="settings-category">\n <div class="settings-category-header">\n <span>CORE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-general-button">\n <span><i class="fas fa-gear"></i>General</span>\n </div>\n <div class="settings-left-menu-item" id="settings-audio-button">\n <span><i class="fas fa-volume-high"></i>Audio</span>\n </div>\n <div class="settings-left-menu-item" id="settings-controls-button">\n <span><i class="fas fa-keyboard"></i>Controls</span>\n </div>\n <div class="settings-left-menu-item" id="settings-zen-button">\n <span><i class="fas fa-spa"></i>Zen Mode</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>APPEARANCE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-app-button">\n <span><i class="fas fa-palette"></i>App</span>\n </div>\n <div class="settings-left-menu-item" id="settings-queue-button">\n <span><i class="fas fa-list"></i>Queue</span>\n </div>\n <div class="settings-left-menu-item" id="settings-accessibility-button">\n <span><i class="fas fa-universal-access"></i>Accessibility</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>TOOLS</span>\n </div>\n <div class="settings-left-menu-item" id="settings-auto-reporting-button">\n <span><i class="fas fa-flag"></i>Auto Reporting</span>\n </div>\n <div class="settings-left-menu-item" id="settings-gadgets-button">\n <span><i class="fas fa-toolbox"></i>Gadgets</span>\n </div>\n <div class="settings-left-menu-item" id="settings-AI-button">\n <span><i class="fas fa-robot"></i>AI Analysis</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WHITELIST</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-whitelist-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>HIGHLIGHT</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-highlight-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>DATA</span>\n </div>\n <div class="settings-left-menu-item" id="settings-statistics-button">\n <span><i class="fas fa-chart-area"></i>Statistics</span>\n </div>\n <div class="settings-left-menu-item" id="settings-save-button">\n <span><i class="fas fa-floppy-disk"></i>Save</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WIKISHIELD</span>\n </div>\n <div class="settings-left-menu-item" id="settings-changelog-button">\n <span><i class="fas fa-file-alt"></i>Changelog</span>\n </div>\n <div class="settings-left-menu-item" id="settings-about-button">\n <span><i class="fas fa-info"></i>About</span>\n </div>\n </div>\n </div>\n <div class="settings-right">\n <div class="general hidden">\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum edit count</div>\n <div class="settings-section-desc">Edits from users with more than this number of total edits will not be shown unless that user is highlighted.</div>\n <numeric-input id="settings-maximum-edit-count" step="5" min="0" value="50"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum queue size</div>\n <div class="settings-section-desc">Maximum number of edits to keep in the queue for review. Higher values may impact performance.</div>\n <numeric-input id="settings-maximum-queue-size" step="10" min="0" value="100"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Minimum ORES score</div>\n <div class="settings-section-desc">Minimum ORES score required for an edit to appear in the recent changes queue.</div>\n <numeric-input id="settings-minimum-ores-score" step="0.05" min="0" max="1" value="0"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">ORES bias</div>\n <div class="settings-section-desc">\n Select how ORES scores are calculated for edits in the recent changes queue. "Badfaith" is how likely an edit is to be made in bad faith, "Damaging" is how likely an edit is to be damaging.\n </div>\n <div id="settings-ores-bias" class="settings-slider">\n <div class="settings-slider-labels">\n <div class="settings-slider-label-left active">Badfaith<span class="percent">50%</span></div>\n <div class="settings-slider-label-right active">Damaging<span class="percent">50%</span></div>\n </div>\n <div class="settings-slider-track">\n <div class="settings-slider-thumb"></div>\n </div>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Watchlist expiry</div>\n <div class="settings-section-desc">Amount of time to leave warned user\'s talk pages on your watchlist.</div>\n <duration-input id="settings-watchlist-expiry"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Namespaces to monitor</div>\n <div class="settings-section-desc">Select which namespaces WikiShield should monitor for recent changes and pending changes.</div>\n <div id="settings-namespaces-container" class="checkbox-container">\n \x3c!-- Namespace checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="audio hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">ORES</span>\n <span>ORES Alerts</span>\n </div>\n <div class="settings-section compact inline" id="sound-alert-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Sound alerts for high ORES scores</div>\n <div class="settings-section-desc">Play a sound when an edit above the threshold is added to the queue</div>\n </div>\n <toggle-input id="settings-ORES-alert-toggle" value="false"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="sound-alert-ores-score">\n <div class="settings-section-content">\n <div class="settings-section-title">ORES score threshold</div>\n <div class="settings-section-desc">Play a sound alert when an edit with an ORES score above this value is added</div>\n </div>\n <numeric-input id="settings-ORES-alert-threshold" step="0.05" min="0" max="1" value="0.9"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Volume</div>\n <volume-control\n id="settings-master-volume"\n title="Master Volume"\n description="Controls the overall volume of all sounds"\n value="1"\n ></volume-control>\n <div id="settings-sounds-container" class="settings-section">\n \x3c!-- Individual sound settings will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="controls hidden">\n <div class="settings-section">\n <div class="settings-section-title">Keyboard shortcuts</div>\n <div class="settings-section-desc">Customize keyboard shortcuts for various actions in WikiShield.</div>\n <div class="settings-section compact inline" id="repeat-control-scripts">\n <div class="settings-section-content">\n <div class="settings-section-title">Repeat control scripts</div>\n <div class="settings-section-desc">Allow control scripts to be triggered repeatedly when holding down keys</div>\n </div>\n <toggle-input id="repeat-control-scripts-toggle" value="true"></toggle-input>\n </div>\n <button type="button" id="settings-new-control-script" class="add-action-button new-control-script"><span class="fa fa-plus"></span> Add new action</button>\n </div>\n </div>\n <div class="zen hidden">\n <div class="settings-section">\n <div class="settings-section-title">Zen Mode</div>\n <div class="settings-section-desc">Your distraction-free editing experience.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Zen Mode</div>\n <div class="settings-section-desc">Reduce on-screen distractions while reviewing edits.</div>\n </div>\n <toggle-input id="settings-zen-mode" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Customize Zen Mode</div>\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Sound</div>\n <div class="settings-section-desc">Play sound in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-sound" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Music</div>\n <div class="settings-section-desc">Play background music in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-music" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Alerts</div>\n <div class="settings-section-desc">Show alerts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-alerts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Messages</div>\n <div class="settings-section-desc">Show messages in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-messages" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Toasts</div>\n <div class="settings-section-desc">Show toasts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-toasts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Badges</div>\n <div class="settings-section-desc">Show badges in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-badges" value="true"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="app hidden">\n <div class="settings-section" data-electron="false">\n <div class="settings-section-title">Launch behavior</div>\n <div class="settings-section-desc">Choose whether WikiShield should open inthe current tabor a new tab when launched.</div>\n <div id="settings-launch-behavior" class="settings-radio-group">\n <div class="settings-radio-option selected" data-value="current_tab">Open in current tab</div>\n <div class="settings-radio-option" data-value="new_tab">Open in new tab</div>\n </div>\n </div>\n \x3c!-- <div class="settings-section">\n <div class="settings-section-title">App theme</div>\n <div class="settings-section-desc">Choose between light mode, dark mode, or automatic switching based on system settings.</div>\n <div id="settings-app-theme" class="settings-radio-group">\n <div class="settings-radio-option" data-value="light">Light mode</div>\n <div class="settings-radio-option selected" data-value="auto">Auto</div>\n <div class="settings-radio-option" data-value="dark">Dark mode</div>\n </div>\n </div> --\x3e\n <div class="settings-section">\n <div class="settings-section-title">Startup animation</div>\n <div class="settings-section-desc">Enable or disable the startup animation when launching WikiShield.</div>\n <div id="settings-startup-performance" class="settings-radio-group">\n <div class="settings-radio-option" data-value="always_off">Always off</div>\n <div class="settings-radio-option selected" data-value="adaptive">Adaptive (recommended)</div>\n <div class="settings-radio-option" data-value="always_on">Always on</div>\n </div>\n </div>\n </div>\n <div class="queue hidden">\n <div class="settings-section">\n <div class="settings-section-title">Queues</div>\n <div class="settings-section-desc">Enable or disable different edit queues, and customize their order.</div>\n <draggable-order-list id="settings-queues">\n \x3c!-- Queue items will be populated here --\x3e\n </draggable-order-list>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Color palette</div>\n <div class="settings-section-desc">Select the color palette used for highlighting users and pages.</div>\n <div id="settings-palette-selector" class="palette-selector">\n\n </div>\n </div>\n </div>\n <div class="accessibility hidden">\n <div class="settings-section">\n <div class="settings-section-title">Accessibility Options</div>\n <div class="settings-section-desc">Customize accessibility features for better usability.</div>\n <div class="settings-compact-grid">\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">Colorblind Mode</div>\n <div class="settings-section-desc">Add indicators to help distinguish colors for colorblind users.</div>\n <toggle-input id="settings-colorblind-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Dyslexia Friendly Font</div>\n <div class="settings-section-desc">Use a font that is easier to read for users with dyslexia.</div>\n <toggle-input id="settings-dyslexia-font" value="false"></toggle-input>\n </div>\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">High Contrast Mode</div>\n <div class="settings-section-desc">Increase contrast for better visibility.</div>\n <toggle-input id="settings-high-contrast-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Reduce Motion</div>\n <div class="settings-section-desc">Minimize motion effects for users sensitive to motion.</div>\n <toggle-input id="settings-reduce-motion" value="false"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="auto-reporting hidden">\n <div class="settings-section">\n <div class="settings-section-title">Enable Auto Reporting</div>\n <div class="settings-section-desc">Automatically report edits that receive certain warnings.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Auto Reporting</div>\n <div class="settings-section-desc">When enabled, edits that trigger selected warnings will be automatically reported.</div>\n </div>\n <toggle-input id="settings-auto-reporting-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Auto Reporting Warnings</div>\n <div class="settings-section-desc">Select which warnings should trigger automatic reporting.</div>\n <div id="settings-auto-reporting-warnings-container" class="checkbox-container">\n \x3c!-- Warning checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="gadgets hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-title">Gadgets</div>\n <div class="settings-section-desc">Toggle various Wikishield features.</div>\n <div class="settings-section compact inline" id="auto-welcome-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Automatic welcoming of new users</div>\n <div class="settings-section-desc">Automatically welcome new users with empty talk pages when moving past their constructive edits</div>\n </div>\n <toggle-input id="settings-auto-welcome-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="wikipedia-popups-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Popups</div>\n <div class="settings-section-desc">When enabled, links will be opened in a new window. Otherwise, they will be opened in your default browser. (Not supported by Opera or Safari browsers)</div>\n </div>\n <toggle-input id="settings-wikipedia-popups-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="talk-page-thanks-for-temporary-users-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Send talk page thanks for temporary users</div>\n <div class="settings-section-desc">If enabled, when you thank a temporary user with an empty talk page, WikiShield will send them a welcoming thank you message in addition to the standard thank you message.</div>\n </div>\n <toggle-input id="settings-edit-summaries-toggle" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Username Highlighting</div>\n <div class="settings-section compact inline" id="username-highlighting-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable username highlighting</div>\n <div class="settings-section-desc">Highlights usernames in edit summaries, edit diffs, and user creation logs.</div>\n </div>\n <toggle-input id="settings-username-highlighting-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="username-highlighting-mode-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Toggle fuzzy matching mode</div>\n <div class="settings-section-desc">\n When enabled, highlights similar usernames. Not recommended for users with short usernames.<br/>\n <strong>NOTE:</strong> This may cause performance issues for those with long usernames, or users on weaker devices.\n </div>\n </div>\n <toggle-input id="settings-username-highlighting-fuzzy-toggle" value="false"></toggle-input>\n </div>\n </div>\n </div>\n <div class="AI hidden">\n <div class="settings-section">\n <div class="settings-section-title">AI Analysis</div>\n <div class="settings-section-desc">Configure AI-powered analysis features.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Ollama AI Analysis &lpar;<a href="https://ollama.com">ollama.com</a>&rpar;</div>\n <div class="settings-section-desc">Use local AI models with complete privacy.</div>\n </div>\n <toggle-input id="settings-AI-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">Tools</span>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Edit Analysis</div>\n <div class="settings-section-desc">Suggests actions to take on edits.</div>\n </div>\n <toggle-input id="settings-AI-edit-analysis-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Username Analysis</div>\n <div class="settings-section-desc">Flags potentially problematic usernames and prompts you to report them to UAA</div>\n </div>\n <toggle-input id="settings-AI-username-analysis-toggle" value="true"></toggle-input>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-server-url">\n <div class="settings-section-title">Server URL</div>\n <div class="settings-section-desc">The URL of your local Ollama server</div>\n <div class="text-input-container">\n <input title="Ollama URL" type="text" id="ollama-url-input" autoComplete="off">\n <button type="button" id="settings-ollama-test-connection">Test Connection</button>\n </div>\n <div class="settings-section compact connection-status-container">\n <p id="settings-ollama-connection-status"></p>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-model-select">\n <div class="settings-section-title">\n Model Selection\n <button type="button" id="settings-ollama-refresh-models">\n <span class="fa fa-sync"></span> Refresh Models\n </button>\n </div>\n <div class="settings-section-desc">Select which Ollama model to use for edit analysis</div>\n <div class="settings-section compact models-container">\n <p id="settings-ollama-models-status">Click "Refresh Models" to load available models</p>\n <div id="settings-ollama-models"></div>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-setup">\n <div class="settings-section-title">Setup required</div>\n <div class="settings-section-desc">\n <details>\n <summary><strong>Windows (Permanent)</strong></summary>\n <ol class="pad-list">\n <li>Press <code>Win + R</code>, type <code>sysdm.cpl</code>, and press Enter</li>\n <li>Go to the "Advanced" tab and click on "Environment Variables"</li>\n <li>Create a new variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_HOST</code> and the value to <code>http://127.0.0.11434</code>\n <ul class="pad-list">\n <li><strong>NOTE:</strong> You can change the port (11434) if that port is already in use, but make sure to update the "Server URL" setting in WikiShield accordingly</li>\n </ul>\n </li>\n <li>Click "OK" to save the variable</li>\n <li>Create another variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_ORIGINS</code> and the value to <code>https://*.wikipedia.org</code></li>\n <li>Click "OK" to save the variable, you can now close the Environment Variables and System Properties windows</li>\n <li>Restart Ollama</li>\n </ol>\n </details>\n\n <details>\n <summary><strong>Windows (Temporary)</strong></summary>\n <pre>\n$env:OLLAMA_HOST="http://127.0.0.11434"\n$env:OLLAMA_ORIGINS="https://*.wikipedia.org"\nollama serve</pre>\n </details>\n\n <details>\n <summary><strong>macOS / Linux</strong></summary>\n Add the following to <code>~/.bashrc</code> or <code>~/.zshrc</code>:\n <pre>\nexport OLLAMA_HOST="http://127.0.0.11434"\nexport OLLAMA_ORIGINS="https://*.wikipedia.org"</pre>\n Then run:\n <pre>source ~/.bashrc && ollama serve</pre>\n </details>\n </div>\n </div>\n </div>\n\n <div class="whitelist users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted users</div>\n <div class="settings-section-desc">Amount of time before a whitelisted user is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-users-expiry" label="Default expiry for whitelisted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Users</div>\n <div class="settings-section-desc">Manage your list of whitelisted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-users-input" placeholder="Add user to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-whitelist-users-list" class="settings-section list-container">\n \x3c!-- Whitelisted users will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted pages</div>\n <div class="settings-section-desc">Amount of time before a whitelisted page is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-pages-expiry" label="Default expiry for whitelisted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Pages</div>\n <div class="settings-section-desc">Manage your list of whitelisted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-pages-input" placeholder="Add page to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-whitelist-pages-list" class="settings-section list-container">\n \x3c!-- Whitelisted pages will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted tags</div>\n <div class="settings-section-desc">Amount of time before a whitelisted tag is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-tags-expiry" label="Default expiry for whitelisted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Tags</div>\n <div class="settings-section-desc">Manage your list of whitelisted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-tags-input" placeholder="Add tag to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-whitelist-tags-list" class="settings-section list-container">\n \x3c!-- Whitelisted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="highlight users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted users</div>\n <div class="settings-section-desc">Amount of time before a highlighted user is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-users-expiry" label="Default expiry for highlighted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Users</div>\n <div class="settings-section-desc">Manage your list of highlighted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-users-input" placeholder="Add user to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-highlight-users-list" class="settings-section list-container">\n \x3c!-- Highlighted users will be populated here --\x3e\n </div>\n </div>\n <div class="highlight pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted pages</div>\n <div class="settings-section-desc">Amount of time before a highlighted page is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-pages-expiry" label="Default expiry for highlighted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Pages</div>\n <div class="settings-section-desc">Manage your list of highlighted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-pages-input" placeholder="Add page to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-highlight-pages-list" class="settings-section list-container">\n \x3c!-- Highlighted pages will be populated here --\x3e\n </div>\n </div>\n <div class="highlight tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted tags</div>\n <div class="settings-section-desc">Amount of time before a highlighted tag is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-tags-expiry" label="Default expiry for highlighted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Tags</div>\n <div class="settings-section-desc">Manage your list of highlighted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-tags-input" placeholder="Add tag to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-highlight-tags-list" class="settings-section list-container">\n \x3c!-- Highlighted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="statistics hidden">\n <div class="settings-section">\n <div class="settings-section-title">\n Statistics Overview\n <button type="button" id="reset-statistics-button">Reset Statistics</button>\n </div>\n <div class="stats-grid">\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-total-reviewed" class="stat-value"></div>\n <div class="stat-label">Edits Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have thanked <span id="stats-thanks-percentage"></span>% of the edits you reviewed\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-recent-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Recent Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n Recent changes make up <span id="stats-recent-changes-percentage"></span>% of your reviewed edits\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pending-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Pending Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have accepted <span id="stats-pending-changes-accepted"></span> &lpar;\n <span id="stats-pending-changes-accepted-percentage"></span>%\n &rpar; pending changes\n </div>\n <div class="stat-sublabel">\n You have rejected <span id="stats-pending-changes-rejected"></span> &lpar;\n <span id="stats-pending-changes-rejected-percentage"></span>%\n &rpar; pending changes from entering the public eye\n </div>\n <div class="stat-sublabel">\n Out of all the edits you&rsquo;ve reviewed, <span id="stats-pending-changes-percentage"></span>% of them were pending review\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-user-creations-reviewed" class="stat-value"></div>\n <div class="stat-label">User Creations Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-user-creations-percentage"></span>% of your reviews came from user creations\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-watchlist-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Watchlist Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-watchlist-changes-percentage"></span>% of your reviews came from your watchlist\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-abuselog-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Abuse Log Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-abuselog-changes-percentage"></span>% of your reviews came from your abuse log\n </div>\n </div>\n </div>\n </div>\n\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reverts-made" class="stat-value"></div>\n <div class="stat-label">Reverts Made</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reverts-percentage"></span>% of edits that cross your path are reverted by you\n </div>\n <div class="stat-sublabel">\n You assumed good faith <span id="stats-goodfaith-reverts-percentage"></span>% of the time\n </div>\n <div class="stat-sublabel">\n <span id="stats-recent-reverts-percentage"></span>% of your reverts were from recent changes\n </div>\n <div class="stat-sublabel">\n <span id="stats-pending-reverts-percentage"></span>% of your reverts were pending\n </div>\n <div class="stat-sublabel">\n <span id="stats-watchlist-reverts-percentage"></span>% of your reverts were from your watchlist\n </div>\n <div class="stat-sublabel">\n <span id="stats-abuselog-reverts-percentage"></span>% of your reverts were from your abuse log\n </div>\n <div class="stat-sublabel">\n &hellip;and the last <span id="stats-other-reverts-percentage"></span>% weren&rsquo;t even in your queue!\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-users-welcomed" class="stat-value"></div>\n <div class="stat-label">Users Welcomed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-welcomed-message"></span>\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-warnings" class="stat-value"></div>\n <div class="stat-label">Warnings Issued</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-warning-1-percentage"></span>% were level 1\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-2-percentage"></span>% were level 2\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-3-percentage"></span>% were level 3\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4-percentage"></span>% were level 4\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4im-percentage"></span>% were level 4im\n </div>\n <div class="stat-sublabel">\n &hellip;and the rest we were too lazy to track =&rpar;\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reports" class="stat-value"></div>\n <div class="stat-label">Reports Filed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n AIV accounted for <span id="stats-AIV-reports-percentage"></span>% of your reports\n </div>\n <div class="stat-sublabel">\n another <span id="stats-UAA-reports-percentage"></span>% were for UAA\n </div>\n <div class="stat-sublabel">\n <span id="stats-global-block-reports-percentage"></span>% were for global block requests\n </div>\n <div class="stat-sublabel">\n while <span id="stats-global-lock-reports-percentage"></span>% were for global lock requests\n </div>\n <div class="stat-sublabel">\n finally, <span id="stats-RFPP-reports-percentage"></span>% were posted at RFPP\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pages-watched" class="stat-value"></div>\n <div class="stat-label">Pages Watched</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-pages-unwatched"></span> pages were annoying enough to be unwatched\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-whitelisted" class="stat-value"></div>\n <div class="stat-label">Items Whitelisted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-whitelisted"></span> &lpar;\n <span id="stats-users-whitelisted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-whitelisted"></span> &lpar;\n <span id="stats-pages-whitelisted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-whitelisted"></span> &lpar;\n <span id="stats-tags-whitelisted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-highlighted" class="stat-value"></div>\n <div class="stat-label">Items Highlighted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-highlighted"></span> &lpar;\n <span id="stats-users-highlighted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-highlighted"></span> &lpar;\n <span id="stats-pages-highlighted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-highlighted"></span> &lpar;\n <span id="stats-tags-highlighted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-session-time" class="stat-value"></div>\n <div class="stat-label">Session Time</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reports-per-day"></span> reports per day\n </div>\n <div class="stat-sublabel">\n <span id="stats-reverts-per-hour"></span> reverts per hour\n </div>\n <div class="stat-sublabel">\n <span id="stats-reviews-per-minute"></span> reviews per minute\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="save hidden">\n <div class="save settings-section">\n <div class="save-settings-header">\n <div class="settings-section-title">Save Settings</div>\n <div class="settings-section-desc">Manage how and where your WikiShield settings are stored.</div>\n </div>\n\n <div class="save-settings-content">\n <div class="save-settings-card data-management-card">\n <div class="card-header">\n <div class="card-icon">\n <i class="fa fa-database"></i>\n </div>\n <div class="card-header-content">\n <div class="card-title">Data Management</div>\n <div class="card-desc">Import, export, or reset your WikiShield settings. Settings are encoded as base64 for easy sharing.</div>\n </div>\n </div>\n\n <div class="card-body">\n <div class="action-buttons-grid">\n <button type="button" id="settings-export-button" class="action-card export-card">\n <div class="action-card-icon">\n <i class="fa fa-download"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Export Settings</div>\n <div class="action-card-desc">Save your configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-import-button" class="action-card import-card">\n <div class="action-card-icon">\n <i class="fa fa-upload"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Import Settings</div>\n <div class="action-card-desc">Load saved configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-reset-button" class="action-card reset-card">\n <div class="action-card-icon">\n <i class="fa fa-undo"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Reset Settings</div>\n <div class="action-card-desc">Restore to defaults</div>\n </div>\n </button>\n </div>\n\n <div id="settings-save-status" class="status-message hidden"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="changelog hidden">\n <div class="settings-section">\n <div class="changelog-content">\n\n </div>\n </div>\n </div>\n <div class="about hidden">\n <div class="settings-section">\n <div class="about-content">\n <div class="about-version">\n <span class="fa fa-shield-alt"></span>\n <span>WikiShield v<span id="settings-about-version"></span></span>\n </div>\n\n <div class="about-tagline">\n <p>A powerful, real-time patrolling tool for Wikipedia editors</p>\n </div>\n\n <div class="about-links">\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="link-card docs">\n <div class="link-card-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Documentation</div>\n <div class="link-card-desc">Learn how to use WikiShield</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://github.com/LuniZunie/WikiShield-App" target="_blank" class="link-card source">\n <div class="link-card-icon">\n <span class="fa fa-code-branch"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Source Code</div>\n <div class="link-card-desc">View on GitHub</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia_talk:WikiShield" target="_blank" class="link-card feedback">\n <div class="link-card-icon">\n <span class="fa fa-comments"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Feedback</div>\n <div class="link-card-desc">Share your thoughts</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n </div>\n\n <div class="about-footer">\n <div class="footer-divider"></div>\n <div class="about-credits">\n <div>\n <div class="credit-card" data-link="https://about.luni.me">\n <div class="credit-icon">\n <span class="fa fa-code"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">LuniZunie</div>\n <div class="credit-role auto-scroll">Lead Developer</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Ingenuity">\n <div class="credit-icon">\n <span class="fa fa-lightbulb"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Ingenuity</div>\n <div class="credit-role auto-scroll">Original Creator</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Monkeysmashingkeyboards">\n <div class="credit-icon">\n <span class="fa fa-database"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Monkeysmashingkeyboards</div>\n <div class="credit-role auto-scroll">Backend</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:pro-anti-air">\n <div class="credit-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Pro-anti-air</div>\n <div class="credit-role auto-scroll">Documentation</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Chaotic_Enby">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Chaotic Enby</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:HurricaneZeta">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">HurricaneZeta</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="copyright-card" data-link="https://sound-effects.bbcrewind.co.uk">\n <div class="copyright-title auto-scroll">Nature sounds</div>\n <div class="copyright-desc auto-scroll">bbc.co.uk &ndash; &copy; copyright 2026 BBC</div>\n </div>\n <div class="copyright-card" data-link="https://pixabay.com/sound-effects">\n <div class="copyright-title auto-scroll">Sound effects</div>\n <div class="copyright-desc auto-scroll">pixabay.com &ndash; CC0 License</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </body>\n</html>'},2459(e){e.exports="@keyframes startup {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes particles {\n\t0%, 100% {\n\t\ttransform: translate(0, 0) rotate(0deg);\n\t}\n\t33% {\n\t\ttransform: translate(30px, -30px) rotate(120deg);\n\t}\n\t66% {\n\t\ttransform: translate(-20px, 20px) rotate(240deg);\n\t}\n}\n\n@keyframes container-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(30px) scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0) scale(1);\n\t}\n}\n\n@keyframes border-glow {\n\t0%, 100% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 40px rgba(102, 126, 234, .4),\n\t\t\t0 0 80px rgba(240, 147, 251, .3),\n\t\t\tinset 0 0 60px rgba(102, 126, 234, .15),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .2);\n\t}\n\t50% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 60px rgba(240, 147, 251, .6),\n\t\t\t0 0 120px rgba(102, 126, 234, .4),\n\t\t\tinset 0 0 80px rgba(240, 147, 251, .2),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .3);\n\t}\n}\n\n@keyframes shield-entrance {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: scale(0) rotate(-180deg);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: scale(1.15) rotate(10deg);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: scale(1) rotate(0deg);\n\t}\n}\n\n@keyframes shield-float {\n\t0%, 100% {\n\t\ttransform: translate(-50%, -50%) translateY(0px);\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) translateY(-10px);\n\t}\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: translate(-50%, -50%) scale(.8);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t\topacity: 0.8;\n\t}\n\t100% {\n\t\ttransform: translate(-50%, -50%) scale(1.5);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes sparkle {\n\t0%, 100% {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: scale(1.5);\n\t\topacity: 1;\n\t}\n}\n\n@keyframes title-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-20px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes links-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes warning-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes button-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(40px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes fade-in {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n@keyframes fade-out {\n\tfrom {\n\t\topacity: 1;\n\t}\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-in {\n\tfrom {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n}\n@keyframes scale-out {\n\tfrom {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n\tto {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-x {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n}\n\n@keyframes bottom-tool-menu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n@keyframes bottom-tool-submenu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateX(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n}\n\n@keyframes toast-alert-enter {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: translateX(100%) scale(.8);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: translateX(-10px) scale(1.05);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n}\n@keyframes toast-alert-leave {\n\t0% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n\t100% {\n\t\topacity: 0;\n\t\ttransform: translateX(150%) scale(.7);\n\t}\n}\n\n@keyframes music-toast-enter {\n from {\n opacity: 0;\n transform: translateX(150%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes music-toast-leave {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(150%);\n }\n}\n\n@keyframes tooltip-enter {\n from {\n\t\ttransform: scale(.8);\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes star-spin {\n 0% {\n transform: rotate(0deg) scale(1);\n }\n 50% {\n transform: rotate(180deg) scale(1.3);\n }\n 100% {\n transform: rotate(360deg) scale(1);\n }\n}\n\n@keyframes flash-highlight {\n 0%, 100% {\n filter: brightness(1);\n }\n 50% {\n filter: brightness(.5);\n }\n}\n\n@keyframes logo-loader {\n 0%, 100% {\n transform: scale(1);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 10px rgba(102, 126, 234, .4));\n }\n 50% {\n transform: scale(1.5);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 20px rgba(102, 126, 234, .6));\n }\n}\n\n@keyframes refresh-rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse-DEFCON {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.15);\n }\n 100% {\n transform: scale(1);\n }\n}\n\nbody {\n --transparency: 1;\n\n font-size: clamp(14px, 3vw, 16px);\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n background: rgba(20, 20, 30, 1);\n\n &.dyslexia-font {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n\n *:not(.fa):not(.fas):not(.far):not(.fal):not(.fab) {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n }\n }\n\n &.reduce-motion * {\n animation-duration: 0.001s !important;\n transition-duration: 0.001s !important;\n }\n\n & a {\n text-decoration: none;\n\n &:active {\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n }\n }\n\n & > #popup-blocker {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 1);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease;\n }\n\n & > #loading {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 2);\n\n opacity: 1;\n\n transition: opacity .5s ease;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n & > .icon {\n width: 100vmin;\n }\n }\n\n & > .icon {\n aspect-ratio: 1 / 1;\n width: 12.5vmin;\n\n animation: logo-loader 2s ease-in-out infinite;\n\n transition: width .5s cubic-bezier(0.6, -0.28, 0.735, 0.045);\n }\n }\n\n & > #initial {\n display: flex;\n align-items: center;\n\t justify-content: center;\n\n width: 100%;\n height: 100%;\n\n position: relative;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n display: none;\n }\n\n &:before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 0;\n background:\n radial-gradient(circle at 20% 50%, rgba(102, 126, 234, .08) 0%, transparent 50%),\n radial-gradient(circle at 80% 80%, rgba(118, 75, 162, .06) 0%, transparent 50%);\n pointer-events: none;\n }\n\n &:not(.hidden) {\n animation: startup 1.2s ease-out;\n\n & > #welcome-container {\n animation: container-fade-in 1.2s ease-out;\n\n & > .shield-container {\n animation: shield-entrance 1.5s ease 2s forwards;\n }\n\n & > h1 {\n animation: title-fade-in 0.8s ease-out 0.5s both;\n }\n\n & > .about-links {\n animation: link-slide-in 0.8s ease-out 0.7s both;\n }\n\n & > #rollback-needed {\n animation: warning-fade-in 1s ease-out 0.7s both;\n }\n\n & > button {\n animation: button-slide-in 2s ease-out 1s both;\n }\n }\n }\n\n & > #dots-canvas {\n width: 100%;\n height: 100%;\n\n position: absolute;\n z-index: 0;\n left: 0;\n top: 0;\n }\n\n & > #welcome-container {\n padding: 48px;\n\n border-radius: 16px;\n\n max-width: 480px;\n\n position: relative;\n z-index: 2;\n\n text-align: center;\n\n overflow: hidden;\n\n /* Theme dependent */\n border: 1px solid rgba(143, 163, 255, .15);\n box-shadow:\n 0 12px 40px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & * {\n position: relative;\n z-index: 1;\n }\n\n & > .shield-container {\n width: 100px;\n height: 100px;\n\n position: relative;\n\n margin: 0 auto 24px;\n\n opacity: 0;\n\n & > .glow-ring {\n width: 240px;\n height: 240px;\n\n position: absolute;\n left: 50%;\n top: 50%;\n\n border: 2px solid;\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: pulse 2.5s ease-in-out infinite;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n &:nth-child(2) {\n animation-delay: 0.4s;\n border-color: rgba(118, 75, 162, .25);\n }\n &:nth-child(3) {\n animation-delay: 0.8s;\n border-color: rgba(143, 163, 255, .2);\n }\n }\n\n & > .sparkle {\n width: 5px;\n height: 5px;\n\n position: absolute;\n\n border-radius: 50%;\n\n animation: sparkle 2s ease-in-out infinite;\n\n &:nth-child(4) {\n top: 15%;\n left: 25%;\n\n animation-delay: 0s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .6);\n box-shadow: 0 0 8px rgba(143, 163, 255, .6);\n }\n &:nth-child(5) {\n top: 25%;\n left: 18%;\n\n animation-delay: 0.4s;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .6);\n box-shadow: 0 0 8px rgba(102, 126, 234, .6);\n }\n &:nth-child(6) {\n bottom: 20%;\n\t left: 30%;\n\n animation-delay: 0.8s;\n\n /* Theme dependent */\n background: rgba(118, 75, 162, .5);\n box-shadow: 0 0 8px rgba(118, 75, 162, .5);\n }\n &:nth-child(7) {\n bottom: 25%;\n right: 25%;\n\n animation-delay: 1.2s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .5);\n box-shadow: 0 0 8px rgba(143, 163, 255, .5);\n }\n }\n\n & > .shield-icon {\n width: 100px;\n\n position: absolute;\n z-index: 2;\n left: 50%;\n top: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: shield-float 3s ease-in-out infinite;\n\n /* Theme dependent */\n filter: drop-shadow(0 0 8px rgba(102, 126, 234, .3));\n\n & > img {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 2.2em;\n font-weight: 700;\n line-height: 1.2;\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n }\n\n & > .subtitle {\n margin: 0 0 24px 0;\n\n font-size: 0.95em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 0.8);\n }\n\n & > .about-links {\n display: flex;\n justify-content: center;\n gap: 12px;\n flex-wrap: wrap;\n\n margin: 24px 0;\n\n & > .about-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n padding: 8px 14px;\n\n border: 1px solid;\n border-radius: 8px;\n\n font-size: 0.85em;\n font-weight: 500;\n text-decoration: none;\n\n transition: background .2s ease,\n transform .2s ease,\n color .2s ease,\n border-color .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 0.9);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .2);\n }\n }\n }\n\n & > #rollback-needed {\n margin: 20px 0;\n padding: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(247, 76, 60, .3);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n\t\t inset 0 1px 0 rgba(255, 255, 255, .05);\n background: rgba(247, 76, 60, .08);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n display: none;\n }\n\n & p {\n margin: 6px 0;\n\n font-weight: 400;\n font-size: 0.9em;\n\n /* Theme dependent */\n color: rgba(247, 76, 60, 0.95);\n }\n & a {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n & > button {\n cursor: pointer;\n\n width: 100%;\n\n padding: 12px 24px;\n\n border: 2px solid transparent;\n border-radius: 10px;\n\n position: relative;\n\n font-size: 1em;\n font-weight: 700;\n color: rgba(143, 163, 255, 1);\n letter-spacing: 0.5px;\n\n overflow: hidden;\n\n opacity: 1;\n\n transition: all .25s ease;\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.8), rgba(118, 75, 162, 0.8)) border-box;\n box-shadow:\n 0 0 10px rgba(102, 126, 234, .6),\n 0 0 20px rgba(118, 75, 162, .3),\n inset 0 0 10px rgba(102, 126, 234, .1);\n\n &.hidden {\n display: none;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(160, 180, 255, 1);\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 75, 162, 1)) border-box;\n box-shadow:\n 0 0 15px rgba(102, 126, 234, .8),\n 0 0 30px rgba(118, 75, 162, .5),\n inset 0 0 15px rgba(102, 126, 234, .2);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.7), rgba(118, 75, 162, 0.7)) border-box;\n box-shadow:\n 0 0 8px rgba(102, 126, 234, .5),\n 0 0 16px rgba(118, 75, 162, .3),\n inset 0 0 8px rgba(102, 126, 234, .1);\n }\n\n &::before {\n content: \"\";\n\n width: 100%;\n height: 100%;\n\n position: absolute;\n left: -100%;\n top: 0;\n\n transition: left .4s ease;\n\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1),\n transparent\n );\n }\n\n & > i {\n margin-right: 6px;\n font-size: 14px;\n transition: transform 0.3s ease;\n }\n\n &:hover > i {\n transform: translateX(2px);\n }\n }\n }\n }\n\n & > #app {\n width: 100%;\n height: 100%;\n\n line-height: 1.5;\n color: var(--body-color);\n\n overflow: hidden;\n\n background: var(--body-background);\n\n &.hidden {\n display: none;\n }\n\n & > #container {\n display: flex;\n width: 100%;\n height: 100%;\n\n margin: 0;\n\n overflow: hidden;\n\n & > #queue {\n width: 15vw;\n height: 100%;\n\n position: relative;\n\n border-right: 1px solid;\n\n /* Theme dependent */\n border-right-color: rgba(58, 61, 74, 1);\n\n & > #queue-top {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 69px;\n\n position: relative;\n z-index: 2;\n\n border-bottom: 2px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 8px;\n\n padding: 10px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-button-cluster {\n display: flex;\n align-items: center;\n gap: 20px;\n\n padding: 10px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n font-size: 1.2em;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .fa {\n position: relative;\n }\n\n & > span {\n cursor: pointer;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > #DEFCON {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n padding: 4px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .dot {\n flex: 0 0 auto;\n\n width: 10px;\n height: 10px;\n\n border-radius: 50%;\n\n animation: pulse-DEFCON 2s ease-in-out infinite;\n\n /* Theme dependent */\n background: rgba(100, 100, 100, 1);\n box-shadow: 0 0 0 4px rgba(100, 100, 100, .15);\n\n &.DEFCON-1 {\n background: rgba(255, 75, 75, 1);\n box-shadow: 0 0 0 4px rgba(255, 75, 75, .3);\n }\n &.DEFCON-2 {\n background: rgba(255, 165, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 165, 0, .3);\n }\n &.DEFCON-3 {\n background: rgba(255, 255, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 255, 0, .3);\n }\n &.DEFCON-4 {\n background: rgba(75, 255, 75, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 75, .3);\n }\n &.DEFCON-5 {\n background: rgba(75, 255, 255, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 255, .3);\n }\n }\n\n & > span {\n overflow: auto hidden;\n\n white-space: nowrap;\n font-size: 13px;\n font-weight: 500;\n }\n }\n }\n\n & > #queue-tabs {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-around;\n gap: 8px;\n\n position: relative;\n z-index: 2;\n\n border-radius: 0 0 12px 12px;\n padding: 10px 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: transparent;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-tab {\n cursor: pointer;\n\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n\n position: relative;\n\n border-radius: 50%;\n padding: 8px 14px;\n\n font-size: 1.4em;\n\n transition: transform .18s ease,\n color .18s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .85);\n\n &::after {\n content: \"\";\n\n height: 3px;\n\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n\n border-radius: 2px;\n\n transform: scaleX(0);\n\n transition: transform .22s cubic-bezier(.2, .9, .27, 1);\n\n /* Theme dependent */\n opacity: .95;\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, 1),\n rgba(118, 75, 162, 1)\n );\n }\n\n &:hover, &:focus-visible {\n transform: translateY(-2px);\n }\n\n &:not(.selected).mentions-me::after {\n animation: scale-x 1s ease-in-out infinite;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(244, 196, 32, 1),\n rgba(255, 107, 107, 1)\n );\n }\n\n &.selected {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n &::after {\n transform: scaleX(1);\n }\n }\n\n &.hidden {\n display: none;\n }\n\n & > .fas {\n position: relative;\n }\n }\n }\n\n & > .queue-list {\n height: calc(100% - 60px);\n\n position: relative;\n top: -60px;\n\n padding-top: 60px;\n padding-bottom: 10px;\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n right: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > #clear-queue {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-container {\n display: flex;\n flex-wrap: wrap;\n width: calc(100% - 15vw);\n\n & > #right-content {\n display: flex;\n width: 100%;\n height: 100%;\n\n & > #main-container {\n display: flex;\n flex-direction: column;\n gap: 0px;\n width: calc(100% - 15vw);\n height: 100%;\n\n padding-top: 69px;\n\n position: relative;\n\n & > #edit-details {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 4px;\n\n width: calc(100% - 20vmin);\n height: 69px;\n\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-top: none;\n border-radius: 8px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease;\n\n /* Theme dependent */\n background: rgba(30, 34, 45, 1);\n border-color: rgba(143, 163, 255, .2);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n inset 0 1px 0px rgba(255, 255, 255, .05);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .central {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n flex: 1;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: 1em;\n\n & > .page-title {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(119, 166, 215, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n\n & > a {\n color: inherit;\n\n white-space: nowrap;\n text-overflow: ellipsis;\n\n overflow: hidden;\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > a {\n color: inherit;\n }\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: calc(1rem + 4px);\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n\n & > .subheader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: .9em;\n\n & > .item-comment {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n &.none {\n opacity: .6;\n }\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n white-space: nowrap;\n\n overflow: auto hidden;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: .85rem;\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .nav-item-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 41px;\n height: 41px;\n\n position: absolute;\n top: 14px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: 0;\n }\n\n &#previous-item-button {\n left: calc(5vmin - calc(41px / 2));\n }\n &#next-item-button {\n right: calc(5vmin - calc(41px / 2));\n }\n\n & > i {\n font-size: 16px;\n }\n }\n\n & > #ai-analysis-container {\n flex-shrink: 0;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 12px;\n margin-bottom: 0;\n padding: 10px;\n\n overflow: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .2);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n align-items: center;\n gap: 6px;\n\n margin-bottom: 8px;\n\n & > .fa {\n font-size: 1.1em;\n }\n\n & > .title {\n font-size: .95em;\n letter-spacing: .3px;\n }\n\n & > .assessment {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .8em;\n font-weight: 700;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.review {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.suspicious {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.bad {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n &.error {\n /* Theme dependent */\n background: rgba(158, 158, 158, .25);\n }\n }\n\n & > .confidence {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .75em;\n font-weight: 600;\n }\n }\n\n & > .explanation {\n border-left: 3px solid;\n\n border-radius: 4px;\n margin-bottom: 6px;\n padding: 6px 8px;\n\n font-size: .8em;\n line-height: 1.3;\n\n /* Theme dependent */\n border-left-color: rgba(143, 163, 255, .4);\n }\n\n & > .issues {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n & > .issue {\n border-radius: 6px;\n padding: 4px 10px;\n\n font-size: .75em;\n font-weight: 600;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.medium {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.high {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.critical {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n }\n }\n }\n\n & > .notice {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 8px;\n\n border-left: 4px solid;\n border-radius: 4px;\n\n margin: 10px;\n padding: 8px 12px;\n\n font-size: .9em;\n\n &.edit-war {\n /* Theme dependent */\n color: rgba(120, 27, 20, 1);\n border-left-color: rgba(247, 50, 20, 1);\n background: rgba(255, 205, 199, 1);\n }\n\n &.outdated {\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-left-color: rgba(255, 193, 7, 1);\n background: rgba(255, 243, 205, 1);\n\n &.pending {\n /* Theme dependent */\n color: rgba(12, 84, 96, 1);\n border-left-color: rgba(23, 162, 184, 1);\n background: rgba(209, 236, 241, 1);\n }\n }\n\n & > .text {\n flex: 1;\n }\n\n & > .button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .85em;\n font-weight: 600;\n white-space: nowrap;\n text-decoration: none;\n\n transition: color .2s ease,\n border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-color: rgba(255, 193, 7, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .1);\n\n background: rgba(255, 235, 159, .45);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > i {\n font-size: 14px;\n\n transition: transform .3s ease;\n }\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n color: rgba(80, 60, 0, 1);\n border-color: rgba(255, 193, 7, .6);\n box-shadow: 0 4px 16px rgba(255, 193, 7, .25);\n\n background: rgba(255, 235, 159, .65);\n\n & > i {\n transform: translateX(3px);\n\n &.restore {\n transform: rotateZ(180deg);\n }\n }\n }\n }\n }\n\n & > .diff-scroll-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n opacity: 1;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > i {\n font-size: 16px;\n }\n\n &#diff-scroll-up {\n top: 77px;\n }\n &#diff-scroll-down {\n bottom: 8px;\n }\n }\n\n & > #diff-container {\n flex: 1;\n\n padding: 12px;\n\n scroll-behavior: smooth;\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(20, 22, 28, .3),\n transparent\n );\n\n & > .loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n & > .loading-spinner {\n margin-bottom: 24px;\n\n font-size: 56px;\n\n animation: logo-loader 2s ease-in-out infinite;\n }\n\n & > .loading-text {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n text-align: center;\n font-weight: 500;\n letter-spacing: .3px;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 1);\n }\n }\n\n & > table {\n width: 100%;\n\n border: 1px solid;\n border-collapse: separate;\n border-spacing: 0;\n\n border-radius: 14px;\n margin-bottom: 24px;\n\n overflow: hidden;\n\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: .8em;\n line-height: 1.6;\n vertical-align: baseline;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .1),\n inset 0 -1px 0px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(143, 163, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(35, 40, 52, .5),\n rgba(30, 35, 48, .4)\n );\n -webkit-backdrop-filter: blur(16px) saturate(110%);\n backdrop-filter: blur(16px) saturate(110%);\n\n & > tbody {\n .mw-diff-movedpara-left, .mw-diff-movedpara-right {\n text-decoration: none;\n }\n\n & > tr {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease;\n\n &:hover {\n & > td {\n /* Theme dependent */\n background: rgba(143, 163, 255, .12);\n }\n }\n\n &:not(.diff-addedline, .diff-deletedline) {\n & > td {\n /* Theme dependent */\n background: rgba(255, 255, 255, .02);\n }\n }\n\n .flash-highlight {\n animation: flash-highlight 1s ease-out infinite;\n }\n\n & > td {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease,\n color .25s ease;\n\n &:not(.diff-marker) {\n width: 50%;\n\n padding: 10px 14px;\n\n transition: background .25s ease;\n\n /* Theme dependent */\n color: rgba(200, 210, 230, 1);\n }\n\n &.diff-lineno {\n -webkit-user-select: none;\n user-select: none;\n\n border-bottom: 1px solid;\n\n padding: 10px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-align: center;\n letter-spacing: .6px;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .12),\n rgba(158, 115, 212, .08)\n );\n }\n\n &.diff-marker {\n -webkit-user-select: none;\n user-select: none;\n\n width: 40px;\n\n border-right: 1px solid;\n\n padding: 10px 8px;\n\n font-weight: 700;\n text-align: center;\n\n /* Theme dependent */\n border-right-color: rgba(143, 163, 255, .15);\n\n color: rgba(160, 170, 200, .9);\n\n background: linear-gradient(90deg,\n rgba(40, 45, 60, .3),\n rgba(35, 40, 52, .2)\n );\n\n &::before {\n content: attr(data-marker);\n }\n }\n\n &.diff-empty {\n /* Theme dependent */\n background: rgba(20, 25, 35, .3);\n }\n\n &:is(.diff-addedline, .diff-deletedline) {\n position: relative;\n\n border-left: 4px solid;\n\n transition: background .25s ease,\n border-left-color .25s ease,\n box-shadow .25s ease;\n\n &.diff-addedline {\n /* Theme dependent */\n border-left-color: rgba(76, 175, 80, .9);\n\n background: rgba(76, 175, 80, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(129, 199, 132, 1);\n background: rgba(129, 199, 132, .18);\n box-shadow: inset 0 0 12px rgba(76, 175, 80, .15);\n }\n }\n &.diff-deletedline {\n /* Theme dependent */\n border-left-color: rgba(244, 67, 54, .9);\n\n background: rgba(244, 67, 54, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(255, 112, 97, 1);\n background: rgba(255, 112, 97, .18);\n box-shadow: inset 0 0 12px rgba(244, 67, 54, .15);\n }\n }\n }\n\n & > div {\n & > :is(ins, del) {\n border-radius: 6px;\n padding: 2px 6px;\n\n font-weight: 600;\n text-decoration: none;\n\n transition: background .25s ease,\n transform .15s ease;\n }\n\n & > ins {\n /* Theme dependent */\n background: rgba(130, 169, 26, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(139, 195, 74, .6);\n\n transform: scale(1.08);\n }\n }\n & > del {\n /* Theme dependent */\n background: rgba(244, 67, 54, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 112, 97, .6);\n\n transform: scale(1.08);\n }\n }\n }\n\n a {\n text-decoration: none;\n\n /* Theme dependent */\n color: rgba(107, 163, 216, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n text-decoration: underline;\n }\n }\n }\n }\n }\n }\n }\n\n & > #pending-changes-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n\n position: fixed;\n left: 50%;\n bottom: 63px;\n z-index: 2;\n\n transform: translateX(-50%);\n\n &.hidden {\n display: none;\n }\n\n & > :is(.accept, .reject) {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n\n border-radius: 10px 10px 0 0;\n padding: 8px 12px;\n\n font-size: .95em;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease,\n border-color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.accept {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .14);\n box-shadow: 0 10px 26px rgba(46, 125, 50, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(46, 125, 50, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(46, 125, 50, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n &.reject {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .14);\n box-shadow: 0 10px 26px rgba(155, 40, 34, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(155, 40, 34, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(155, 40, 34, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n }\n }\n\n & > #progress-bar-container {\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-direction: column;\n\n position: absolute;\n top: 0px;\n bottom: 56px;\n right: 0px;\n\n padding: 0;\n\n overflow: hidden;\n\n & > .progress-bar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 180px;\n height: 32px;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 16px;\n margin-bottom: 10px;\n margin-right: 10px;\n\n overflow: hidden;\n\n font-size: .85em;\n font-weight: 400;\n\n opacity: 1;\n\n transition: width .3s ease,\n opacity .3s ease,\n border-color .3s ease,\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .1),\n rgba(158, 115, 212, .1)\n );\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.error {\n /* Theme dependent */\n border-color: rgba(239, 68, 68, .8);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .1),\n rgba(220, 38, 38, .1)\n );\n\n & > .progress-bar-overlay {\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .6),\n rgba(220, 38, 38, .6)\n );\n }\n }\n\n & > .progress-bar-overlay {\n width: 0;\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 16px;\n\n transition: width .4s cubic-bezier(.4, 0, .2, 1),\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .6),\n rgba(158, 115, 212, .6)\n );\n }\n\n & > .progress-bar-text {\n max-width: 100%;\n\n position: relative;\n\n padding: 0 12px;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .2);\n\n color: rgba(255, 255, 255, 1);\n }\n }\n }\n\n & > #bottom-tools {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n\n max-width: calc(100% - 20vmin);\n width: fit-content;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 8px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-radius: 16px;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .bottom-tool-item {\n position: relative;\n\n white-space: nowrap;\n\n transition: opacity .2s ease;\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n\n & > .bottom-tool-trigger {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease;\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.active {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n\n & > .bottom-tool-chevron {\n transform: rotate(180deg);\n }\n }\n\n & > .bottom-tool-chevron {\n font-size: .75em;\n\n transition: transform .2s ease;\n }\n }\n }\n\n & > .bottom-tool-action {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n }\n }\n\n & > #copy-link {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-details {\n width: 15vw;\n\n position: relative;\n\n border-left: 1px solid;\n\n /* Theme dependent */\n border-left-color: rgba(54, 62, 81, 1);\n\n & > #right-top {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n align-content: center;\n justify-content: center;\n\n width: 100%;\n height: 69px;\n\n border-bottom: 2px solid;\n border-left: 1px solid;\n border-bottom-left-radius: 8px;\n\n padding: 8px 15px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .tabs {\n display: flex;\n justify-content: center;\n width: 100%;\n\n & > .tab {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 2px solid;\n\n padding: 10px;\n\n opacity: .75;\n\n transition: background .35s cubic-bezier(.4, 0, .2, 1),\n opacity .35s cubic-bezier(.4, 0, .2, 1),\n box-shadow .35s cubic-bezier(.4, 0, .2, 1),\n border-color .35s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n &:hover, &:focus-visible {\n opacity: 1;\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 75, 162, .25)\n );\n }\n\n &.hidden {\n display: none;\n }\n\n &:first-child {\n border-radius: 10px 0 0 10px;\n }\n &:last-child {\n border-radius: 0 10px 10px 0;\n }\n }\n }\n\n & > .icons {\n display: flex;\n justify-content: center;\n width: 100%;\n\n font-size: 1.4em;\n\n & > .hidden {\n display: none;\n }\n }\n }\n\n & > .section {\n display: flex;\n flex-direction: column;\n height: calc(50% - calc(69px / 2) - 15px);\n\n margin: 10px 10px 0 10px;\n\n border: 1px solid;\n border-radius: 16px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n background: rgba(30, 35, 45, .8);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n\n padding: 14px 14px 12px;\n\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n background: rgba(30, 35, 45, .8);\n\n & > .title {\n font-weight: 600;\n font-size: .85em;\n text-transform: uppercase;\n letter-spacing: .07em;\n white-space: nowrap;\n\n & > i {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n\n margin-right: 4px;\n\n font-size: .9em;\n\n transition: transform .5s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n transform: rotate(180deg);\n }\n }\n }\n\n & > .pills {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n\n & > .pill {\n border: 1px solid;\n border-radius: 10px;\n padding: 4px 8px;\n\n font-size: .75em;\n font-weight: 500;\n\n white-space: nowrap;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(224, 228, 240, 1);\n background: rgba(140, 132, 255, .1);\n\n &.uw-1 {\n /* Theme dependent */\n border-color: rgba(107, 163, 216, .8);\n background: rgba(107, 163, 216, .1);\n color: rgba(107, 163, 216, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .8);\n background: rgba(143, 163, 255, .15);\n color: rgba(143, 163, 255, 1);\n }\n }\n &.uw-2 {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .8);\n background: rgba(255, 193, 7, .1);\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n color: rgba(255, 193, 7, 1);\n }\n }\n &.uw-3 {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, .8);\n background: rgba(255, 87, 34, .1);\n color: rgba(255, 87, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n background: rgba(255, 87, 34, .15);\n color: rgba(255, 87, 34, 1);\n }\n }\n &.uw-4 {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .8);\n background: rgba(244, 67, 54, .1);\n color: rgba(244, 67, 54, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, 1);\n background: rgba(244, 67, 54, .15);\n color: rgba(244, 67, 54, 1);\n }\n }\n &.uw-4im {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, .8);\n background: rgba(178, 34, 34, .1);\n color: rgba(178, 34, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, 1);\n background: rgba(178, 34, 34, .15);\n color: rgba(178, 34, 34, 1);\n }\n }\n\n &.ub {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, .8);\n background: rgba(255, 99, 132, .1);\n color: rgba(255, 99, 132, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, 1);\n background: rgba(255, 99, 132, .15);\n color: rgba(255, 99, 132, 1);\n }\n }\n }\n }\n }\n\n & > .queue-list {\n flex: 1;\n height: 100%;\n\n padding: 4px;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .3);\n }\n\n & > .footer {\n cursor: pointer;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n\n padding: 10px 14px;\n\n border-top: 1px solid;\n\n font-size: .85em;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(30, 35, 45, .8);\n border-top-color: rgba(143, 163, 255, .2);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n & > i {\n transform: translateX(3px);\n }\n }\n\n & > i {\n transition: transform .2s ease;\n }\n }\n }\n\n &:has(#user-contributions.hidden) {\n & > #page-history {\n height: calc(100% - 89px);\n }\n }\n &:has(#page-history.hidden) {\n & > #user-contributions {\n height: calc(100% - 89px);\n }\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n left: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > .height-adjust {\n touch-action: none;\n cursor: row-resize;\n\n height: 10px;\n width: 100%;\n\n position: absolute;\n left: 0;\n top: calc(50% - 5px);\n z-index: 3;\n }\n }\n }\n }\n }\n\n & > .bottom-tool-menu {\n display: none;\n max-width: calc(100vw - 40px);\n min-width: 200px;\n\n position: absolute;\n left: 0;\n bottom: calc(100% + 8px);\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n overflow-y: visible;\n\n animation: bottom-tool-menu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n }\n\n & > .menu-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border-radius: 8px;\n padding: 10px 12px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.hidden {\n display: none;\n }\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n\n & > i:first-child {\n opacity: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n opacity: 1;\n }\n }\n\n & > i:first-child {\n width: 18px;\n\n font-size: 1.1em;\n text-align: center;\n\n opacity: .8;\n\n transition: opacity .2s ease;\n }\n\n & > span {\n flex: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n margin-left: auto;\n\n font-size: .85em;\n\n opacity: .5;\n\n transition: opacity .2s ease;\n }\n\n & > .submenu {\n cursor: default;\n\n display: none;\n min-width: 240px;\n\n position: absolute;\n left: calc(100% + 4px);\n top: -6px;\n z-index: 4;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n color: var(--body-color);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n }\n\n & > .bottom-subcontent-title {\n border-bottom: 1px solid;\n\n margin-bottom: 12px;\n padding-bottom: 8px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n }\n\n & > .bottom-subcontent-input-title {\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > :is(select, input[type=\"text\"]) {\n width: 100%;\n\n font-size: .9em;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n\n & > .bottom-subcontent-button {\n --background: 123, 143, 245;\n\n display: block;\n width: 100%;\n\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n font-weight: 600;\n }\n }\n }\n\n &:is(#revert-menu, #warn-menu) {\n max-height: calc(100vh - 120px);\n\n overflow: hidden auto;\n\n & > .warning-menu {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 280px;\n\n position: relative;\n\n border-radius: 12px;\n padding: 8px;\n\n & > .warning-menu-no-items {\n text-align: center;\n padding: 20px;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n }\n\n & > .favorites-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 4px;\n\n & > .favorites-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .9);\n\n & > .icon {\n font-size: 1.1em;\n }\n }\n\n & > .favorites-container {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n }\n\n & > .favorites-separator {\n height: 1px;\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n }\n\n & > .favorites-section:not(:has(.warning-menu-item)) {\n display: none;\n\n & ~ .favorites-separator {\n display: none;\n }\n }\n\n & > .menu-option {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n color: rgba(224, 228, 240, 1);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .12);\n\n & > .icon {\n opacity: 1;\n transform: scale(1.1);\n }\n\n & > .submenu-arrow {\n opacity: 1;\n transform: translateX(2px);\n }\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .15);\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n opacity: .85;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > span:not(.icon):not(.submenu-arrow) {\n flex: 1;\n\n font-weight: 500;\n }\n\n & > .submenu-arrow {\n flex-shrink: 0;\n\n font-size: .8em;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n }\n }\n }\n\n & > .warning-submenu {\n display: none;\n max-width: calc(100vw - 60px);\n min-width: 420px;\n max-height: calc(100vh - 120px);\n\n position: absolute;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n overflow-y: auto;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(30, 33, 42, .98);\n -webkit-backdrop-filter: blur(25px);\n backdrop-filter: blur(25px);\n\n &.show {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n }\n\n .warning-menu-item {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n background: rgba(102, 126, 234, .12);\n }\n\n &.favorite-item {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n\n &.dragging {\n opacity: 0.5;\n transform: scale(0.95);\n }\n }\n\n & > .favorite-star {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border-radius: 4px;\n\n font-size: 1.2em;\n line-height: 1;\n\n transition: transform .2s cubic-bezier(.4, 0, .2, 1),\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .4);\n\n &:hover {\n transform: scale(1.2);\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .8);\n }\n\n &.favorited {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 152, 0, 1);\n }\n }\n\n &.spin {\n animation: star-spin 0.5s cubic-bezier(.4, 0, .2, 1);\n }\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > .warning-menu-title {\n flex: 1;\n\n font-size: .92em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 228, 240, 1);\n }\n\n & > .fa-circle-question {\n flex-shrink: 0;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .6);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .warning-menu-buttons {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n\n margin-left: 8px;\n }\n\n & > .warning-menu-buttons > .warning-menu-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 7px 14px;\n\n font-size: .82em;\n font-weight: 500;\n text-transform: capitalize;\n\n transition: border-color .2s ease,\n background .2s ease,\n color .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, .95);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .22);\n }\n\n &:active {\n transform: translateY(0);\n }\n\n &.warning-menu-no-warn-button {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .2);\n color: rgba(255, 193, 7, .95);\n background: rgba(255, 152, 0, .1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .4);\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 152, 0, .22);\n }\n }\n }\n }\n\n & > .levels-menu {\n display: none;\n min-width: 0px;\n\n position: fixed;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(28, 30, 38, .98);\n -webkit-backdrop-filter: blur(24px);\n backdrop-filter: blur(24px);\n\n &.show {\n display: flex;\n gap: 6px;\n }\n\n & > .levels-menu-item {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .95em;\n font-weight: 600;\n text-align: center;\n white-space: nowrap;\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n background: rgba(255, 255, 255, .05);\n border: 1px solid rgba(255, 255, 255, .1);\n\n &:hover {\n transform: translateY(-2px);\n background: rgba(255, 255, 255, .08);\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n\n &:active {\n transform: translateY(0);\n }\n }\n }\n\n .queue-list {\n overflow: hidden auto;\n\n &:is(#user-contributions-content, #page-history-content) {\n & > .queue-item {\n margin: 4px 0;\n }\n }\n\n & > .queue-empty {\n text-align: center;\n padding: 40px 20px;\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n }\n\n & > .historical-bar {\n height: 4px;\n width: 100%;\n\n position: relative;\n\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n\n & > .label {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n font-size: 1em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n\n & > .queue-item {\n cursor: pointer;\n\n display: flex;\n\n position: relative;\n\n border: 1px solid;\n border-radius: .75rem;\n\n margin: 4px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .4);\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n &:hover, &:focus-within {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 12px oklch(0 0 0 / 0.3);\n\n background: rgba(40, 43, 52, .6);\n }\n\n &.current {\n /* Theme dependent */\n border-color: linear-gradient(90deg,\n rgba(40, 43, 52, .4),\n rgba(40, 43, 82, .6)\n );\n box-shadow: 0 0 0 1px rgba(60, 63, 122, 1) inset;\n\n background: rgba(40, 43, 82, .6);\n\n & > .item-body {\n & > .item-tags {\n & > .tag {\n /* Theme dependent */\n color: rgba(145, 145, 165, 1);\n background: rgba(60, 63, 122, .4);\n border-color: rgba(60, 63, 122, .6);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .4);\n border-color: rgba(255, 193, 7, .6);\n }\n }\n }\n }\n }\n\n &.mentions-me {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 1) inset;\n\n background: rgba(40, 43, 52, .6);\n }\n\n & > .item-color {\n --ores-color: rgba(128, 128, 128, 1);\n\n flex-shrink: 0;\n width: 4px;\n\n position: relative;\n\n opacity: .85;\n\n /* Theme dependent */\n background: var(--ores-color);\n }\n\n & > .item-body {\n --ores-color: rgba(128, 128, 128, 1);\n --diff-color: rgba(128, 128, 128, 1);\n\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: .5rem;\n\n min-width: 0;\n\n padding: .75rem 1rem;\n\n & > .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: .75rem;\n\n & > .page-title {\n display: flex;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n font-size: clamp(.825rem, .85rem + .35vw, .95rem);\n font-weight: 600;\n\n word-wrap: break-word;\n word-break: break-word;\n\n line-height: 1.35;\n\n /* Theme dependent */\n color: rgba(205, 204, 202, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n }\n\n & > .timestamp {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 4px;\n\n min-width: 3ex;\n\n padding-top: 1px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n width: 100%;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 500;\n\n hyphens: auto;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n }\n\n & > .chips {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-grow: 1;\n gap: 4px;\n\n & > .ores-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--ores-color);\n background: color-mix(in srgb, var(--ores-color) 15%, transparent);\n }\n\n & > .diff-chips {\n display: flex;\n align-items: center;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: var(--diff-color);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .item-comment {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n overflow: hidden;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n font-style: italic;\n white-space: nowrap;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .item-tags {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .5rem;\n\n & > .tag {\n display: flex;\n align-items: center;\n gap: 2px;\n\n padding: 1px .5rem;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .7rem;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(135, 135, 135, 1);\n background: rgba(45, 44, 51, 1);\n border-color: rgba(38, 37, 35, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border-color: rgba(255, 193, 7, .4);\n }\n }\n }\n }\n\n & > .remove-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n\n position: absolute;\n right: 0px;\n bottom: 0px;\n\n border-top-left-radius: 8px;\n\n line-height: 1;\n\n transition: color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n background: rgba(255, 255, 255, 0);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 70, 0, 1);\n background: rgba(255, 70, 0, .15);\n }\n }\n }\n }\n\n .tooltip {\n min-width: 0;\n max-height: 80vh;\n\n position: fixed;\n left: 0;\n top: 0;\n z-index: calc(var(--max-z-index) - 3);\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 4px 6px;\n\n overflow-wrap: break-word;\n overflow: hidden auto;\n\n font-size: .95em;\n line-height: 1.45;\n word-wrap: break-word;\n white-space: normal;\n\n animation: tooltip-enter .1s ease-out forwards;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n box-shadow: 0 10px 30px rgba(6, 12, 24, .6),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n color: rgba(234, 240, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .03),\n rgba(255, 255, 255, .01)\n );\n -webkit-backdrop-filter: blur(14px) brightness(.7);\n backdrop-filter: blur(14px) brightness(.7);\n\n &:not(.buttons) {\n pointer-events: none;\n\n max-width: 460px;\n }\n\n &.buttons {\n display: flex;\n flex-direction: row;\n gap: 8px;\n\n z-index: calc(var(--max-z-index) - 2);\n\n white-space: nowrap;\n\n & > .button {\n cursor: pointer;\n\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 4px 8px;\n\n font-size: .95em;\n font-weight: 500;\n letter-spacing: .3px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .05);\n\n color: rgba(240, 245, 255, .92);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .08),\n rgba(255, 255, 255, .02)\n );\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .14),\n rgba(255, 255, 255, .06)\n );\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 1px 4px rgba(0, 0, 0, .3),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .tooltip-title {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-bottom: 1px solid;\n\n border-radius: 6px;\n margin-bottom: 12px;\n padding: 8px 10px;\n\n font-size: 1.04em;\n font-weight: 700;\n letter-spacing: .25px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .05);\n\n color: rgba(255, 255, 255, .92);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(0, 0, 0, .04)\n );\n -webkit-backdrop-filter: blur(6px);\n backdrop-filter: blur(6px);\n }\n\n & > .tooltip-item {\n display: flex;\n flex-direction: column;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 10px;\n margin: 10px 0;\n padding: 10px 12px;\n\n overflow: hidden;\n overflow-wrap: anywhere;\n\n word-wrap: break-word;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .075),\n rgba(0, 0, 0, .25)\n );\n\n &:is(.user-warnings, .user-blocks) {\n & > .tooltip-item-level {\n display: block;\n width: 100%;\n\n border-bottom: 1px solid;\n\n border-radius: 6px 6px 0 0;\n padding: 6px 10px;\n\n font-size: .95em;\n font-weight: 700;\n letter-spacing: .3px;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 120, .25);\n\n color: rgba(255, 255, 120, .95);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 120 .22),\n rgba(255, 255, 120, .08)\n );\n }\n\n & > .tooltip-item-details {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n\n & > :is(.tooltip-item-user, .tooltip-item-time) {\n font-size: .82em;\n font-weight: 400;\n\n opacity: .8;\n\n &.tooltip-item-user {\n /* Theme dependent */\n color: rgba(150, 210, 255, .9);\n }\n &.tooltip-item-time {\n /* Theme dependent */\n color: rgba(220, 225, 235, .9);\n\n & > span:not(:first-of-type) {\n margin-left: 1ex;\n }\n }\n }\n }\n }\n\n & > .tooltip-more {\n border-top: 1px solid;\n\n border-radius: 8px;\n margin-top: 14px;\n padding-top: 10px;\n\n font-size: .92em;\n font-style: italic;\n text-align: center;\n\n opacity: .95;\n\n /* Theme dependent */\n border-top-color: rgba(255, 255, 255, .04);\n\n color: rgba(240, 240, 255, .75);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .015),\n rgba(0, 0, 0, .03)\n );\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n }\n }\n }\n\n .confirmation-modal-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 6);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease-out;\n\n &.closing {\n animation: fade-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal {\n max-width: 500px;\n min-width: 400px;\n\n border: 1px solid;\n\n border-radius: 16px;\n\n word-wrap: break-word;\n\n animation: scale-in .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .7),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: rgba(41, 47, 60, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.closing {\n animation: scale-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal-header {\n border-bottom: 1px solid;\n\n padding: 20px 24px;\n\n /* Theme dependent */\n border-bottom-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-title {\n font-size: 1.2em;\n font-weight: 700;\n }\n }\n\n & > .confirmation-modal-body {\n max-height: 70vh;\n\n padding: 24px;\n\n line-height: 1.5;\n\n overflow: hidden auto;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n\n & > .confirmation-modal-username {\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(91, 154, 255, 1);\n }\n\n & > .confirmation-modal-input {\n width: 100%;\n\n border: 1px solid;\n border-radius: 4px;\n\n margin-top: 10px;\n padding: 8px;\n\n /* Theme dependent */\n color: white;\n border-color: rgba(255, 255, 255, .2);\n background: rgba(0, 0, 0, .3);\n }\n }\n\n & > .confirmation-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n\n border-top: 1px solid;\n\n padding: 16px 24px;\n\n /* Theme dependent */\n border-top-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-footer-right {\n display: flex;\n gap: 12px;\n }\n\n &.confirmation-modal-footer-vertical {\n flex-direction: column;\n align-items: stretch;\n\n & > .confirmation-modal-button {\n width: 100%;\n }\n }\n }\n\n .confirmation-modal-button {\n font-size: .95em;\n font-weight: 500;\n }\n }\n }\n\n .notification-panel {\n pointer-events: none;\n\n display: flex;\n flex-direction: column;\n width: 480px;\n max-height: 600px;\n\n position: absolute;\n left: 15px;\n top: 55px;\n z-index: calc(var(--max-z-index) - 9);\n\n border: 1px solid;\n border-radius: 18px;\n\n overflow: hidden;\n\n opacity: 0;\n\n transform: translateY(-20px) scale(.95);\n\n transition: opacity .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 20px 60px rgba(0, 0, 0, .8),\n 0 0 0 1px rgba(255, 255, 255, .08),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n\n background: rgba(25, 27, 36, .96);\n -webkit-backdrop-filter: blur(25px) brightness(0.95);\n backdrop-filter: blur(25px) brightness(0.95);\n\n a {\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(160, 195, 255, 1);\n }\n\n &:visited {\n /* Theme dependent */\n color: rgba(150, 185, 255, 1);\n }\n }\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n\n & > .notification-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border-bottom: 1px solid;\n\n padding: 18px 22px;\n\n font-size: 1.12em;\n font-weight: 700;\n letter-spacing: 0.3px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .08);\n\n color: rgba(245, 245, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(120, 145, 255, .12),\n rgba(140, 100, 200, .08)\n );\n\n & > .mark-all-read {\n cursor: pointer;\n\n font-size: 0.78em;\n font-weight: 500;\n letter-spacing: 0.2px;\n\n padding: 6px 12px;\n border-radius: 6px;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n background: rgba(120, 170, 255, .08);\n\n &:hover {\n /* Theme dependent */\n background: rgba(120, 170, 255, .15);\n color: rgba(160, 200, 255, 1);\n }\n\n &:active {\n opacity: .85;\n }\n }\n }\n\n & > .notification-list {\n max-height: 520px;\n\n overflow: hidden auto;\n\n padding: 8px;\n\n & > .notifications-empty {\n padding: 40px 20px;\n\n text-align: center;\n\n font-size: 0.95em;\n\n /* Theme dependent */\n color: rgba(120, 125, 145, 1);\n\n & strong {\n /* Theme dependent */\n color: rgba(150, 155, 175, 1);\n }\n }\n\n & > .notification {\n cursor: pointer;\n\n display: flex;\n align-items: flex-start;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 18px;\n margin-bottom: 8px;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(50, 55, 75, .4),\n rgba(40, 45, 65, .3)\n );\n\n &:hover {\n opacity: 1;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .3);\n box-shadow: 0 8px 24px rgba(120, 170, 255, .15),\n inset 0 1px 0 rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(80, 100, 160, .15),\n rgba(70, 85, 145, .1)\n );\n\n transform: translateY(-2px);\n }\n\n &.unread {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .5);\n box-shadow: 0 0 20px rgba(120, 170, 255, .2),\n inset 0 1px 0 rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(120, 170, 255, .1),\n rgba(100, 145, 255, .05)\n );\n }\n\n &.read {\n opacity: .72;\n\n border-color: rgba(255, 255, 255, .04);\n }\n\n & > .notification-icon {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n\n border-radius: 10px;\n\n overflow: hidden;\n\n background: rgba(60, 75, 120, .5);\n\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n & > .notification-content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 5px;\n\n & > .notification-header {\n margin: 0;\n\n font-size: .95rem;\n font-weight: 600;\n letter-spacing: 0.2px;\n\n /* Theme dependent */\n color: rgba(235, 240, 255, 1);\n }\n\n & > .notification-body {\n font-size: .82rem;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 180, 205, 1);\n }\n\n & > .notification-links {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n\n margin-top: 6px;\n\n & > a {\n border: none;\n\n padding: 4px 8px;\n border-radius: 5px;\n\n font-size: .8rem;\n font-weight: 500;\n text-decoration: none;\n\n background: rgba(120, 170, 255, .12);\n opacity: 1;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n color: rgba(140, 185, 255, 1);\n\n &:hover {\n opacity: 1;\n\n background: rgba(120, 170, 255, .22);\n\n /* Theme dependent */\n color: rgba(180, 210, 255, 1);\n }\n\n &:active {\n opacity: .85;\n\n transform: scale(0.98);\n }\n }\n }\n }\n\n & > .notification-right {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n gap: 10px;\n\n & > .notification-unread-indicator {\n cursor: pointer;\n\n width: 12px;\n height: 12px;\n\n border-radius: 50%;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n background: rgba(120, 170, 255, 1);\n box-shadow: 0 0 8px rgba(120, 170, 255, .5);\n\n &:hover, &:focus {\n transform: scale(1.35);\n\n /* Theme dependent */\n box-shadow: 0 0 16px rgba(120, 170, 255, .8);\n }\n }\n\n & > .notification-timestamp {\n font-size: .72rem;\n font-weight: 500;\n\n opacity: .8;\n\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(140, 150, 175, 1);\n }\n }\n }\n }\n }\n\n .icon-count {\n --color: 255, 255, 255;\n --background: 255, 255, 255;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n\n position: absolute;\n right: -11px;\n top: -11px;\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 50%;\n padding: 0 8px;\n\n font-family: sans-serif;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n\n transition: transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(var(--background), .3);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(var(--background), .15);\n\n color: rgba(--color, 1);\n text-shadow: 0 1px 0 rgba(0, 0, 0, .35);\n\n background: linear-gradient(135deg,\n rgba(var(--background), .7),\n rgba(var(--background), .5)\n );\n -webkit-backdrop-filter: blur(6px) brightness(0%);\n backdrop-filter: blur(6px) brightness(0%);\n\n &.red {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 255, 60, 60;\n }\n &.green {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 205, 80;\n }\n &.blue {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 120, 255;\n }\n &.yellow {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 215, 60;\n }\n &.orange {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 165, 60;\n }\n &:is(.gray, .grey) {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 150, 150, 150;\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n transform: scale(0);\n }\n }\n\n .toast-alert {\n display: flex;\n align-items: center;\n gap: 14px;\n max-width: 500px;\n min-width: 320px;\n\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: calc(var(--max-z-index) - 4);\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 20px;\n\n opacity: 0;\n\n transform: translateX(100%) scale(.8);\n\n animation: toast-alert-enter .5s cubic-bezier(.68, -.55, .265, 1.55);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 12px 40px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(25px) saturate(180%);\n backdrop-filter: blur(25px) saturate(180%);\n\n &.success {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(76, 175, 80, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .25)\n );\n }\n &.warning {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(255, 152, 0, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 152, 0, .25),\n rgba(245, 124, 0, .25)\n );\n }\n &.error {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(244, 67, 54, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .25)\n );\n }\n &.dev {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(156, 39, 176, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(156, 39, 176, .25),\n rgba(123, 31, 162, .25)\n );\n }\n\n &.show {\n opacity: 1;\n\n transform: translateX(0) scale(1);\n }\n\n &.hidden {\n animation: toast-alert-leave .4s cubic-bezier(.6, -.28, .735, .045) forwards;\n }\n\n & > .toast-icon {\n flex-shrink: 0;\n\n font-size: 1.8em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .3));\n }\n\n & > .toast-content {\n flex: 1;\n\n & > .toast-title {\n margin-bottom: 4px;\n\n font-size: 1.05em;\n font-weight: 700;\n letter-spacing: .3px;\n }\n\n & > .toast-message {\n font-size: .9em;\n line-height: 1.4;\n\n opacity: .95;\n }\n }\n\n & > .toast-close {\n cursor: pointer;\n\n flex-shrink: 0;\n\n border-radius: 6px;\n padding: 4px;\n\n font-size: 1.3em;\n\n background: transparent;\n opacity: .8;\n\n transition: opacity .2s ease,\n transform .2s ease,\n background .2s ease;\n\n &:hover {\n opacity: 1;\n\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n }\n }\n\n .minor-indicator {\n border: 1px solid;\n\n border-radius: 4px;\n margin-right: 4px;\n padding: 0 4px;\n\n font-size: .9em;\n font-weight: 700;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(153, 153, 153, 1);\n\n background: rgba(60, 64, 76, .9);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n .menu-divider {\n height: 1px;\n\n margin: 6px 8px;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n\n .profanity {\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n margin: 20px;\n padding: 20px;\n\n border-radius: 12px;\n border: 1px solid;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .8);\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .3);\n\n & > .profanity-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n\n padding-bottom: 16px;\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n\n & > .profanity-score {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n & > .score-label {\n font-size: .85em;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n }\n\n & > .score-value {\n font-size: 2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(255, 200, 100, 1);\n }\n }\n\n & > .profanity-risk {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 16px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n background: rgba(60, 64, 76, .6);\n\n &.risk-high {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n background: rgba(211, 47, 47, .2);\n border: 1px solid rgba(211, 47, 47, .4);\n }\n\n &.risk-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border: 1px solid rgba(255, 193, 7, .3);\n }\n\n &.risk-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n background: rgba(66, 165, 245, .15);\n border: 1px solid rgba(66, 165, 245, .3);\n }\n }\n }\n\n & > .profanity-matches-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .profanity-matches-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n & > .profanity-match {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n border-radius: 8px;\n padding: 12px 14px;\n border-left: 3px solid;\n\n transition: background .2s ease,\n border-color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n background: rgba(45, 50, 62, .7);\n border-left-color: rgba(255, 150, 150, .5);\n\n &:hover {\n transform: translateX(4px);\n\n /* Theme dependent */\n background: rgba(50, 56, 70, .85);\n border-left-color: rgba(255, 150, 150, .8);\n }\n\n & > .match-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: .95em;\n\n & > .match-text {\n font-family: 'Courier New', monospace;\n font-weight: 600;\n\n border-radius: 4px;\n padding: 4px 8px;\n\n /* Theme dependent */\n color: rgba(255, 180, 180, 1);\n background: rgba(211, 47, 47, .2);\n }\n\n & > .match-arrow {\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .match-name {\n font-family: 'Courier New', monospace;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n }\n\n & > .match-details {\n display: flex;\n gap: 16px;\n\n & > .match-stat {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n & > .stat-label {\n font-size: .75em;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .stat-value {\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n &.severity-critical {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n }\n &.severity-high {\n /* Theme dependent */\n color: rgba(255, 150, 100, 1);\n }\n\n &.severity-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n &.severity-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n }\n }\n }\n }\n\n & > .match-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n margin-top: 6px;\n padding: 10px 12px;\n border-radius: 6px;\n\n font-size: .85em;\n line-height: 1.5;\n\n /* Theme dependent */\n background: rgba(30, 33, 43, .6);\n border: 1px solid rgba(100, 150, 255, .2);\n\n & > .fa {\n margin-top: 2px;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(100, 150, 255, .8);\n }\n\n & > .note-text {\n flex: 1;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n }\n }\n }\n\n & > .profanity-no-matches {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n padding: 20px;\n\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(100, 200, 100, 1);\n }\n }\n\n & > #settings-container {\n z-index: calc(var(--max-z-index) - 7);\n\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n\n opacity: 0;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n\n & > .settings {\n transform: scale(1);\n }\n }\n\n & > .settings {\n display: flex;\n max-width: 1100px;\n width: 90vw;\n\n border: 1px solid;\n\n border-radius: 20px;\n\n overflow: hidden;\n\n transform: scale(.75);\n\n transition: transform .1s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(30, 33, 42, .95);\n -webkit-backdrop-filter: blur(30px);\n backdrop-filter: blur(30px);\n\n & > div {\n height: 80vh;\n\n &.settings-left {\n width: 250px;\n\n border-right: 1px solid;\n\n padding: 20px 0;\n\n overflow-y: auto;\n\n /* Theme dependent */\n border-right-color: rgba(255, 255, 255, .1);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(255, 255, 255, .05)\n );\n\n & > .settings-category {\n &:not(:last-child) {\n margin-bottom: 20px;\n }\n\n & > .settings-category-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n margin-bottom: 4px;\n padding: 12px 20px;\n\n font-size: .7em;\n font-weight: 800;\n letter-spacing: 1.5px;\n text-transform: uppercase;\n }\n\n & > .settings-left-menu-compact {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n padding: 0 12px;\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 10px;\n padding: 12px;\n\n font-size: 1.2em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:first-child {\n margin-left: 12px;\n }\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n }\n }\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n border-radius: 10px;\n margin: 2px 12px;\n padding: 12px 20px;\n\n font-size: .95em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n & > span > i {\n height: 1em;\n aspect-ratio: 1 / 1;\n\n margin-right: 12px;\n\n text-align: center;\n }\n }\n }\n }\n\n &.settings-right {\n flex: 1;\n\n padding: 20px 30px;\n\n overflow-y: auto;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .5);\n\n & > .hidden {\n display: none;\n }\n\n a {\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n color: rgba(176, 192, 255, 1);\n }\n }\n\n pre, code {\n border-radius: 4px;\n padding: 2px 4px;\n\n font-size: .95em;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n\n .settings-compact-grid {\n & > .compact {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n & > .numeric-input-container {\n & > .numeric-input {\n width: calc(100% - 70px);\n }\n }\n\n & > select {\n width: 100%;\n }\n }\n }\n\n .settings-section, .settings-toggles-section {\n display: block;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 25px;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n\n background: rgba(35, 38, 48, .8);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n .settings-section-title {\n margin-bottom: 5px;\n\n font-size: 1em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n &.collapse-title {\n margin-bottom: 0;\n }\n }\n\n .settings-section-desc {\n margin-bottom: 0;\n\n font-size: .85em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .pad-list {\n margin: 8px 0;\n padding-left: 20px;\n }\n\n &:not(:last-child) {\n margin-bottom: 30px;\n }\n\n &.compact {\n margin-bottom: 0;\n padding: 18px;\n\n & > .settings-section-title {\n font-size: 1.05em;\n\n &.collapse-title {\n margin-bottom: 15px;\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 12px;\n\n font-size: .85em;\n }\n }\n\n &.inline {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .6);\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .settings-section-content {\n flex: 1;\n }\n }\n\n &.collapsed {\n & > .collapse-title::after {\n transform: rotate(-180deg);\n }\n }\n\n & > .collapse-title {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n &::after{\n content: \"\\f077\";\n\n float: right;\n\n font-family: \"Font Awesome 6 Free\";\n font-weight: 900;\n\n transition: transform .2s ease;\n }\n }\n\n & > .collapsible-content {\n padding: initial;\n\n overflow: hidden;\n\n transition: padding .2s ease;\n\n &.collapsed {\n padding: 0;\n }\n }\n\n & > .settings-section-title {\n margin-bottom: 15px;\n\n font-size: 1.4em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 8px;\n }\n }\n\n & > .settings-section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n\n margin-bottom: 15px;\n\n font-size: 1.2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 0;\n }\n\n & > .settings-section-header-icon {\n font-size: 1.3em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .2));\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 20px;\n\n font-size: .95em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .checkbox-container {\n display: flex;\n flex-wrap: wrap;\n\n & > div {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 200px;\n\n margin-bottom: 8px;\n\n &:hover {\n & > .checkbox-box {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .checkbox-box {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: block;\n\n position: relative;\n\n border-radius: 5px;\n\n font-size: .95em;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(213, 213, 213, 1);\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n position: absolute;\n width: 0;\n height: 0;\n\n border-radius: 5px;\n\n opacity: 0;\n\n &:checked ~ .checkmark {\n /* Theme dependent */\n background: linear-gradient(45deg,\n rgba(100, 61, 219, 1),\n rgba(217, 21, 239, 1)\n );\n\n &::after {\n opacity: 1;\n }\n }\n }\n\n & > .checkmark {\n width: 1.3em;\n height: 1.3em;\n\n position: relative;\n left: 0;\n top: 0;\n\n border-radius: 5px;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(204, 204, 204, 1);\n\n &::after {\n content: \"\";\n\n width: .25em;\n height: .5em;\n\n position: absolute;\n left: .45em;\n top: .25em;\n\n border-width: 0 .15em .15em 0;\n border-style: solid;\n\n opacity: 0;\n\n transform: rotate(45deg);\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, 1);\n }\n }\n }\n }\n }\n\n .numeric-input-container {\n display: flex;\n\n & > .numeric-input-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n width: 35px;\n height: 35px;\n\n border: 1px solid;\n\n border-radius: 8px;\n\n font-size: 1.3em;\n\n transition: background .2s ease,\n border-color .2s ease,\n color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .8);\n\n &:hover {\n transform: scale(1.05);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n }\n\n & > .numeric-input {\n width: 100px;\n\n border-radius: 8px;\n margin: 0 5px;\n padding: 6px 12px;\n\n font-size: 1.1em;\n }\n }\n\n .volume-control {\n display: block;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 20px 0;\n padding: 20px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .volume-control-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n\n margin-bottom: 16px;\n\n & > .volume-control-info {\n flex: 1;\n\n & > .volume-control-title {\n margin-bottom: 6px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .volume-control-desc {\n font-size: .9em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .volume-control-preview {\n --background: 123, 143, 245;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 18px;\n\n font-size: .9em;\n font-weight: 500;\n }\n }\n\n & > .volume-control-slider-container {\n display: flex;\n align-items: center;\n gap: 16px;\n\n & > .volume-control-slider {\n flex: 1;\n height: 6px;\n\n outline: none;\n\n border-radius: 3px;\n\n -webkit-appearance: none;\n appearance: none;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n\n &::-webkit-slider-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n\n &::-moz-range-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border: none;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n }\n\n & > .volume-control-input {\n width: 70px;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-size: .95em;\n text-align: center;\n }\n }\n }\n\n .settings-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 60px;\n height: 32px;\n\n position: relative;\n\n &:hover {\n & > .toggle-switch {\n transform: scale(1.02);\n }\n }\n\n &.active {\n & > .toggle-switch {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n & > .toggle-slider {\n left: 30px;\n\n /* Theme dependent */\n box-shadow: 0 4px 10px rgba(0, 0, 0, .3),\n 0 2px 4px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .toggle-switch {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n border: 2px solid;\n\n border-radius: 16px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n\n & > .toggle-slider {\n width: 24px;\n height: 24px;\n\n position: absolute;\n left: 2px;\n top: 2px;\n\n border-radius: 50%;\n\n transition: left .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n 0 1px 2px rgba(0, 0, 0, .15);\n\n background: rgba(255, 255, 255, 1);\n }\n }\n }\n\n .settings-radio-group {\n display: flex;\n flex-direction: row;\n gap: 12px;\n\n border-radius: 100vh;\n padding: 8px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-radio-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n flex: 1;\n\n text-align: center;\n\n border-radius: 100vh;\n padding: 10px 16px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 1);\n }\n\n &.selected {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n color: rgba(224, 224, 224, 1);\n }\n }\n }\n\n .settings-slider {\n display: flex;\n flex-direction: column;\n gap: 14px;\n\n border-radius: 14px;\n padding: 16px 20px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-slider-labels {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n & > .settings-slider-labels > .settings-slider-label-left,\n & > .settings-slider-labels > .settings-slider-label-right {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &.active {\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .percent {\n font-size: .85em;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n }\n\n & > .settings-slider-labels > .settings-slider-label-right {\n text-align: right;\n }\n\n & > .settings-slider-track {\n cursor: pointer;\n\n height: 8px;\n\n position: relative;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n &::before {\n content: '';\n\n width: var(--fill, 50%);\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .6),\n rgba(118, 75, 162, .6)\n );\n }\n\n & > .settings-slider-thumb {\n cursor: grab;\n\n width: 22px;\n height: 22px;\n\n position: absolute;\n top: 50%;\n\n border: 2px solid;\n\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n transition: transform .15s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .4),\n 0 0 12px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: translate(-50%, -50%) scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 12px rgba(0, 0, 0, .5),\n 0 0 20px rgba(102, 126, 234, .5);\n }\n\n &:active, &.dragging {\n cursor: grabbing;\n\n transform: translate(-50%, -50%) scale(1.2);\n\n /* Theme dependent */\n box-shadow: 0 4px 16px rgba(0, 0, 0, .5),\n 0 0 24px rgba(102, 126, 234, .6);\n }\n }\n }\n }\n\n .palette-selector {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n\n margin-top: 20px;\n\n & > .palette-option {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 12px;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 20px rgba(20, 20, 30, .4);\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4);\n }\n\n & > .palette-name {\n pointer-events: none;\n\n font-size: .9em;\n font-weight: 600;\n text-align: center;\n }\n\n & > .palette-preview {\n pointer-events: none;\n\n display: flex;\n gap: 4px;\n height: 40px;\n\n border-radius: 8px;\n margin-bottom: 12px;\n\n overflow: hidden;\n\n & > canvas {\n flex: 1;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .tracklist {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n\n & > .track {\n position: relative;\n\n border-radius: 8px;\n\n overflow: hidden;\n\n & > .thumbnail {\n display: block;\n width: 100%;\n aspect-ratio: 1 / 1;\n\n overflow: hidden;\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n\n overflow: hidden;\n }\n }\n\n & > .info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n\n padding: 10px 12px;\n\n /* Theme dependent */\n background: linear-gradient(180deg,\n rgba(0, 0, 0, 0),\n rgba(0, 0, 0, .35),\n rgba(0, 0, 0, .65)\n );\n\n & > .title {\n font-size: .95em;\n font-weight: 600;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n\n color: rgba(255, 255, 255, 1);\n }\n\n & > :is(.artist, .length) {\n font-size: .8em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n }\n }\n\n & > .preview-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0;\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n top: 8px;\n\n border-radius: 50%;\n padding: 0;\n }\n }\n }\n\n .control-container {\n border: 1px solid;\n\n border-radius: 12px;\n margin-bottom: 15px;\n padding: 18px 22px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .control-container-title {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.margin-top {\n margin-top: 10px;\n }\n }\n\n & > .control-keys {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n & > div {\n display: flex;\n align-items: center;\n width: max-content;\n\n border: 1px solid;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-weight: 500;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .3);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .9);\n\n &:not(.key-select):hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(60, 64, 78, .95);\n }\n\n &.key-select {\n border: 2px dashed;\n\n font-style: italic;\n\n /* Theme dependent */\n border-color: rgba(192, 192, 192, .6);\n box-shadow: 0 0 10px rgba(192, 192, 192, .4);\n\n background: rgba(192, 192, 192, .1);\n }\n\n &.duplicate {\n border: 2px dashed;\n\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n box-shadow: 0 0 10px rgba(255, 87, 34, .5);\n\n background: rgba(255, 87, 34, .1);\n }\n\n & > .key-elem-title {\n margin-right: 10px;\n }\n\n &.add, & > .remove {\n cursor: pointer;\n }\n }\n }\n\n & > .control-actions {\n .control-action {\n border-left: 2px solid;\n\n margin-top: 12px;\n padding-left: 16px;\n\n /* Theme dependent */\n border-left-color: rgba(102, 126, 234, .5);\n\n & > .control-action-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n margin-bottom: 8px;\n\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n span {\n margin-right: 5px;\n }\n\n & > .control-action-title-left {\n white-space: nowrap;\n\n overflow-x: auto;\n\n & > span {\n width: 17px;\n }\n\n & > select {\n border-radius: 6px;\n margin: 0 5px;\n padding: 6px 10px;\n }\n\n & > .params {\n font-size: .85em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n & > .condition-parameter {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n margin: 0 4px;\n\n & > select,\n & > input:not([type=checkbox]) {\n border-radius: 6px;\n padding: 6px 10px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n }\n }\n }\n\n & > .control-action-title-right {\n display: flex;\n\n & > span {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display:flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n\n border-radius: 5px;\n margin-right: 0;\n\n font-size: 1.2em;\n\n transition: background .1s ease;\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n }\n }\n }\n\n & > .action-parameter {\n border: 1px solid;\n\n border-radius: 8px;\n margin-top: 10px;\n padding: 12px 14px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .3);\n\n & > .parameter-title {\n margin-bottom: 8px;\n\n font-size: .9em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n\n & > select,\n & > input:not([type=checkbox]),\n & > duration-input {\n width: 100%;\n\n border-radius: 6px;\n padding: 8px 12px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 20px;\n height: 20px;\n }\n }\n }\n\n & > .control-bottom-container {\n display: flex;\n justify-content: space-between;\n\n margin-top: 10px;\n\n & > div {\n display: flex;\n\n & > .add-action-button {\n width: max-content;\n\n border-radius: 8px;\n padding: 8px 16px;\n\n font-weight: 500;\n }\n }\n }\n }\n }\n\n .text-input-container {\n display: flex;\n gap: 12px;\n\n border-style: 2px dashed;\n\n border-radius: 12px;\n margin-top: 18px;\n padding: 16px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .35);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 0.15),\n rgba(118, 75, 162, 0.15)\n );\n\n & > input[type=\"text\"] {\n flex: 1;\n\n border-style: dashed;\n\n border-radius: 10px;\n padding: 10px 16px;\n\n font-size: .95em;\n\n &:focus {\n border-style: solid;\n }\n }\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n\n margin-top: 20px;\n\n & > .stat-card {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n width: 100%;\n height: 150px;\n\n background-color: transparent;\n\n perspective: 1000px;\n\n transition: transform .3s ease;\n\n &:hover, &:active {\n transform: scale(1.05);\n\n & > .inside {\n transform: rotateY(180deg);\n\n &::before {\n opacity: 1;\n }\n }\n }\n\n & > .inside {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n transform-style: preserve-3d;\n\n transition: transform 0.8s linear(\n 0, 0.005, 0.02 2.2%, 0.046 4.5%, 0.182 11.5%,\n 0.318 16.3%, 0.459 20.6%, 0.601 24.6%, 0.738 28.6%,\n 0.863 32.7%, 0.954 37%, 1.015 41.8%, 1.049 47.4%,\n 1.059, 1.047 57.3%, 1.03 63.5%, 1.012 70.9%,\n 1.002 79.5%, 1\n );\n\n &::before {\n inset: -2px;\n\n border-radius: 14px;\n padding: 2px;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n }\n\n & > :is(.front, .back) {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n position: absolute;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n text-align: center;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .25);\n\n &.front {\n justify-content: center;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .15),\n rgba(118, 75, 162, .15)\n );\n }\n &.back {\n transform: rotateY(180deg);\n\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(118, 75, 162, .15),\n rgba(102, 126, 234, .15)\n );\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 4px;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .4);\n }\n &::-webkit-scrollbar-track {\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n }\n\n & > .stat-value {\n margin-bottom: 8px;\n\n font-size: 2.2em;\n font-weight: 700;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n /* Theme independent */\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .stat-label {\n margin-bottom: 4px;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .stat-sublabel {\n font-size: .8em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n &:not(:last-child) {\n margin-bottom: 8px;\n }\n }\n }\n }\n }\n }\n\n .changelog-content {\n & > .changelog-header {\n border-bottom: 2px solid;\n\n padding-bottom: 24px;\n margin-bottom: 8px;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n & > h1 {\n margin: 0 0 10px 0;\n\n font-size: 2.5em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n\n & > i {\n margin-right: 12px;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > .changelog-subtitle {\n margin: 0 0 20px 0;\n\n font-size: 1.1em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .9);\n }\n\n & > .changelog-nav {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n gap: 8px;\n\n & > .changelog-nav-item {\n cursor: pointer;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 6px 16px;\n\n font-size: .85em;\n font-weight: 600;\n text-decoration: none;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(200, 200, 200, .9);\n background: rgba(102, 126, 234, .08);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n color: rgba(255, 255, 255, 1);\n background: rgba(102, 126, 234, .2);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .3),\n rgba(118, 168, 255, .3)\n );\n box-shadow: 0 0 12px rgba(102, 126, 234, .3);\n }\n }\n }\n }\n\n & > .changelog-divider {\n height: 2px;\n\n margin: 48px auto 8px;\n\n border-radius: 1px;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(102, 126, 234, .4) 20%,\n rgba(118, 168, 255, .4) 50%,\n rgba(102, 126, 234, .4) 80%,\n transparent\n );\n }\n\n & > .changelog-version {\n margin-top: 32px;\n padding: 24px;\n\n border: 1px solid;\n border-radius: 16px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(30, 33, 42, .4);\n\n & > .changelog-version-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n\n border-bottom: 1px solid;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n & > .version-badge-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n margin-bottom: 12px;\n\n & > .version-badge {\n display: inline-block;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 4px 16px;\n\n font-size: .8em;\n font-weight: 700;\n font-family: 'Courier New', monospace;\n letter-spacing: .5px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(118, 168, 255, 1);\n background: rgba(102, 126, 234, .12);\n }\n\n & > .version-tag {\n display: inline-block;\n\n border-radius: 20px;\n padding: 4px 12px;\n\n font-size: .7em;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 1px;\n\n &.latest {\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .4);\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 1.6em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .changelog-version-subtitle {\n margin: 0;\n\n font-size: .9em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .7);\n\n & > i {\n margin-right: 4px;\n }\n }\n }\n\n & > .changelog-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: 24px;\n\n margin: 0 auto;\n padding: 0;\n\n & > .card {\n position: relative;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n overflow: hidden;\n\n transition: border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n background: rgba(40, 43, 52, .6);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &::before {\n content: '';\n\n height: 3px;\n\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n }\n\n &:hover {\n transform: translateY(-4px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5),\n 0 0 0 1px rgba(102, 126, 234, .2);\n\n background: rgba(40, 43, 52, .85);\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n transform: scale(1.1) rotate(5deg);\n }\n }\n\n &.featured {\n grid-column: 1 / -1;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: linear-gradient(135deg,\n rgba(40, 43, 52, .8),\n rgba(50, 53, 62, .8)\n );\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 168, 255, .25)\n );\n }\n }\n\n & > .card-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n\n border-radius: 12px;\n margin-bottom: 16px;\n\n transition: transform .3s ease;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n\n & > i {\n font-size: 24px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 168, 255, 1)\n );\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > h2 {\n margin: 0 0 12px 0;\n\n font-size: 1.35em;\n font-weight: 700;\n letter-spacing: -0.02em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .95);\n }\n\n & > p {\n margin: 0 0 16px 0;\n\n font-size: .95em;\n line-height: 1.6em;\n\n /* Theme dependent */\n color: rgba(118, 168, 255, .9);\n }\n\n & > ul {\n margin: 0;\n padding-left: 24px;\n\n font-size: .9em;\n line-height: 1.7em;\n\n /* Theme dependent */\n color: rgba(229, 229, 229, .9);\n\n & > li {\n margin-bottom: 8px;\n padding-left: 4px;\n\n &::marker {\n /* Theme dependent */\n color: rgba(102, 126, 234, .8);\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n & > strong {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n }\n\n & > code {\n border-radius: 4px;\n padding: 2px 6px;\n\n font-family: 'Courier New', monospace;\n font-size: .9em;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n color: rgba(118, 168, 255, 1);\n }\n\n & > ul {\n margin-top: 6px;\n padding-left: 20px;\n\n & > li {\n font-size: .95em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .85);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .about-content {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 0;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .25);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(30, 33, 42, .95),\n rgba(25, 28, 36, .9)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & > .about-version {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n\n padding: 32px;\n\n font-size: 1.3em;\n font-weight: 700;\n letter-spacing: .5px;\n\n /* Theme dependent */\n box-shadow: 0 4px 20px rgba(143, 163, 255, .25),\n inset 0 1px 0 rgba(255, 255, 255, .15),\n inset 0 -1px 0 rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .25),\n rgba(118, 75, 162, .2)\n );\n\n & > .fa {\n font-size: 1.5em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n filter: drop-shadow(0 2px 8px rgba(143, 163, 255, .6));\n }\n }\n\n & > .about-tagline {\n padding: 24px 32px;\n\n text-align: center;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 255, .08);\n\n & > p {\n margin: 0;\n\n font-size: 1.05em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(180, 185, 200, 1);\n }\n }\n\n & > .about-links {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n padding: 16px;\n\n & > .link-card {\n display: flex;\n align-items: center;\n gap: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n margin-bottom: 12px;\n padding: 16px 20px;\n\n text-decoration: none;\n\n transition:\n border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease,\n border-left-color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n border-left: 3px solid rgba(143, 163, 255, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .6) 40%\n );\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &:hover {\n transform: translateX(6px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .5);\n border-left-color: rgba(143, 163, 255, .8);\n box-shadow: 0 6px 24px rgba(143, 163, 255, .2),\n 0 2px 12px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .15),\n rgba(118, 75, 162, .08) 50%\n );\n\n & > .link-card-icon {\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .25);\n }\n\n & > .link-card-arrow {\n transform: translateX(4px);\n\n opacity: 1;\n }\n }\n\n & > .link-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n\n border-radius: 10px;\n\n font-size: 1.3em;\n\n transition:\n transform .3s ease,\n background .3s ease;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .15);\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .link-card-content {\n flex: 1;\n text-align: left;\n\n & > .link-card-title {\n margin-bottom: 4px;\n\n font-size: 1em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .link-card-desc {\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n & > .link-card-arrow {\n font-size: 1.2em;\n\n opacity: .5;\n\n transition:\n transform .3s ease,\n opacity .3s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .about-footer {\n padding: 0;\n\n & > .footer-divider {\n height: 1px;\n\n margin: 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(143, 163, 255, .3) 20%,\n rgba(143, 163, 255, .3) 80%,\n transparent\n );\n }\n\n & > .about-credits {\n padding: 24px;\n\n & > div {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(max(280px, calc(50% - 6px)), 1fr));\n gap: 12px;\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .credit-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n border-radius: 14px;\n padding: 14px 16px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n border-top: 2px solid rgba(143, 163, 255, .18);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .4) 30%\n );\n\n &:hover {\n transform: translateY(-3px) scale(1.01);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n border-top-color: rgba(143, 163, 255, .5);\n box-shadow: 0 6px 20px rgba(143, 163, 255, .18),\n 0 2px 8px rgba(0, 0, 0, .25);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .1),\n rgba(40, 43, 52, .6) 40%\n );\n }\n\n & > .credit-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n\n border-radius: 50%;\n\n font-size: 1.1em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .15)\n );\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .credit-info {\n flex: 1;\n min-width: 0;\n text-align: left;\n\n & > .credit-name {\n position: relative;\n overflow: hidden;\n\n margin-bottom: 2px;\n\n font-size: .95em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n & > span {\n display: inline-block;\n white-space: nowrap;\n }\n }\n\n & > .credit-role {\n font-size: .8em;\n line-height: 1.4;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n &:hover {\n & > .credit-info {\n & > .credit-name > span {\n animation: scroll-text 3s linear infinite;\n }\n }\n }\n }\n\n & > .copyright-card {\n cursor: pointer;\n\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n text-align: center;\n overflow: hidden;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: rgba(35, 38, 46, .3);\n\n & > .copyright-title {\n margin-bottom: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > .copyright-desc {\n font-size: .75em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(140, 140, 140, 1);\n }\n }\n }\n }\n }\n }\n\n &#ollama-server-url {\n & > .connection-status-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n &:has(#settings-ollama-connection-status:empty) {\n display: none;\n }\n\n &.testing {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.connected {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .7);\n box-shadow: 0 2px 8px rgba(76, 175, 80, .4);\n\n background: rgba(76, 175, 80, .1);\n }\n &.failed {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > #settings-connection-status {\n font-size: .9em;\n }\n }\n }\n\n &#ollama-model-select {\n .models-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n text-align: center;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n &.searching {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .7);\n box-shadow: 0 2px 8px rgba(143, 163, 255, .4);\n\n background: rgba(143, 163, 255, .1);\n }\n &.none {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.error {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > p {\n font-size: .9em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n & > #settings-ollama-models {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 8px;\n\n &:not(:empty) {\n margin-top: 8px;\n }\n\n & > .model {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 12px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(50, 54, 66, .9);\n }\n\n &.selected {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 0 15px rgba(143, 163, 255, .5);\n\n background: rgba(143, 163, 255, .1);\n\n & > .model-top {\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .model-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n\n & > .fa {\n /* Theme dependent */\n color: rgba(128, 128, 128, .5);\n }\n\n & > .model-name {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .pseudo-indicator {\n pointer-events: none;\n\n opacity: 0;\n }\n }\n\n & > .model-bottom {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n }\n }\n }\n\n &#ollama-setup {\n & > .settings-section-title {\n /* Theme dependent */\n color: rgba(255, 54, 34, 1);\n }\n & > .settings-section-desc {\n border-left: 4px solid;\n\n border-radius: 6px;\n padding: 10px;\n\n /* Theme dependent */\n border-left-color: rgba(255, 193, 7, 1);\n\n background: rgba(255, 193, 7, .125);\n\n color: rgba(225, 225, 225, 1);\n }\n }\n\n &.save {\n & > .save-settings-header {\n margin-bottom: 16px;\n }\n\n & > .save-settings-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .save-settings-card {\n border: 1px solid;\n border-radius: 12px;\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .5);\n box-shadow: 0 2px 12px rgba(0, 0, 0, .2);\n\n transition: border-color .3s ease, box-shadow .3s ease;\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n }\n\n & > .card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(50, 54, 66, .6),\n rgba(40, 43, 52, .6)\n );\n border-bottom: 1px solid rgba(255, 255, 255, .06);\n\n & > .card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 10px;\n\n font-size: 1.25em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(143, 163, 255, .15);\n }\n\n & > .card-header-content {\n flex: 1;\n\n & > .card-title {\n font-size: 1.1em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(232, 232, 232, 1);\n }\n\n & > .card-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n }\n }\n\n & > .card-toggle {\n flex-shrink: 0;\n }\n }\n\n & > .card-body {\n padding: 12px;\n\n & > .action-buttons-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n\n & > .action-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(46, 52, 66, .6);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .25);\n background: rgba(56, 62, 76, .7);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n }\n\n & > .action-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 8px;\n\n font-size: 1.15em;\n flex-shrink: 0;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n\n & > .action-card-content {\n flex: 1;\n\n & > .action-card-title {\n font-size: .95em;\n font-weight: 600;\n margin-bottom: 1px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .action-card-desc {\n font-size: .85em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n &.export-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .2),\n rgba(56, 142, 60, .2)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.import-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .5);\n background: rgba(76, 175, 80, .1);\n\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .3),\n rgba(56, 142, 60, .3)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n }\n\n &.reset-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .2),\n rgba(183, 28, 28, .2)\n );\n color: rgba(211, 47, 47, 1);\n }\n }\n }\n }\n\n & > .status-message {\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n animation: scale-in .3s ease;\n\n &.hidden {\n display: none;\n }\n\n & > .status-content {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n & > .status-icon {\n font-size: 1.25em;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n & > .status-text {\n flex: 1;\n\n & > .status-title {\n font-size: .95em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(240, 240, 240, 1);\n }\n\n & > .status-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(210, 210, 210, 1);\n }\n }\n }\n\n &.success {\n /* Theme dependent */\n border: 1px solid rgba(76, 175, 80, .4);\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .15),\n rgba(56, 142, 60, .1)\n );\n box-shadow: 0 4px 16px rgba(76, 175, 80, .2);\n\n & > .status-content > .status-icon {\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.error {\n /* Theme dependent */\n border: 1px solid rgba(211, 47, 47, .4);\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .15),\n rgba(183, 28, 28, .1)\n );\n box-shadow: 0 4px 16px rgba(211, 47, 47, .2);\n\n & > .status-content > .status-icon {\n color: rgba(211, 47, 47, 1);\n }\n }\n\n &.info {\n /* Theme dependent */\n border: 1px solid rgba(255, 193, 7, .4);\n background: linear-gradient(135deg,\n rgba(255, 193, 7, .15),\n rgba(255, 152, 0, .1)\n );\n box-shadow: 0 4px 16px rgba(255, 193, 7, .2);\n\n & > .status-content > .status-icon {\n color: rgba(255, 193, 7, 1);\n }\n }\n }\n\n & > .import-textarea {\n width: 100%;\n min-height: 140px;\n\n border: 2px solid;\n\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n font-family: 'Courier New', Consolas, monospace;\n font-size: .88em;\n line-height: 1.6;\n\n resize: vertical;\n\n animation: scale-in .3s ease;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n background: rgba(20, 23, 32, .8);\n color: rgba(220, 220, 220, 1);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3);\n\n &:focus {\n outline: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .6);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3),\n 0 0 0 3px rgba(143, 163, 255, .15);\n }\n\n &.hidden {\n display: none;\n }\n\n &::placeholder {\n /* Theme dependent */\n color: rgba(130, 130, 130, 1);\n }\n }\n }\n }\n }\n }\n\n .list-container {\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border: 1px solid;\n\n border-radius: 8px;\n margin-bottom: 8px;\n padding: 8px;\n padding-left: 15px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n &.empty {\n padding: 20px;\n\n text-align: center;\n\n opacity: .6;\n }\n\n & > div {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n a > {\n font-weight: 600;\n word-break: break-all;\n }\n\n & > span {\n font-size: .85em;\n\n opacity: .7;\n }\n\n & > .add-action-button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n\n border-radius: 6px;\n\n font-size: 1em;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n\n &.remove-button {\n /* Theme dependent */\n background: rgba(211, 47, 47, .1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(211, 47, 47, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(211, 47, 47, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n }\n }\n }\n }\n }\n\n .settings-compact-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 18px;\n\n margin-bottom: 25px;\n }\n\n .draggable-order-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n\n &.is-dragging .draggable-order-item {\n pointer-events: none;\n\n &:hover {\n transform: none;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: none;\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n opacity: .5;\n\n color: inherit;\n }\n }\n }\n\n & > .draggable-order-item-wrapper {\n position: relative;\n\n transition: transform .2s cubic-bezier(0.2, 0, 0, 1);\n\n &.dragging {\n z-index: 4;\n\n &::after {\n content: '';\n\n width: 100%;\n height: 100%;\n\n border: 2px dashed;\n\n border-radius: 10px;\n\n position: absolute;\n top: 0;\n left: 0;\n\n pointer-events: none;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4),\n inset 0 0 20px rgba(102, 126, 234, .15);\n\n background: rgba(102, 126, 234, .1);\n }\n\n & > .draggable-order-item {\n visibility: hidden;\n }\n }\n }\n\n .draggable-order-item {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 10px;\n padding: 14px 18px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n content: '\\f0c9';\n\n font-family: 'Font Awesome 6 Free';\n font-size: .9em;\n font-weight: 900;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n color .2s ease;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 6px 24px rgba(0, 0, 0, .4);\n\n background: rgba(50, 54, 66, .9);\n\n &::before {\n opacity: .8;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n &:active {\n cursor: grabbing;\n\n transform: scale(1.02);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n box-shadow: 0 8px 32px rgba(102, 126, 234, .3);\n\n background: rgba(60, 65, 80, .95);\n }\n\n &.disabled {\n opacity: .5;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .05);\n\n background: rgba(30, 32, 38, .6);\n\n & > .draggable-order-item-name {\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .draggable-order-item-toggle {\n /* Theme dependent */\n background: rgba(80, 80, 80, .5);\n\n &::before {\n transform: translateX(0);\n\n /* Theme dependent */\n background: rgba(120, 120, 120, 1);\n }\n }\n\n &:hover {\n opacity: .7;\n\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n }\n }\n\n & > .draggable-order-item-name {\n flex: 1;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(230, 230, 230, 1);\n }\n\n & > .draggable-order-item-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 44px;\n height: 24px;\n\n border-radius: 100vh;\n\n position: relative;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 75, 162, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .3);\n\n &::before {\n content: '';\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n position: absolute;\n top: 3px;\n left: 3px;\n\n transform: translateX(20px);\n\n transition: transform .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, .2);\n }\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5);\n }\n }\n }\n }\n }\n }\n }\n }\n\n select, input:not([type=range]), textarea, button {\n border: 1px solid transparent;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-family: inherit;\n font-size: inherit;\n color: var(--color, inherit);\n\n transition: border .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 8px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .3), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .9);\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .4), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), 1);\n }\n &:not(input, textarea):active {\n /* Theme dependent */\n box-shadow: 0 1px 4px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .2), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .95);\n }\n\n &[type=number] {\n -moz-appearance: textfield;\n appearance: textfield;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n appearance: none;\n\n margin: 0;\n }\n }\n }\n\n button {\n cursor: pointer !important;\n\n &:hover {\n transform: translateY(-2px);\n }\n &:active {\n transform: translateY(0);\n }\n }\n\n duration-input {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n font-family: inherit;\n font-size: .9em;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n background: rgba(40, 43, 52, .7);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n background: rgba(40, 43, 52, .85);\n }\n\n & > .infinity-label {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 10px 14px;\n\n font-weight: 500;\n font-size: .95em;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(220, 220, 220, 1);\n background: rgba(35, 38, 48, .6);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2);\n\n &::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n\n position: absolute;\n top: 50%;\n right: 12px;\n\n font-size: 13px;\n line-height: 1;\n\n opacity: 0;\n transform: translateY(-50%) scale(0);\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n & > span {\n flex: 1;\n letter-spacing: .3px;\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(45, 48, 58, .8);\n box-shadow: 0 3px 10px rgba(0, 0, 0, .3);\n }\n\n &.selected {\n border-color: rgba(102, 126, 234, .5);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .2) 0%,\n rgba(118, 75, 162, .2) 100%\n );\n box-shadow: 0 3px 12px rgba(102, 126, 234, .25),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n &::after {\n opacity: 1;\n transform: translateY(-50%) scale(1);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .6);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25) 0%,\n rgba(118, 75, 162, .25) 100%\n );\n box-shadow: 0 4px 16px rgba(102, 126, 234, .35),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n }\n }\n }\n\n & > .duration-inputs {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n\n opacity: 1;\n transform: scale(1);\n\n transition: opacity .2s ease,\n transform .2s cubic-bezier(.4, 0, .2, 1);\n\n & > label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n\n & > span {\n font-size: .75em;\n font-weight: 600;\n letter-spacing: .5px;\n text-align: center;\n text-transform: uppercase;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .85);\n }\n\n & > input {\n cursor: text;\n\n width: 100%;\n\n border: 1px solid;\n border-radius: 6px;\n padding: 8px 10px;\n\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: .95em;\n font-weight: 500;\n text-align: center;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(230, 230, 230, 1);\n background: rgba(30, 33, 42, .9);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n\n &::placeholder {\n color: rgba(150, 154, 170, .6);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(35, 38, 48, 1);\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &:focus {\n outline: none;\n border-color: rgba(102, 126, 234, .6);\n background: rgba(40, 43, 52, 1);\n box-shadow: 0 0 0 2px rgba(102, 126, 234, .2),\n 0 2px 10px rgba(102, 126, 234, .15),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n }\n }\n\n &:has(.infinity-label.selected) > .duration-inputs {\n opacity: .4;\n transform: scale(.98);\n pointer-events: none;\n }\n }\n\n #reset-statistics-button {\n float: right;\n\n font-size: 1rem;\n\n /* Theme dependent */\n --background: 211, 51, 51;\n }\n\n #settings-ollama-refresh-models {\n float: right;\n\n font-size: 1rem;\n }\n }\n\n .ws-username-highlight {\n position: relative;\n\n &::before {\n content: \"\";\n\n pointer-events: none;\n\n position: absolute;\n inset: 0;\n\n border-radius: 10px;\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n }\n }\n}"},4192(e,t){function n(){return crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}Object.defineProperty(t,"__esModule",{value:!0}),t.generateRandomUUID=function(){return 0===s.length?n():s.pop()};const s=[];"function"==typeof requestIdleCallback&&requestIdleCallback(function e(){s.length<256&&s.push(n()),requestIdleCallback(e)})},4041(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.CreateDOMElement=function(e,t={}){const n=document.createElement(e);"id"in t&&(n.id=t.id);"class"in t&&(n.className=t.class);"text"in t&&(n.textContent=t.text);"html"in t&&(n.innerHTML=t.html);"content"in t&&n.append(t.content);"value"in t&&(n.value=t.value);if("attributes"in t)for(const[e,s]of Object.entries(t.attributes||{}))n.setAttribute(e,s);if("dataset"in t)for(const[e,s]of Object.entries(t.dataset||{}))n.dataset[e]=s;if("style"in t)for(const[e,s]of Object.entries(t.style||{}))n.style.setProperty(e,s);return n}},5643(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.fullTrim=void 0;t.fullTrim=e=>{const t=e.split("\n"),n=t.length;let s=!0,i=1/0,a=[],r=[];for(let e=0;e<n;e++){const n=t[e];if(""===n.trim()){if(s)continue;a.push("")}else{s?s=!1:(r=r.concat(a),a=[]);const e=n.match(/^(\s*)/)[0].length;i=Math.min(i,e),r.push(n)}}const o=r.length;if(0===o)return"";const l=[];for(let e=0;e<o;e++){const t=r[e].trimEnd();""===t?l.push(""):l.push(t.slice(i))}return l.join("\n")}},2852(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Memory=void 0;t.Memory=class{constructor(e={}){this.order=[],this.store=new Map,this.timeouts=new Map,"timeout"in e&&(this.timeout=e.timeout),"size"in e&&(this.maxSize=e.size)}clear(){this.order=[],this.store.clear(),this.timeouts.clear()}has(e){return this.store.has(e)}get(e){return this.store.get(e)}set(e,t){const n=this.order.indexOf(e);-1!==n&&this.order.splice(n,1),this.order.push(e),this.store.set(e,t),this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e)),void 0!==this.timeout&&this.timeouts.set(e,setTimeout(()=>{this.delete(e)},this.timeout)),void 0!==this.maxSize&&this.store.size>this.maxSize&&this.delete(this.order.shift())}add(e){this.store.has(e)||this.set(e,!0)}delete(e){const t=this.order.indexOf(e);-1!==t&&this.order.splice(t,1),this.store.delete(e),clearTimeout(this.timeouts.get(e)),this.timeouts.delete(e)}size(){return this.store.size}}},2595(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Stack=void 0;t.Stack=class{constructor(e=50){this.items=[],this.maxSize=e}push(e){this.items.push(e),this.items.length>this.maxSize&&this.items.shift()}pop(){return this.items.pop()}unshift(e){this.items.unshift(e),this.items.length>this.maxSize&&this.items.pop()}shift(){return this.items.shift()}peek(){return this.items[this.items.length-1]}clear(){this.items=[]}get length(){return this.items.length}set length(e){this.items.length=Math.min(e,this.maxSize)}}},6873(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Trie=void 0;var s=n(4192);function i(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function a(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var r=new WeakSet;function o(e){var t;this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e)),this.timeouts.delete(e);const n=this.order[e];delete this.order[e];const s=[{children:this.store}];let i=this.store;for(const e of n){const t=i.get(e);s.push(t),i=t.children}const a=s.pop();if(a.defined=!1,delete a.value,!((null===(t=a.children)||void 0===t?void 0:t.size)>0))for(let e=s.length-1;e>=0;e--){const t=s[e],i=n.pop();if(t.children.delete(i),t.children.size>0||t.defined)break;t.terminal=!0,delete t.children}}t.Trie=class{constructor(e={}){i(this,r),this.order={},this.store=new Map,this.timeouts=new Map,"timeout"in e&&(this.timeout=e.timeout),"size"in e&&(this.maxSize=e.size)}clear(){this.order={},this.store.clear(),this.timeouts.clear()}has(...e){var t;const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return!1;const e=s.get(t);if(e.terminal)return!1;s=e.children}return!0===(null===(t=s.get(n))||void 0===t?void 0:t.defined)}get(...e){var t;const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.value}set(...e){var t;const n=e.pop();let i=((e,t)=>{const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.UUID})(e);delete this.order[i],void 0===i&&(i=(0,s.generateRandomUUID)());const l=e.pop();let d=this.store;for(const t of e)if(d.has(t)){var c;const e=d.get(t);e.terminal=!1,null!==(c=e.children)&&void 0!==c||(e.children=new Map),d=e.children}else{const e={defined:!1,terminal:!1,children:new Map};d.set(t,e),d=e.children}const u=null!==(t=d.get(l))&&void 0!==t?t:{terminal:!0};u.UUID=i,u.defined=!0,u.value=n,d.set(l,u),this.order[i]=e.concat([l]),this.timeouts.has(i)&&clearTimeout(this.timeouts.get(i)),void 0!==this.timeout&&this.timeouts.set(i,setTimeout(()=>{a(r,this,o).call(this,i)},this.timeout)),void 0!==this.maxSize&&Object.keys(this.order).length>this.maxSize&&a(r,this,o).call(this,this.order.shift())}add(e){this.store.has(e)||this.set(e,!0)}delete(...e){const t=((e,t)=>{const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.UUID})(e);void 0!==t&&a(r,this,o).call(this,t)}size(){return Object.keys(this.order).length}}},4551(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.truncate=function(e,t){return e.length>t?`${e.substring(0,t-3).trimEnd()}...`:e}},1289(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.convertToUTCString=void 0;t.convertToUTCString=e=>`${e.getUTCFullYear().toString().padStart(4,"0")}-${(e.getUTCMonth()+1).toString().padStart(2,"0")}-${e.getUTCDate().toString().padStart(2,"0")}T${e.getUTCHours().toString().padStart(2,"0")}:${e.getUTCMinutes().toString().padStart(2,"0")}:${e.getUTCSeconds().toString().padStart(2,"0")}`},8678(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Ollama=t.AI=void 0;var s=n(4018),i=n(5643);function a(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o=new WeakSet;class l{static registerProvider(e,t){l.providers[e]=t}setup(e,t){if(this.analysis[e].has(t.id)){const n=this.analysis[e].get(t.id);return n.count++,n.request}const n=new AbortController,s=this.fetch(e,t,n.signal);return this.analysis[e].set(t.id,{request:s,abortController:n,count:1}),s.finally(()=>{this.analysis[e].delete(t.id)}),s}async fetch(e,t,n){return{error:"No service has been selected"}}constructor(e,t){a(this,o),r(this,"analysis",{edit:new Map,username:new Map}),r(this,"cache",{username:new Set}),r(this,"analyze",{edit:e=>this.setup("edit",e),username:e=>this.cache.username.has(e.user.name)?Promise.resolve({flag:!1,confidence:1,issues:[],explanation:"Username previously analyzed."}):(this.cache.username.add(e.user.name),this.setup("username",e))}),r(this,"cancel",{all:(e=!0)=>{if(!0===e)for(const e of Object.keys(this.analysis))for(const n of null===(t=this.analysis[e])||void 0===t?void 0:t.keys()){var t;this.cancel[e](n)}else for(const t of null===(n=this.analysis[e])||void 0===n?void 0:n.keys()){var n;this.cancel[e](t)}},edit:e=>{const t=this.analysis.edit.get(e);t&&(t.count--,t.count<=0&&(t.abortController.abort("Edit analysis canceled by user"),this.analysis.edit.delete(e)))},username:e=>{const t=this.analysis.username.get(e);t&&(t.count--,t.count<=0&&(t.abortController.abort("Username analysis canceled by user"),this.analysis.username.delete(e)))}}),r(this,"prompt",{edit:async e=>{var t,n;const a=function(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}(o,this,d).call(this,e.diff),r=null!==(t=s.namespaces.find(t=>t.id===e.ns))&&void 0!==t?t:s.namespaces[0];let l="registered";e.user.temp?l="temporary (unregistered)":e.user.ip&&(l="IP (unregistered)");const c=e.page.categories.join(", ")||"(none)",u=e.page.categories.some(e=>/living people/i.test(e));return(0,i.fullTrim)(`\nYou are an automated Wikipedia item reviewer. Analyze the following item and determine whether the CHANGES INTRODUCED violate Wikipedia policy.\n\nCRITICAL: You are evaluating what this item CHANGED, not the page content before it. The diff shows removed lines (prefixed "-") and added lines (prefixed "+"). Only ADDED content can be a new violation. Removing bad content is a GOOD item. Adding references, citations, and sources is GOOD — it improves verifiability, not the opposite.\n\nitem CONTEXT:\n- Page: "${e.page.title}" (${r.name} namespace)\n- Categories: ${c}${u?"\n- ⚠ BLP: This page is about a living person. Unsourced negative claims are a serious concern.":""}\n- User: "${e.user.name}" (${l}, warning level: ${e.user.warning}/4)\n- ORES vandalism probability: ${(100*e.ores).toFixed(0)}%\n- Size change: ${e.sizediff>0?"+":""}${e.sizediff} bytes\n- Flagged minor: ${e.minor?"yes":"no"}\n- Summary: ${e.comment||"(empty)"}\n- Tags: ${(null===(n=e.tags)||void 0===n?void 0:n.join(", "))||"(none)"}\n\nWHAT TO CHECK:\n1. VANDALISM: Does the item add nonsense, profanity as attacks, hoaxes, blanking, or deliberate misinformation? (WP:VANDALISM)\n2. NPOV: Does the item add clearly biased or one-sided language that is not presented neutrally? (WP:NPOV)\n3. VERIFIABILITY: Does the item add claims that are extraordinary or contentious WITHOUT any sourcing? Note: adding "<ref>" tags, URLs, or citation templates is adding sources — this is the OPPOSITE of a verifiability problem. (WP:V)\n4. ORIGINAL RESEARCH: Does the item add novel analysis, synthesis, or unpublished interpretation not attributable to any source? Simply adding text IS NOT original research if it restates commonly known facts or is sourced. Adding citations is NEVER original research. (WP:NOR)\n5. BLP: If this is a BLP article, does the item add unsourced or poorly-sourced negative material about the subject? (WP:BLP)\n\nWHAT IS NOT A VIOLATION:\n- Adding references, citations, "<ref>" tags, or URLs (this IMPROVES the article)\n- Removing vandalism or bad content\n- Fixing grammar, spelling, formatting, or wikilinks\n- Content about controversial topics written in a neutral, encyclopedic tone\n- Wikipedia is NOT censored — explicit content on appropriate pages is allowed (WP:NOTCENSORED)\n- Absent or auto-generated item summaries (e.g. "/* Section name */") are normal, not violations\n- ORES scores and warning levels are hints — do NOT treat them as evidence by themselves\n\nASSESSMENT SCALE:\n- "Good": No policy issues. Normal constructive item.\n- "Review": Minor concerns; a human should glance at it.\n- "Suspicious": Likely problematic; warrants close scrutiny.\n- "Bad": Clear policy violation.\n\nWhen in doubt between two ratings, choose the LESS severe one. Most items on Wikipedia are constructive — reflect that in your assessments.\n\nFor issues, use short policy codes (e.g. "WP:VANDALISM", "WP:NPOV", "WP:BLP"). Keep your explanation to 1-3 sentences.\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: <b>Clear vandalism</b> — added <code>lol hacked</code> which violates <i>WP:VANDALISM</i>.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n\nDIFF:\n${a}\n`)},username:async e=>{var t;return(0,i.fullTrim)(`\nYou are an automated Wikipedia username policy reviewer. Determine whether the username below violates Wikipedia's username policy.\n\nUSERNAME: ${e.user.name}\nPAGE CONTEXT: ${(null===(t=e.page)||void 0===t?void 0:t.title)||"(unknown)"}\n\nThe page context is provided ONLY to check for potential conflict-of-interest (e.g. a user named "AcmeCorp" iteming the Acme Corporation article). A controversial page topic does NOT make the username problematic.\n\nVIOLATION CATEGORIES (flag ONLY if the username clearly and unambiguously fits one):\n\n1. Offensive — The name is unambiguously profane, threatening, sexually explicit, or promotes vandalism. Merely edgy, weird, or humorous names do NOT qualify. (WP:U#OFFENSIVE)\n2. Disruptive — The name clearly declares intent to disrupt or vandalize (e.g. "I Will Vandalize"). (WP:U#DISRUPTIVE)\n3. Libelous — The name makes a clearly false or disparaging claim about a specific real person, or reveals private personal information. (WP:U#LIBEL)\n4. Misleading — The name impersonates a specific real person, or falsely claims special permissions by including terms like "admin", "sysop", "bureaucrat", "checkuser". (WP:U#MISLEADING)\n5. Promotional — The name is a URL or email address whose clear purpose is advertising or revenue. Containing a brand name alone is NOT enough. (WP:U#PROMO)\n6. Shared — The name unambiguously represents a company, organization, or role rather than an individual (e.g. "XYZ Foundation", "Secretary of ABC"). Names like "JohnAtAcme" or "AcmeFan123" are fine — they clearly identify an individual. (WP:U#SHARED)\n\nDECISION RULES:\n- Flag ONLY clear, unambiguous violations. Borderline = no flag.\n- Numbers at the end of a username (e.g. "itemor2847", "WikiFan99") are completely normal and NOT a violation of any kind.\n- Creative, odd, humorous, or meaningless usernames are NOT violations.\n- Containing a real word that could be offensive in some context is NOT enough — the name must be clearly and intentionally offensive.\n- When in doubt: do NOT flag. Set flag to false.\n- If not flagging, set explanation to "No violation."\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: Username contains <code>sysop</code> which falsely implies <i>WP:U#MISLEADING</i> permissions.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n`)}}),this.ws=e,this.settings=e.store.settings.AI,this.config=t}async test(){return!1}async models(){return[]}}function d(e){var t;const n=document.createElement("div");n.innerHTML=e;const s=[];for(const e of n.querySelectorAll("tr")){const t=e.querySelector(".diff-deletedline"),n=e.querySelector(".diff-addedline"),i=e.querySelector(".diff-context");t&&s.push(`- ${t.textContent.trim()}`),n?s.push(`+ ${n.textContent.trim()}`):i&&s.push(` ${i.textContent.trim()}`)}return s.length>0?s.join("\n"):(null===(t=n.textContent)||void 0===t?void 0:t.trim())||""}t.AI=l,r(l,"providers",{});const c={type:"object",properties:{issues:{type:"array",items:{type:"object",properties:{policy:{type:"string"},severity:{type:"string",enum:["Low","Medium","High","Critical"]}},required:["policy","severity"]}},explanation:{type:"string"},assessment:{type:"string",enum:["Good","Review","Suspicious","Bad"]},confidence:{type:"number",minimum:0,maximum:1}},required:["assessment","confidence","issues","explanation"]},u={type:"object",properties:{issues:{type:"array",items:{type:"object",properties:{policy:{type:"string",enum:["Offensive","Disruptive","Libelous","Misleading","Promotional","Shared"]},severity:{type:"string",enum:["Low","Medium","High","Critical"]}},required:["policy","severity"]}},explanation:{type:"string"},flag:{type:"boolean"},confidence:{type:"number",minimum:0,maximum:1}},required:["flag","confidence","issues","explanation"]};class p extends l{async test(){try{return(await fetch(`${this.config.server}/api/version`,{method:"GET"})).ok}catch(e){return!1}}async models(){try{const e=await fetch(`${this.config.server}/api/tags`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);return(await e.json()).models||[]}catch(e){throw e}}async fetch(e,t,n=null){try{const s=this.prompt[e](t),i={method:"POST",headers:{"Content-Type":"application/json"}},a={model:this.config.model,prompt:await s,stream:!1,options:{temperature:.1,top_p:.9,num_predict:1024},format:"edit"===e?c:u};let r;i.body=JSON.stringify(a),n&&(i.signal=n);try{if(r=await fetch(`${this.config.server}/api/generate`,i),!r.ok)throw new Error(`Ollama API error: ${r.status} ${r.statusText}`);const e=await r.json();if(!e.response)throw new Error("Empty response from Ollama");return JSON.parse(e.response)}catch(e){return{error:e.message||"Ollama request failed"}}}catch(e){return{error:e.message||"Ollama request failed"}}}}t.Ollama=p,l.registerProvider("Ollama",p)},8169(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.AudioManager=void 0;var s=n(4192),i=n(1258);const a={startup:{type:"sound",title:"Startup Sound",description:"Sound played when WikiShield starts up.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/startup.wav"},music:{type:"category",title:"Music",description:"Background music tracks.",volume:1,properties:{zen_mode:{type:"sound",title:"Zen Mode",description:"Background audio played in Zen mode.",volume:1,data:"custom://zen_mode",preview:!1}}},ui:{type:"category",title:"User Interface Sounds",description:"Sounds used for user interface interactions.",volume:1,properties:{click:{type:"sound",title:"Click Sound",description:"Sound played when clicking on interface elements.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/click.wav"}}},queue:{type:"category",title:"Queue Sounds",description:"Sounds played for queue events.",volume:1,properties:{ores:{type:"sound",title:"ORES Alert",description:"Sound played due to a high ORES score.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/ores.wav"},mention:{type:"sound",title:"Mention Alert",description:"Sound played when your username is mentioned in an edit.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/mention.wav"}}},notification:{type:"category",title:"Notification Sounds",description:"Sounds played for various notifications.",volume:1,properties:{alert:{type:"sound",title:"Alert Sound",description:"Sound played for alerts.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/alert.wav"},message:{type:"sound",title:"Message Sound",description:"Sound played for messages.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/message.wav"},toast:{type:"sound",title:"Toast Sound",description:"Sound played for toast notifications.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/toast.wav"}}},action:{type:"category",title:"Action Sounds",description:"Sounds played for various user actions.",volume:1,properties:{default:{type:"sound",title:"Default Action Sound",description:"Sound played for default actions.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/action.wav"},failed:{type:"sound",title:"Failed Action Sound",description:"Sound played when an action fails.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/failed.wav"},report:{type:"sound",title:"Report Action Sound",description:"Sound played for report actions.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/report.wav"}}}};t.AudioManager=class{constructor(e){this.ws=e,this.audio=a,this.soundEffects=new Map,this.previews=new Map,this.previewing=!1}async init(){this.zengine=new i.Zengine,this.zengine.debug=this.ws.__DEV__,await this.zengine.init(),this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"])}async playSound(e,t,n=!1,i){if(!n){const e=this.ws.store.settings.zen_mode;if(e.enabled&&!e.sound.enabled)return}const a=this.getSound(e);if(!a||!a.data)return;const r=this.getVolume(e),o=new Audio(a.data);o.volume=!n&&this.previewing?0:r,"mediaSession"in navigator&&(navigator.mediaSession.setActionHandler("play",()=>{}),navigator.mediaSession.setActionHandler("pause",()=>{}),navigator.mediaSession.setActionHandler("previoustrack",()=>{}),navigator.mediaSession.setActionHandler("nexttrack",()=>{}));const l=(0,s.generateRandomUUID)();n&&(this.muteId=l,this.previewing=!0,this.stopPreviews(),this._muteAll(),this.previews.set(o,e)),this.soundEffects.set(o,e);const d=new Promise((e,t)=>{o.resolve=e,o.reject=t});o.onended=()=>{o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))},o.onerror=()=>{o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))};let c=!1;return o.onplay=()=>{c||(c=!0,i&&i())},null==t||t.addEventListener("abort",()=>{o.pause(),o.src="",o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))}),o.play(),d}async previewSound(e){const t=this.getSound(e);if(!t||!t.data)return;this._muteAll();const n=new Audio(t.data);n.volume=this.getVolume(e),this.previews.set(n,e);const s=()=>{this.previews.delete(n),0===this.previews.size&&this._unmuteAll()};n.onended=s,n.onerror=s,await n.play()}stopPreviews(){for(const e of this.previews.keys())e.resolve(),e.pause(),e.onended=null,e.onerror=null,e.src="";this.previews.clear(),this._unmuteAll()}onvolumechanged(){if(this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"]),this.previewing)for(const[e,t]of this.previews.entries()){const n=this.getVolume(t);e.volume=n}else for(const[e,t]of this.soundEffects.entries()){const n=this.getVolume(t);e.volume=n}}_muteAll(){for(const e of this.soundEffects.keys())e.volume=0}_unmuteAll(){for(const[e,t]of this.soundEffects.entries())e.volume=this.getVolume(t)}getSound(e){let t={type:"category",properties:this.audio};for(const n of e){if("category"!==t.type)return null;if(t=t.properties[n],!t)return null}return t}getVolume(e){const t=this.ws.store.settings.audio.volume;let n=t.master,s={type:"category",properties:this.audio};const i=["master"];for(const a of e){if(i.push(a),"category"!==s.type)return n;if(s=s.properties[a],!s)break;const e=t[i.join(".")];void 0!==e&&(n*=e)}return n}}},1258(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Zengine=void 0;class n{constructor(){this.audioContext=null,this.masterGain=null,this.isPlaying=!1,this.debug=!1,this.layers={bass:{oscillators:[],gains:[],compressor:null},pad:{oscillators:[],gains:[],filter:null,reverb:null}},this.nextChordTimeout=null,this.baseFrequency=65.41,this.currentKey=0,this.chordLibrary={maj7:{bass:[0],pad:[0,7,11,16,19],tension:.1},min7:{bass:[0],pad:[0,7,10,15,19],tension:.15},maj9:{bass:[0],pad:[0,7,11,14,19],tension:.12},min9:{bass:[0],pad:[0,7,10,14,19],tension:.18},sus2:{bass:[0],pad:[0,7,12,14,19],tension:.25},sus4:{bass:[0],pad:[0,7,12,17,19],tension:.28},add9:{bass:[0],pad:[0,7,14,16,21],tension:.15},madd9:{bass:[0],pad:[0,7,14,15,21],tension:.2},openvoice:{bass:[0],pad:[0,7,12,19,24],tension:.08},"6add9":{bass:[0],pad:[0,7,9,14,19],tension:.18}},this.chordCompatibility={maj7:["maj9","min7","sus2","add9","openvoice","6add9"],min7:["maj7","min9","sus4","madd9","openvoice"],maj9:["maj7","add9","sus2","6add9","openvoice"],min9:["min7","madd9","sus2","maj9"],sus2:["maj7","maj9","add9","openvoice","sus4"],sus4:["maj7","sus2","min7","openvoice"],add9:["maj9","sus2","maj7","openvoice","6add9"],madd9:["min9","min7","add9","sus2"],openvoice:["sus2","maj7","add9","maj9"],"6add9":["maj7","maj9","add9","sus2"]},this.currentChordName="maj7",this.currentTension=.1}init(){this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGain=this.audioContext.createGain(),this.masterGain.connect(this.audioContext.destination),this.masterGain.gain.value=.2,this.setupLayerEffects())}async start(){this.isPlaying||(this.init(),"suspended"===this.audioContext.state&&await this.audioContext.resume(),this.isPlaying=!0,this.currentKey=Math.floor(12*Math.random()),this.playNextChord())}setupLayerEffects(){const e=this.audioContext.createDynamicsCompressor();e.threshold.value=-30,e.knee.value=40,e.ratio.value=12,e.attack.value=.003,e.release.value=.25,e.connect(this.masterGain),this.layers.bass.compressor=e;const t=this.audioContext.createBiquadFilter();t.type="lowpass",t.frequency.value=1200,t.Q.value=.5;const n=this.audioContext.createDelay(2);n.delayTime.value=.4;const s=this.audioContext.createGain();s.gain.value=.3,t.connect(n),n.connect(s),s.connect(t),t.connect(this.masterGain),this.layers.pad.filter=t,this.layers.pad.reverb={delay:n,gain:s}}playNextChord(){if(!this.isPlaying)return;const e=this.chooseNextChord(),t=this.currentChordName;if(this.currentChordName=e,this.currentTension=this.chordLibrary[e].tension,this.debug&&console.log("[MusicEngine] Chord changed",{from:t,to:e,tension:this.currentTension,key:this.currentKey,timestamp:this.audioContext.currentTime}),Math.random()<.08){const e=this.currentKey;this.currentKey=(this.currentKey+[2,5,7][Math.floor(3*Math.random())])%12,this.debug&&console.log("[MusicEngine] Key changed",{from:e,to:this.currentKey})}this.transitionToChord(e);const n=12e3+1e4*Math.random();this.nextChordTimeout=setTimeout(()=>this.playNextChord(),n)}chooseNextChord(){const e=this.chordCompatibility[this.currentChordName]||Object.keys(this.chordLibrary),t=e.map(e=>({name:e,weight:this.chordLibrary[e].tension<.2?2:1})),n=t.reduce((e,t)=>e+t.weight,0);let s=Math.random()*n;for(const e of t)if(s-=e.weight,s<=0)return e.name;return e[0]}transitionToChord(e){const t=this.chordLibrary[e];if(!t)return;const n=6+3*Math.random();["bass","pad"].forEach(e=>this.createLayer(e,t[e],n))}createLayer(e,t,n){if(null==t||!t.length)return;const s=this.audioContext.currentTime,i=this.layers[e];if(i.gains&&i.gains.length>0){const e=[...i.oscillators],t=[...i.gains];t.forEach(e=>{try{e.gain.cancelScheduledValues(s),e.gain.setValueAtTime(e.gain.value,s),e.gain.linearRampToValueAtTime(0,s+n)}catch(e){}}),setTimeout(()=>{e.forEach(e=>{try{e.stop(),e.disconnect()}catch(e){}}),t.forEach(e=>{try{e.disconnect()}catch(e){}})},1e3*n+100)}const a=[],r=[],o=[];t.forEach((t,l)=>{const d=this.baseFrequency*Math.pow(2,(this.currentKey+t)/12);o.push(d);const c=this.audioContext.createOscillator();c.type="bass"===e?"sine":"triangle",c.frequency.value=d,c.detune.value=6*(Math.random()-.5);const u=this.audioContext.createGain();u.gain.value=0,c.connect(u),"bass"===e&&i.compressor?u.connect(i.compressor):i.filter&&u.connect(i.filter),c.start(s),a.push(c),r.push(u);const p="bass"===e?.15:.08-.01*l;u.gain.setValueAtTime(0,s),u.gain.linearRampToValueAtTime(p,s+n)}),this.debug&&console.log("[MusicEngine] Layer created",{layer:e,frequencies:o,volumes:r.map(e=>e.gain.value),fadeDuration:n}),i.oscillators=a,i.gains=r}stop(){this.isPlaying=!1,this.nextChordTimeout&&clearTimeout(this.nextChordTimeout),this.debug&&console.log("[MusicEngine] Stopping music engine",{timestamp:this.audioContext.currentTime});const e=this.audioContext.currentTime;if(Object.values(this.layers).forEach(t=>{t.gains&&t.gains.forEach(t=>{try{t.gain.setValueAtTime(t.gain.value,e),t.gain.linearRampToValueAtTime(0,e+.5)}catch(e){}}),t.oscillators&&setTimeout(()=>{t.oscillators.forEach(e=>{try{e.stop(),e.disconnect()}catch(e){}}),t.oscillators=[],t.gains&&(t.gains.forEach(e=>{try{e.disconnect()}catch(e){}}),t.gains=[])},550)}),this.masterGain)try{this.masterGain.gain.setValueAtTime(this.masterGain.gain.value,e),this.masterGain.gain.linearRampToValueAtTime(0,e+.5)}catch(e){}}setMasterVolume(e){if(this.masterGain){const t=this.masterGain.gain.value;this.masterGain.gain.value=e,this.debug&&console.log("[MusicEngine] Master volume changed",{from:t,to:e})}}}t.Zengine=class{constructor(){this.audioContext=null,this.sounds=[],this.activeSounds=new Map,this.masterGainNode=null,this.isRunning=!1,this.currentEnvironment=null,this.eventLoopInterval=null,this.activityLevel=4,this.musicEngine=null,this.debug=!1}async init(){this.musicEngine=new n,this.musicEngine.init(),this.musicEngine.debug=this.debug;const e=await fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/bbc-sounds.json"),t=await e.json();return this.sounds=this.categorizeSounds(t),this.debug&&console.log("[Zengine] Initialized",{soundCount:this.sounds.length,categories:[...new Set(this.sounds.map(e=>e.category))]}),this.sounds.length}categorizeSounds(e){return e.map(e=>{var t;const n=(e.tags||[]).map(e=>e.toLowerCase()),s=(e.description||"").toLowerCase(),i=parseFloat((null===(t=e.technicalMetadata)||void 0===t?void 0:t.duration)||e.duration)||0,a=this.detectCategory(n,s),r=i>60?"ambient":i>15?"feature":"event";return{id:e.id,duration:i,description:e.description,category:a,role:r}})}detectCategory(e,t){const n=[...e,t].join(" ");return/rain|drizzle/i.test(n)?"rain":/ocean|sea|wave/i.test(n)?"ocean":/stream|river|water/i.test(n)?"water-flow":/wind|breeze/i.test(n)?"wind":/bird/i.test(n)?"bird":/cricket|insect/i.test(n)?"insect":"other"}generateEnvironment(){const e=[{name:"Gentle Rain",requiredAmbient:["rain"],commonCategories:["bird"],weather:"rain"},{name:"Ocean Shore",requiredAmbient:["ocean"],commonCategories:["bird","wind"],weather:"clear"},{name:"Forest Stream",requiredAmbient:["water-flow"],commonCategories:["bird","insect"],weather:"clear"}],t=e[Math.floor(Math.random()*e.length)];return this.debug&&console.log("[Zengine] Environment generated",{name:t.name,weather:t.weather,ambientRequirements:t.requiredAmbient,commonSounds:t.commonCategories}),t}getEnvironmentSounds(e){return{ambient:this.sounds.filter(t=>"ambient"===t.role&&e.requiredAmbient.includes(t.category)),events:this.sounds.filter(t=>"event"===t.role&&e.commonCategories.includes(t.category))}}async start(){this.isRunning||(0===this.sounds.length&&await this.init(),this.musicEngine.isPlaying||await this.musicEngine.start(),this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGainNode=this.audioContext.createGain(),this.masterGainNode.connect(this.audioContext.destination),this.masterGainNode.gain.value=.3),"suspended"===this.audioContext.state&&await this.audioContext.resume(),this.isRunning=!0,this.currentEnvironment=this.generateEnvironment(),this.debug&&console.log("[Zengine] Engine started",{environment:this.currentEnvironment.name,audioContextState:this.audioContext.state}),await this.startAmbientLayers(),this.startEventLoop())}async startAmbientLayers(){const e=this.getEnvironmentSounds(this.currentEnvironment),t=Math.min(e.ambient.length,2);for(let n=0;n<t;n++){const t=e.ambient[Math.floor(Math.random()*e.ambient.length)];this.activeSounds.has(t.id)||await this.playSound(t,"ambient",.35+.1*Math.random())}}startEventLoop(){this.eventLoopInterval=setInterval(()=>this.processEvents(),3e3),this.debug&&console.log("[Zengine] Event loop started")}async processEvents(){if(!this.isRunning)return;const e=this.getEnvironmentSounds(this.currentEnvironment);if(Array.from(this.activeSounds.values()).filter(e=>"ambient"!==e.role).length<this.activityLevel&&e.events.length>0&&Math.random()<.5){const t=e.events[Math.floor(Math.random()*e.events.length)];await this.playSound(t,"event",.12+.08*Math.random())}}async playSound(e,t,n){if(!this.activeSounds.has(e.id))try{const s=e.url||`https://sound-effects-media.bbcrewind.co.uk/mp3/${e.id}.mp3`,i=new Audio;i.crossOrigin="anonymous",i.src=s,i.preload="auto";const a=this.audioContext.createMediaElementSource(i),r=this.audioContext.createGain();r.gain.value=n,a.connect(r),r.connect(this.masterGainNode),this.activeSounds.set(e.id,{sound:e,audio:i,source:a,gainNode:r,role:t,volume:n}),this.debug&&console.log("[Zengine] Sound started playing",{soundId:e.id,description:e.description,role:t,volume:n,category:e.category,duration:e.duration,activeCount:this.activeSounds.size}),i.addEventListener("ended",()=>{this.removeSound(e.id),"ambient"===t&&this.isRunning&&setTimeout(()=>this.playSound(e,t,n),1e3)}),i.addEventListener("error",()=>this.removeSound(e.id)),await i.play()}catch(t){console.error("[Zengine] Sound error:",e.id,t)}}removeSound(e){const t=this.activeSounds.get(e);if(t){try{t.audio.pause(),t.gainNode.disconnect(),t.source.disconnect()}catch(e){}this.debug&&console.log("[Zengine] Sound removed",{soundId:e,description:t.sound.description,activeCount:this.activeSounds.size-1}),this.activeSounds.delete(e)}}stop(){this.musicEngine.isPlaying&&this.musicEngine.stop(),this.isRunning=!1,this.eventLoopInterval&&(clearInterval(this.eventLoopInterval),this.eventLoopInterval=null),this.debug&&console.log("[Zengine] Engine stopping",{activeSounds:this.activeSounds.size}),this.activeSounds.forEach((e,t)=>{try{e.audio.pause(),e.audio.currentTime=0}catch(e){}const n=this.audioContext.currentTime;e.gainNode.gain.cancelScheduledValues(n),e.gainNode.gain.setValueAtTime(e.gainNode.gain.value,n),e.gainNode.gain.linearRampToValueAtTime(0,n+.5),setTimeout(()=>this.removeSound(t),500)}),this.audioContext&&"running"===this.audioContext.state&&this.audioContext.suspend(),this.debug&&console.log("[Zengine] Engine stopped")}setMasterVolume(e){if(this.masterGainNode){const t=this.masterGainNode.gain.value;this.masterGainNode.gain.value=e,this.debug&&console.log("[Zengine] Master volume changed",{from:t,to:e,musicEngineVolume:.25*e})}this.musicEngine.setMasterVolume(.25*e)}}},870(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.conditions=void 0;var s=n(372);t.conditions={true:{title:"True",check:(e,t,n)=>!0},false:{title:"False",check:(e,t,n)=>!1},"account-admin":{title:"You are an admin",check:(e,t,n)=>!0===e.groups.sysop},"item-selected":{title:"An item is selected",check:(e,t,n)=>null!==t},"edit-selected":{title:"An edit is selected",check:(e,t,n)=>"edit"===s.Queue.groups[null==t?void 0:t.type]},"logevent-selected":{title:"A logentry is selected",check:(e,t,n)=>"logevent"===s.Queue.groups[null==t?void 0:t.type]},revertable:{title:"Current item is revertable",check:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"===s.Queue.groups[i]}},pending:{title:"Current item is pending review",check:(e,t,n)=>!!e.queue.pending.has(t.id)},"user-registered":{title:"Selected user is registered",check:(e,t,n)=>!1===t.user.anon},"user-ip":{title:"Selected user is an IP address",check:(e,t,n)=>!0===t.user.ip},"user-temp":{title:"Selected user is a temporary account",check:(e,t,n)=>!0===t.user.temp},"user-empty-talk":{title:"Selected user's talk page is empty",check:(e,t,n)=>void 0===t.user.talk},"user-blocked":{title:"Selected user is blocked",check:(e,t,n)=>!0===t.user.blocked},"user-edit-count":{title:"Selected user's edit count is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"count",title:"Edit count",type:"number",default:0}],check:(e,t,n)=>{const s=-1===t.user.editcount?1/0:t.user.editcount||0,i=Number(n.count);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"user-final-warning":{title:"Selected user at final warning level",check:(e,t,n)=>"4"===t.user.warning||"4im"===t.user.warning},"user-has-warnings":{title:"Selected user has no warnings",check:(e,t,n)=>"0"!==t.user.warning},"edit-pending":{title:"Edit is pending",check:(e,t,n)=>e.queue.pending.has(null==t?void 0:t.id)},"edit-minor":{title:"Edit is marked as minor",check:(e,t,n)=>!0===t.minor},"edit-size":{title:"Edit size is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"size",title:"Size",type:"number",default:0}],check:(e,t,n)=>{const s=t.sizediff||0,i=Number(n.size);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"abs-edit-size":{title:"Absolute edit size is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"size",title:"Size",type:"number",min:0,default:0}],check:(e,t,n)=>{const s=Math.abs(t.sizediff||0),i=Number(n.size);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"edit-ores-score":{title:"Edit ORES score is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"score",title:"Score",type:"number",min:0,max:1,default:0}],check:(e,t,n)=>{const s=t.ores_score||0,i=Number(n.score);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"user-highlighted":{title:"Selected user is highlighted",check:(e,t,n)=>e.store.highlight.users.has(t.user.name)},"user-whitelisted":{title:"Selected user is whitelisted",check:(e,t,n)=>e.store.whitelist.users.has(t.user.name)},"page-highlighted":{title:"Selected page is highlighted",check:(e,t,n)=>e.store.highlight.pages.has(t.page.title)},"page-whitelisted":{title:"Selected page is whitelisted",check:(e,t,n)=>e.store.whitelist.pages.has(t.page.title)},"page-watched":{title:"Selected page is watched",check:(e,t,n)=>!0===t.page.watched},"tag-highlighted":{title:"Selected edit has a highlighted tag",check:(e,t,n)=>{for(const n of t.tags)if(e.store.highlight.tags.has(n))return!0;return!1}},"tag-whitelisted":{title:"Selected edit has a whitelisted tag",check:(e,t,n)=>{for(const n of t.tags)if(e.store.whitelist.tags.has(n))return!0;return!1}},"in-recent-queue":{title:"In recent changes queue",check:(e,t,n)=>"recent"===e.queue.current.type},"in-pending-queue":{title:"In pending changes queue",check:(e,t,n)=>"pending"===e.queue.current.type},"in-user-queue":{title:"In user creations queue",check:(e,t,n)=>"users"===e.queue.current.type},"in-watchlist-queue":{title:"In watchlist queue",check:(e,t,n)=>"watchlist"===e.queue.current.type}}},9808(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.validateShortcut=t.controls=t.buildShortcut=void 0;const n=t.controls=new Set(["!","@","#","$","%","^","&","*","(",")","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","-","=","[","]","\\",";","'",",",".","/","_","+","{","}","|",":",'"',"<",">","?"," ","arrowleft","arrowup","arrowdown","arrowright"]);t.buildShortcut=e=>{const t=[];["ctrl","shift","alt"].forEach(n=>{e[`${n}Key`]&&t.push(n)});const s=e.key.toLowerCase();return n.has(s)&&t.push(s),t.join("+")};t.validateShortcut=e=>{const t=e.toLowerCase().split("+");if(0===t.length)return!1;const s=new Set;for(const e of t){if(s.has(e))return!1;if(s.add(e),"ctrl"!==e&&"shift"!==e&&"alt"!==e&&!n.has(e))return!1}return t.some(e=>"ctrl"!==e&&"shift"!==e&&"alt"!==e)}},985(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.events=void 0;var s=n(372),i=n(7054),a=n(955),r=n(863),o=n(5643);t.events={"next-item":{title:"Go to next item",icon:"fas fa-arrow-right",script:(e,t,n)=>(e.queue.next(),{valid:!0})},"previous-item":{title:"Go to previous item",icon:"fas fa-arrow-left",script:(e,t,n)=>(e.queue.previous(),{valid:!0})},"clear-queue":{title:"Clear queue",icon:"fas fa-trash-can",valid:(e,t,n)=>"pending"===e.queue.current.type?{valid:!1,reason:"Pending edits queue cannot be cleared."}:{valid:!0},script:(e,t,n)=>(e.queue.clear(e.queue.current.type),{valid:!0})},"next-queue":{title:"Go to next queue",icon:"fas fa-forward",script:(e,t,n)=>{const i=s.Queue.types.map(t=>({name:t,...e.store.settings.queue[t]}));i.sort((e,t)=>e.order-t.order);const a=i.findIndex(t=>t.name===e.queue.current.type);return e.queue.switch(i[(a+1)%i.length].name),{valid:!0}}},"previous-queue":{title:"Go to previous queue",icon:"fas fa-forward",script:(e,t,n)=>{const i=s.Queue.types.map(t=>({name:t,...e.store.settings.queue[t]}));i.sort((e,t)=>e.order-t.order);const a=i.findIndex(t=>t.name===e.queue.current.type);return e.queue.switch(i[(a-1+i.length)%i.length].name),{valid:!0}}},"accept-pending-edit":{title:"Accept pending edit",icon:"fas fa-check",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Accepting pending edit",valid:(e,t,n)=>e.rights.review?e.queue.pending.has(t.id)?{valid:!0}:{valid:!1,reason:"Pending edit can only be accepted when a pending edit is selected."}:{valid:!1,reason:"You do not have permission to review pending changes."},script:async(e,t,n)=>{const s=e.queue.pending.get(t.id);if(!s)return{valid:!1,reason:"Pending edit not found."};const i=`${s.count||""} pending revision${1===s.count?"":"s"}`,a=Object.entries(s.users||{}).map(t=>[e.api.user(t[0]),t[1]]);a.sort((e,t)=>t[1]-e[1]);const r=Math.max(a.reduce((e,t)=>{const n=t[0].length;return e[0]+n<=250?[e[0]+n,e[1]+1]:e},[0,0])[1],1);let o="";const l=a.length;if(l>r){const e=a.slice(0,r).map(e=>e[0]),t=l-e.length;o=`${e.join(", ")}, and ${t} other${1===t?"":"s"}`}else o=(e=>{switch(e.length){case 0:case 1:return e[0]||"";case 2:return`${e[0]} and ${e[1]}`;default:return`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`}})(a.map(e=>e[0]));return await e.api.acceptPendingEdit(t.pending.revid,e.api.summary(`Accepted ${i} by ${o}`,n.summary))},successful:(e,t,n)=>{e.store.statistics.pending_changes_reviewed.accepted++}},"reject-pending-edit":{title:"Reject pending edit",icon:"fas fa-xmark",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Rejecting pending edit",valid:(e,t,n)=>e.rights.review?e.queue.pending.has(t.id)?{valid:!0}:{valid:!1,reason:"Pending edit can only be rejected when a pending edit is selected."}:{valid:!1,reason:"You do not have permission to review pending changes."},script:async(e,t,n)=>{const s=e.queue.pending.get(t.id);if(!s)return{valid:!1,reason:"Pending edit not found."};const i=`${s.count||""} pending revision${1===s.count?"":"s"}`,a=Object.entries(s.users||{}).map(t=>[e.api.user(t[0]),t[1]]);a.sort((e,t)=>t[1]-e[1]);const r=Math.max(a.reduce((e,t)=>{const n=t[0].length;return e[0]+n<=250?[e[0]+n,e[1]+1]:e},[0,0])[1],1);let o="";const l=a.length;if(l>r){const e=a.slice(0,r).map(e=>e[0]),t=l-e.length;o=`${e.join(", ")}, and ${t} other${1===t?"":"s"}`}else o=(e=>{switch(e.length){case 0:case 1:return e[0]||"";case 2:return`${e[0]} and ${e[1]}`;default:return`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`}})(a.map(e=>e[0]));return await e.api.rejectPendingEdit(t.id,s.prior,t.page.title,e.api.summary(`Rejected ${i} by ${o} to [[Special:Diff/${s.prior}|last stable revision]]`,n.summary))},successful:(e,t,n)=>{e.store.statistics.pending_changes_reviewed.rejected++}},revert:{title:"Revert and auto warn/report",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]}],progress:"Reverting edit",valid:(e,t,n)=>{let i=t.type;if("abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i])return{valid:!1,reason:"Edit can only be reverted when an edit is selected."};return"summary"in(0,a.getWarningFromLookup)(n.warning)?{valid:!0}:{valid:!1,reason:"Selected warning template does not support reverting."}},script:async(e,t,n)=>{var r;const l=(0,a.getWarningFromLookup)(n.warning);if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Reverting yourself","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to revert their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to revert the edit on it?`)||null!==(r=t.tags)&&void 0!==r&&r.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to revert it?"))return{valid:!1,reason:"Revert cancelled by user."};const d=await(async()=>await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted edits by ${e.api.user(t.user.name)}`,l.summary)))();if(!d.valid)return d;switch(e.store.statistics.reverts_made.total++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}let c;const u=await(async()=>{const n=`User talk:${t.user.name}`,i=e.util.monthSectionName(),a=(await e.api.getPagesContent([n]))[n]||"",r=e.util.getPageSections(a);let o="new";const d=r.length;for(let e=0;e<d;e++)r[e].title===i&&(o=e+1);let u;c=e.queue.getWarningLevel(a),u="string"==typeof l.auto?l.auto:"function"==typeof l.auto?l.auto(t,c):l.auto[c];const p=l.templates.find(e=>e.name===u.toString());if(!p)return{valid:!0};let g="Message about ";"edit"===s.Queue.groups[t.type]?g+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?g+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:g+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:g+=`[[${t.page.title}]]`;let h="";h="new"===o?`{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)`:`${r[o-1].heading}\n${r[o-1].content}\n\n{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)`;const m=await e.api.editSection(n,o,i,h,e.api.summary(g,`${l.name} (${p.name})`));if(m.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(u)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,u),e.store.statistics.warnings_issued.total++,u){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return m})();if(!u.valid)return u;if(("4"===c||"4im"===c)&&l.reportable&&e.store.settings.auto_report.enabled&&e.store.settings.auto_report.for.has(n.warning)){if(!(await(async()=>await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}}))()).valid)return{valid:!0};e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}return{valid:!0}}},"warn-and-report":{title:"Auto warn/report",icon:"fas fa-exclamation-triangle",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]}],progress:"Warning user",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be warned when an item is selected."},script:async(e,t,n)=>{var r;const l=(0,a.getWarningFromLookup)(n.warning);if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Warning yourself","You are about to warn yourself. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to warn them?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`)||null!==(r=t.tags)&&void 0!==r&&r.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?"))return{valid:!1,reason:"Warn cancelled by user."};let d;const c=await(async()=>{const n=`User talk:${t.user.name}`,i=e.util.monthSectionName(),a=(await e.api.getPagesContent([n]))[n]||"",r=e.util.getPageSections(a);let o="new";const c=r.length;for(let e=0;e<c;e++)r[e].title===i&&(o=e+1);let u;d=e.queue.getWarningLevel(a),u="string"==typeof l.auto?l.auto:"function"==typeof l.auto?l.auto(t,d):l.auto[d];const p=l.templates.find(e=>e.name===u.toString());if(!p)return{valid:!0};let g="Message about ";"edit"===s.Queue.groups[t.type]?g+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?g+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:g+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:g+=`[[${t.page.title}]]`;let h="";h="new"===o?`{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)`:`${r[o-1].heading}\n${r[o-1].content}\n\n{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)`;const m=await e.api.editSection(n,o,i,h,e.api.summary(g,`${l.name} (${p.name})`));if(m.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(u)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,u),e.store.statistics.warnings_issued.total++,u){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return m})();if(!c.valid)return c;if(("4"===d||"4im"===d)&&l.reportable&&e.store.settings.auto_report.enabled&&e.store.settings.auto_report.for.has(n.warning)){if(!(await(async()=>await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}}))()).valid)return{valid:!0};e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}return{valid:!0}}},"warn-user":{title:"Warn user",icon:"fas fa-exclamation-triangle",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]},{dependencies:["warning"],id:"level",title:"Warning level",type:"choice",options:e=>["auto",...a.warningsLookup[e.warning].templates.filter(e=>void 0===e.generic).map(e=>e.name)],default:"auto"}],continuity:!0,progress:"Issuing warning to user",valid:(e,t,n)=>{var s;return t?"auto"!==n.level&&null===(null===(s=(0,a.getWarningFromLookup)(n.warning))||void 0===s?void 0:s.templates[n.level])?{valid:!1,reason:"Selected warning template does not support automatic level selection."}:{valid:!0}:{valid:!1,reason:"User can only be warned when an item is selected."}},script:async(e,t,n)=>{var i;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Warning yourself","You are about to warn yourself. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to warn them?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`)||null!==(i=t.tags)&&void 0!==i&&i.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?"))return{valid:!1,reason:"Warning cancelled by user."};const r=(0,a.getWarningFromLookup)(n.warning),o=`User talk:${t.user.name}`,l=e.util.monthSectionName(),d=(await e.api.getPagesContent([o]))[o]||"",c=e.util.getPageSections(d);let u="new";const p=c.length;for(let e=0;e<p;e++)c[e].title===l&&(u=e+1);let g;g="auto"===n.level?"string"==typeof r.auto?r.auto:"function"==typeof r.auto?r.auto(t,e.queue.getWarningLevel(d)):r.auto[e.queue.getWarningLevel(d)]:n.level;const h=r.templates.find(e=>e.name===g.toString());if(!h)return"auto"!==n.level?{valid:!1,reason:"Selected warning template does not support the specified level."}:{valid:!0};let m="Message about ";"edit"===s.Queue.groups[t.type]?m+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?m+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:m+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:m+=`[[${t.page.title}]]`;let v="";v="new"===u?`{{subst:${h.template}|${t.page.title}|${h.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)`:`${c[u-1].heading}\n${c[u-1].content}\n\n{{subst:${h.template}|${t.page.title}|${h.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)`;const f=await e.api.editSection(o,u,l,v,e.api.summary(m,`${r.name} (${h.name})`));if(f.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(g)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,g),e.store.statistics.warnings_issued.total++,g){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return f}},"rollback-edit":{title:"Rollback edit",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Rolling back edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be rolled back when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Rollbacking own edit","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to rollback it?"))return{valid:!1,reason:"Rollback cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted edits${i}`,n.summary))},successful:(e,t,n)=>{switch(e.store.statistics.reverts_made.total++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}}},"rollback-goodfaith-edit":{title:"Rollback good faith edit",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Rolling back good faith edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be rolled back when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Rollbacking own edit","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to rollback it?"))return{valid:!1,reason:"Rollback cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted [[Wp:AGF|Good faith]] edits${i}`,n.summary))},successful:(e,t,n)=>{switch(e.store.statistics.reverts_made.total++,e.store.statistics.reverts_made.good_faith++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}}},"undo-edit":{title:"Undo edit",icon:"fas fa-undo",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Undoing edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be undone when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Undoing own edit","You are about to undo your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to undo their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to undo the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to undo it?"))return{valid:!1,reason:"Undo cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.undoEdit(t.page.title,t.id,e.api.summary(`Undid revision ${e.api.revision(t.id)}${i}`,n.summary))}},"restore-edit":{title:"Restore edit",icon:"fas fa-redo",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Restoring edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be restored when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>await e.api.restoreEdit(t.page.title,t.id,e.api.summary(`Restored revision ${e.api.revision(t.id)} by ${e.api.user(t.user.name)}`,n.summary))},"send-message-to-user-talk":{title:"Send message to user talk page",icon:"fas fa-comment",parameters:(e,t)=>[{id:"heading",title:"Section heading",type:"text"},{id:"message",title:"Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC))",type:"text"}],progress:"Sending message to user talk page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Message can only be sent when an item is selected."},script:async(e,t,n)=>await e.api.editSection(`User talk:${t.user.name}`,"new",n.heading,n.message,e.api.summary(`Message from ${e.api.username}: ${n.heading}`))},"send-message-to-page-talk":{title:"Send message to page talk page",icon:"fas fa-comment",parameters:(e,t)=>[{id:"heading",title:"Section heading",type:"text"},{id:"message",title:"Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC))",type:"text"}],progress:"Sending message to page talk page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Message can only be sent when an item is selected."},script:async(e,t,n)=>{const s=t.page.title.split(":");let i="Talk";s.length>1&&(i=s[0].toLowerCase().includes("talk")?s[0]:`${s[0]} talk`);const a=`${i}:${1===s.length?s[0]:s.slice(1).join(":")}`;return await e.api.editSection(a,"new",n.heading,n.message,e.api.summary(`Message from ${e.api.username}: ${n.heading}`))}},"report-user-to-aiv":{title:"Report user to AIV",icon:"fas fa-flag",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Vandalism past final warning","Vandalism-only account","Vandalism after recent release of block","Spambot or compromised account","Long-term abuse"],default:"Vandalism past final warning"},{id:"summary",title:"Summary (optional)",type:"text"}],continuity:!0,progress:"Reporting user to AIV",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be reported when an item is selected."},script:async(e,t,n)=>t.user.name===e.api.username?{valid:!1,reason:"You cannot report yourself, silly!"}:(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to report them?`)?{valid:!1,reason:"User report cancelled by user."}:await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; ${n.reason}${n.summary?`: ${n.summary}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}})),successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}},"report-user-to-uaa":{title:"Report user to UAA",icon:"fas fa-user-slash",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Disruptive username","Offensive username","Promotional username","Misleading username"],default:"Disruptive username"},{id:"summary",title:"Summary (optional)",type:"text"}],continuity:!0,progress:"Reporting user to UAA",valid:(e,t,n)=>t?t.user.anon?{valid:!1,reason:"User cannot be reported because they are anonymous."}:{valid:!0}:{valid:!1,reason:"User can only be reported when an item is selected."},script:async(e,t,n)=>{if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot report yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to report them?`))return{valid:!1,reason:"User report cancelled by user."};if(await e.api.areUsersBlocked([t.user.name])[t.user.name])return{valid:!1,reason:"User cannot be reported because they are blocked."};const s="Offensive username"===n.reason?"offensive username":e.api.user(t.user.name);return await e.api.append(i.WikiShield.config.pages.UAA,null,(0,o.fullTrim)(`\n * {{user-uaa|${t.user.name}}} &ndash; ${n.reason}${n.summary?`: ${n.summary}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${s}`),n=>{var s;return{valid:!(null!==(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))&&void 0!==s&&s.content.includes(`{{user-uaa|${t.user.name}}`)),reason:"User has already been reported to UAA."}})},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.UAA++}},"request-page-protection":{title:"Request page protection",icon:"fas fa-shield-alt",parameters:(e,t)=>[{id:"level",title:"Protection level",type:"choice",options:[...e.api.hasPendingChanges?["Pending changes protection"]:[],"Semi-protection","Extended-confirmed protection","Full protection","Move protection","Template protection"],default:"Semi-protection"},{id:"reason",title:"Reason",type:"choice",options:["Generic","Persistent vandalism","Disruptive editing","Edit warring","BLP violations","Sockpuppetry","Arbitration enforcement"],default:"Generic"},{id:"duration",title:"Duration",type:"choice",options:["Temporary","Indefinite"],default:"Temporary"},{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Requesting page protection",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Page protection can only be requested for edits."}:{valid:!0}},script:async(e,t,n)=>{if(await e.gui.settings.waitForClose(),e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to request protection for it?`))return{valid:!1,reason:"Page protection request cancelled by user."};const s="Generic"===n.reason?n.summary:`${n.reason} &ndash; ${n.summary}`;return await e.api.append(i.WikiShield.config.pages.RFPP,null,`\n${(0,o.fullTrim)(`\n === [[${t.page.title}]] ===\n * {{pagelinks|${t.page.title}}}\n '''${n.duration} ${n.level.toLowerCase()}'''${s?`: ${s}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting ${n.level} protection for [[${t.page.title}]]`),n=>({valid:!e.util.getPageSections(n).some(e=>e.title===`[[${t.page.title}]]`),reason:"Page protection has already been requested for this page."}))},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.RFPP++}},"request-global-block":{title:"Request global block",icon:"fas fa-ban",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Generic","Long-term abuse","Cross-wiki abuse","Spam / spambot","Compromised account"],default:"Generic"},{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Requesting global block",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Global block can only be requested when an item is selected."},script:async(e,t,n)=>{var s;if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot request a global block for yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to request a global block for them?`))return{valid:!1,reason:"Global block request cancelled by user."};if(await e.api.isUserGloballyLocked(t.user.name))return{valid:!1,reason:"User is globally locked."};const a="Generic"===n.reason?n.summary:`${n.reason}. ${n.summary}`,r=(await e.api.getPagesContent([i.WikiShield.config.pages.SRG],!0,"meta.wikimedia.org"))[i.WikiShield.config.pages.SRG]||"",l=e.util.getPageSections(r);return await e.api.append(i.WikiShield.config.pages.SRG,Number(null===(s=Object.entries(l).find(([,e])=>2===e.level&&"Requests for global (un)block"===e.title))||void 0===s?void 0:s[0])+1||void 0,`\n${(0,o.fullTrim)(`\n === Global block for ${t.user.name} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{Luxotool|${t.user.name}}}\n ${a?`${a} `:""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting global block for ${e.api.user(t.user.name)}`),n=>{let s=!1,i=[];for(const t of e.util.getPageSections(n))if(2===t.level){if("Requests for global (un)block"===t.title)s=!0;else if(s)break}else s&&3===t.level&&i.push(t);return i=i.filter(e=>!e.content.match(/^{{Status\|not done}}/i)),{valid:!i.some(n=>{const s=n.content;return!!s.match(new RegExp(`{{Luxotool\\|(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}}}`,"i"))||!!s.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(?:\\|hidename=1)?(?:\\||})`,"i"))}),reason:"User has already been requested for global block."}},!1,"meta.wikimedia.org")},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.global_block++}},"request-global-lock":{title:"Request global lock",icon:"fas fa-lock",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Generic","Long-term abuse","Cross-wiki abuse","Abusive-username","Spam / spambot","Compromised account"],default:"Generic"},{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Requesting global lock",valid:(e,t,n)=>t?t.user.anon?{valid:!1,reason:"Global lock cannot be requested for anonymous users."}:{valid:!0}:{valid:!1,reason:"Global lock can only be requested when an item is selected."},script:async(e,t,n)=>{var s;if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot request a global lock for yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to request a global lock for them?`))return{valid:!1,reason:"Global lock request cancelled by user."};if(await e.api.isUserGloballyLocked(t.user.name))return{valid:!1,reason:"User is already globally locked."};const a="Generic"===n.reason?n.summary:`${n.reason}. ${n.summary}`,r="Yes"===n.hide_username?"":` for ${e.api.centralAuthUser(t.user.name)}`,l=(await e.api.getPagesContent([i.WikiShield.config.pages.SRG],!0,"meta.wikimedia.org"))[i.WikiShield.config.pages.SRG]||"",d=e.util.getPageSections(l);return await e.api.append(i.WikiShield.config.pages.SRG,Number(null===(s=Object.entries(d).find(([,e])=>2===e.level&&"Requests for global (un)lock and (un)hiding"===e.title))||void 0===s?void 0:s[0])+1||void 0,`\n${(0,o.fullTrim)(`\n === Global lock${r} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{LockHide|${t.user.name}${"Yes"===n.hide_username?"|hidename=1":""}}}\n ${a?`${a} `:""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting global lock${r}`),n=>{let s=!1,i=[];for(const t of e.util.getPageSections(n))if(2===t.level){if("Requests for global (un)lock and (un)hiding"===t.title)s=!0;else if(s)break}else s&&3===t.level&&i.push(t);return i=i.filter(e=>!e.content.match(/^{{Status\|not done}}/i)),{valid:!i.some(n=>{const s=n.content;return!!s.match(new RegExp(`{{LockHide\\|(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(\\|hidename=1)?}}`,"i"))||!!s.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(?:\\|hidename=1)?(?:\\||})`,"i"))}),reason:"User has already been requested for global lock."}},!1,"meta.wikimedia.org")},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.global_lock++}},"thank-user":{title:"Thank user",icon:"fas fa-handshake",progress:"Thanking user",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"User can only be thanked when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{const s=e.api.summary(`Thank you for [[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`),i=`User talk:${t.user.name}`;if(t.user.temp){const n=await e.api.thankRevision(t.id);return(n.valid||e.store.settings.talk_page_thanks_for_temporary_users.enabled)&&void 0===(await e.api.pagesExist(i))[i]&&await e.api.editSection(i,"new","Thank you!","{{subst:Thanks-autosign}}",s),n}return t.user.ip?await e.api.editSection(i,"new","Thank you!","{{subst:Thanks-autosign}}",s):await e.api.thankRevision(t.id)},successful:(e,t,n)=>{e.store.statistics.edits_reviewed.thanked++}},"welcome-user":{title:"Welcome user",icon:"fas fa-paper-plane",parameters:(e,t)=>[{id:"template",title:"Template",type:"choice",options:Object.keys(r.welcomes),default:Object.keys(r.welcomes)[0]}],progress:"Welcoming user",valid:(e,t,n)=>t?void 0!==t.user.talk?{valid:!1,reason:"User cannot be welcomed because their talk page is not empty."}:{valid:!0}:{valid:!1,reason:"User can only be welcomed when an item is selected."},script:async(e,t,n)=>await(async()=>{const s=`User talk:${t.user.name}`;if(void 0!==(await e.api.pagesExist([s]))[s])return{valid:!1,reason:"User cannot be welcomed because their talk page is not empty."};let i=r.welcomes[n.template];if(!i)return{valid:!1,reason:"Selected welcome template does not exist."};const a=new Set([i]);for(;"function"==typeof(null===(o=i)||void 0===o?void 0:o.template);){var o,l;if(i=r.welcomes[i.template(e,t)],a.has(i))return null!==(l=void e.gui.dialog.toast("REPORT TO DEVELOPER","Uh oh! Something has gone <i>cat</i>astrophically wrong. Please report this to a developer, and include the error code below:<br><br><code>WELCOME_TEMPLATE_LOOP</code>","dev",-1))&&void 0!==l?l:{valid:!1};if(!i)return{valid:!1,reason:"Selected welcome template does not exist."};a.add(i)}const d=`{{subst:${i.template}}}${i.sign?" [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:14, 25 May 2026 (UTC)":""}`;return await e.api.append(s,null,d,e.api.summary("Welcome to Wikipedia!"))})(),successful:(e,t,n)=>{e.store.statistics.users_welcomed.total++,e.queue.talks.set(t.user.name,!0),e.gui.renderQueue()}},"watch-page":{title:"Watch page",icon:"fas fa-eye",progress:"Watching page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be watched when an item is selected."},script:async(e,t,n)=>await e.api.watchPage(t.page.title,e.util.utcString(e.util.expiryToDate(e.store.settings.expiry.watchlist))),successful:(e,t,n)=>{e.store.statistics.watchlist.watched++,e.queue.watchlist.set(t.page.title,!0)}},"unwatch-page":{title:"Unwatch page",icon:"fas fa-eye-slash",progress:"Unwatching page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be unwatched when an item is selected."},script:async(e,t,n)=>await e.api.unwatchPage(t.page.title),successful:(e,t,n)=>{e.store.statistics.watchlist.unwatched++,e.queue.watchlist.set(t.page.title,!1)}},"whitelist-user":{title:"Add user to whitelist",icon:"fas fa-user-check",progress:"Adding user to whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be added to whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.users.set(t.user.name,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.whitelist.users).valueOf()]),e.store.statistics.items_whitelisted.total++,e.store.statistics.items_whitelisted.users++,e.gui.renderQueue(),{valid:!0})},"unwhitelist-user":{title:"Remove user from whitelist",icon:"fas fa-user-minus",progress:"Removing user from whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be removed from whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.users.delete(t.user.name),e.gui.renderQueue(),{valid:!0})},"whitelist-page":{title:"Add page to whitelist",icon:"fas fa-check",progress:"Adding page to whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be added to whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.pages.set(t.page.title,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.whitelist.pages).valueOf()]),e.store.statistics.items_whitelisted.total++,e.store.statistics.items_whitelisted.pages++,e.gui.renderQueue(),{valid:!0})},"unwhitelist-page":{title:"Remove page from whitelist",icon:"fas fa-minus",progress:"Removing page from whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be removed from whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.pages.delete(t.page.title),e.gui.renderQueue(),{valid:!0})},"highlight-user":{title:"Add user to highlighted users",icon:"fas fa-star",progress:"Adding user to highlighted users",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be added to highlighted users when an item is selected."},script:(e,t,n)=>(e.store.highlight.users.set(t.user.name,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.highlight.users).valueOf()]),e.store.statistics.items_highlighted.total++,e.store.statistics.items_highlighted.users++,e.gui.renderQueue(),{valid:!0})},"unhighlight-user":{title:"Remove user from highlighted users",icon:"fas fa-user-minus",progress:"Removing user from highlighted users",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be removed from highlighted users when an item is selected."},script:(e,t,n)=>(e.store.highlight.users.delete(t.user.name),e.gui.renderQueue(),{valid:!0})},"highlight-page":{title:"Add page to highlighted pages",icon:"fas fa-star",progress:"Adding page to highlighted pages",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be added to highlighted pages when an item is selected."},script:(e,t,n)=>(e.store.highlight.pages.set(t.page.title,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.highlight.pages).valueOf()]),e.store.statistics.items_highlighted.total++,e.store.statistics.items_highlighted.pages++,e.gui.renderQueue(),{valid:!0})},"unhighlight-page":{title:"Remove page from highlighted pages",icon:"fas fa-minus",progress:"Removing page from highlighted pages",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be removed from highlighted pages when an item is selected."},script:(e,t,n)=>(e.store.highlight.pages.delete(t.page.title),e.gui.renderQueue(),{valid:!0})},"refresh-user-contributions":{title:"Refresh user contributions",icon:"fas fa-rotate",progress:"Refreshing user contributions",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User contributions can only be refreshed when an item is selected."},script:async(e,t,n)=>{try{var s;document.querySelector("#refresh-page-history").classList.add("refreshing");const n=(await e.api.parseUsers([t.user.name]))[0].user;return e.queue.talks.set(t.user.name,n.talk),e.queue.contributions.set(t.user.name,n.contributions),e.queue.blocked.set(t.user.name,n.blocked),e.queue.blocks.set(t.user.name,n.blocks),t.user.edits=Math.max(n.edits,(null===(s=n.contributions)||void 0===s?void 0:s.length)||0),t.user.warning=e.queue.getWarningLevel(n.talk||""),t.user.warnings=e.queue.getWarningHistory(n.talk||""),delete t.user.cached_contributions,e.gui.renderQueue(),e.queue.current.item===t&&e.gui.newCurrentItem(t),{valid:!0}}catch(e){return console.error(e),{valid:!1,reason:"An error occurred while fetching user contributions."}}}},"refresh-page-history":{title:"Refresh page history",icon:"fas fa-rotate",progress:"Refreshing page history",valid:(e,t,n)=>t?"users"===t.type?{valid:!1,reason:"Page history cannot be refreshed for user creations."}:{valid:!0}:{valid:!1,reason:"Page history can only be refreshed when an item is selected."},script:async(e,t,n)=>{try{document.querySelector("#refresh-page-history").classList.add("refreshing");const[n,s]=await Promise.all([e.api.getHistory(t.page.title),e.api.getPagesDetails(t.page.title)]),i=s[t.page.title];return e.queue.histories.set(t.page.title,n),t.page.metadata=i.metadata,t.page.categories=i.categories,t.page.protection=i.protection,delete t.page.cached_history,e.gui.renderQueue(),e.queue.current.item===t&&e.gui.newCurrentItem(t),{valid:!0}}catch(e){return console.error(e),{valid:!1,reason:"An error occurred while fetching page history."}}}},"open-user-page":{title:"Open user page",icon:"fas fa-circle-user",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`User:${t.user.name}`)),{valid:!0})},"open-user-talk":{title:"Open user talk page",icon:"fas fa-comment",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User talk page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`User talk:${t.user.name}`)),{valid:!0})},"open-user-contributions":{title:"Open user contributions",icon:"fas fa-list",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User contributions can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`Special:Contributions/${t.user.name}`)),{valid:!0})},"open-user-filter-log":{title:"Open user filter log",icon:"fas fa-filter",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User filter log can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`?title=Special:AbuseLog&wpSearchUser=${encodeURIComponent(t.user.name)}`,!0)),{valid:!0})},"open-page":{title:"Open page",icon:"fas fa-file",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(t.page.title)),{valid:!0})},"open-page-talk":{title:"Open page talk",icon:"fas fa-comments",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page talk can only be opened when an item is selected."},script:(e,t,n)=>{const s=t.page.title.split(":");let i="Talk";s.length>1&&(i=s[0].toLowerCase().includes("talk")?s[0]:`${s[0]} talk`);const a=e.page(`${i}:${1===s.length?s[0]:s.slice(1).join(":")}`);return e.open(a),{valid:!0}}},"open-page-history":{title:"Open page history",icon:"fas fa-clock-rotate-left",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page history can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`Special:PageHistory/${t.page.title}`)),{valid:!0})},"open-revision":{title:"Open revision",icon:"fas fa-file-lines",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Revision can only be opened for edits."}:{valid:!0}},script:(e,t,n)=>(e.open(e.page(`Special:Permalink/${t.id}`)),{valid:!0})},"open-diff":{title:"Open diff",icon:"fas fa-code-compare",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Diff can only be opened for edits."}:{valid:!0}},script:(e,t,n)=>(e.open(e.page(`Special:Diff/${t.id}`)),{valid:!0})},"copy-link":{title:"Copy link",icon:"fas fa-link",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Link can only be copied when an item is selected."},script:(e,t,n)=>{if("edit"===t.group)navigator.clipboard.writeText(e.page(`?diff=${t.id}`,!0));else if("logevent"===t.group)navigator.clipboard.writeText(e.page(`?title=Special:Log&logid=${t.id}`,!0));else{if("abuselog"!==t.group)return e.gui.dialog.toast("Cannot copy link","Please report this issue to a developer, including the error code below:<br><br><code>UNKNOWN_ITEM_GROUP_FOR_LINK_COPY</code>","error",3e3),{valid:!1};t.revid?navigator.clipboard.writeText(e.page(`?diff=${t.revid}`,!0)):navigator.clipboard.writeText(e.page(`?title=Special:AbuseLog/${t.id}`,!0))}return e.gui.dialog.toast("Link copied","The link has been copied to your clipboard.","success",3e3),{valid:!0}}},"open-revert-menu":{title:"Open revert menu",icon:"fas fa-undo",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Revert menu is only available for edits."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector('[data-menu="revert"]'),i=document.querySelector("#revert-menu");if(i.innerHTML="",e.gui.createWarnMenu("reverts",i,t),s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-warn-menu":{title:"Open warn menu",icon:"fas fa-exclamation-triangle",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Warning menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="warn"]'),i=document.querySelector("#warn-menu");if(i.innerHTML="",e.gui.createWarnMenu("warnings",i,t),s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-user-menu":{title:"Open user menu",icon:"fas fa-flag",valid:(e,t,n)=>e.queue.current.item?{valid:!0}:{valid:!1,reason:"User menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="user"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-page-menu":{title:"Open page menu",icon:"fas fa-flag",valid:(e,t,n)=>e.queue.current.item?{valid:!0}:{valid:!1,reason:"Page menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="page"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-edit-menu":{title:"Open edit menu",icon:"fas fa-flag",valid:(e,t,n)=>{let i=e.queue.current.item.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit menu is only available for edits."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector('[data-menu="edit"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"switch-to-recent-queue":{title:"Switch to recent changes queue",icon:"fas fa-stopwatch",valid:(e,t,n)=>e.store.settings.queue.recent.enabled?{valid:!0}:{valid:!1,reason:"Recent changes queue is not enabled."},script:(e,t,n)=>(e.queue.switch("recent"),{valid:!0})},"switch-to-pending-queue":{title:"Switch to pending changes queue",icon:"fas fa-flag",valid:(e,t,n)=>e.store.settings.queue.pending.enabled?e.rights.review?e.api.hasPendingChanges?{valid:!0}:{valid:!1,reason:"The pending changes extension is not enabled on this wiki."}:{valid:!1,reason:"You do not have permission to review pending changes."}:{valid:!1,reason:"Pending changes queue is not enabled."},script:(e,t,n)=>(e.queue.switch("pending"),{valid:!0})},"switch-to-watchlist-queue":{title:"Switch to watchlist queue",icon:"fas fa-book-bookmark",valid:(e,t,n)=>e.store.settings.queue.watchlist.enabled?{valid:!0}:{valid:!1,reason:"Watchlist queue is not enabled."},script:(e,t,n)=>(e.queue.switch("watchlist"),{valid:!0})},"switch-to-users-queue":{title:"Switch to user creation logs queue",icon:"fas fa-user-plus",valid:(e,t,n)=>e.store.settings.queue.users.enabled?{valid:!0}:{valid:!1,reason:"User creation logs queue is not enabled."},script:(e,t,n)=>(e.queue.switch("users"),{valid:!0})},"switch-to-abuselog-queue":{title:"Switch to abuse log queue",icon:"fas fa-filter-circle-xmark",valid:(e,t,n)=>e.store.settings.queue.abuselog.enabled?{valid:!0}:{valid:!1,reason:"Abuse log queue is not enabled."},script:(e,t,n)=>(e.queue.switch("abuselog"),{valid:!0})},"toggle-zen-mode":{title:"Toggle zen mode",icon:"fas fa-spa",script:(e,t,n)=>{var s;return e.store.settings.zen.enabled=!e.store.settings.zen.enabled,null===(s=document.querySelector("#zen-mode-enable"))||void 0===s||s.classList.toggle("active",e.store.settings.zen.enabled),e.gui.updateZenMode(),{valid:!0}}},"toggle-consecutive-edits":{title:"Toggle consecutive edits",icon:"fas fa-users",valid:(e,t,n)=>{const s=e.queue.current.type;return"recent"!==s&&"watchlist"!==s?{valid:!1,reason:"Consecutive edits can only be viewed in the recent changes or watchlist queues."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector("#consecutive-edits-tab");return s.classList.contains("hidden")||(s.classList.contains("selected")?document.querySelector("latest-edits-tab").click():s.click()),{valid:!0}}}}},8921(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.EventManager=void 0;var s=n(985),i=n(870),a=n(5564);t.EventManager=class{constructor(e){this.ws=e,this.events=s.events,this.conditions=i.conditions}button(e,t){const n=this.ws;e.addEventListener("click",e=>(e=>{n.gui.selectedMenu=null;const s=n.queue.current.item,i={};for(const o of(null===(a=(r=n.gui.events.events[t]).parameters)||void 0===a?void 0:a.call(r,n,s))||[]){var a,r;"external"===o.id&&(i[o.id]=(null==e?void 0:e.altKey)||!1)}n.execute({actions:[{name:t,params:i}]})})(e))}submenu(e,t){var n,s;const i=this.events[t];e.dataset.eventName=t;const r=this.ws.queue.current,o=`${r.type}:${null===(n=r.item)||void 0===n?void 0:n.id}`,l={};if(e.dataset.eventId===o)for(const t of(null===(d=i.parameters)||void 0===d?void 0:d.call(i,this.ws,this.ws.queue.current.item))||[]){var d;const n=e.querySelector(`[data-paramid="${t.id}"]`);l[t.id]="checkbox"===n.type?n.checked:n.value}else e.dataset.eventId=o;e.innerHTML="";const c=document.createElement("div");c.classList.add("bottom-subcontent-title"),c.textContent=i.title,e.appendChild(c);const u=new Map,p={},g=(0,a.sortDependencies)((null===(s=i.parameters)||void 0===s?void 0:s.call(i,this.ws,this.ws.queue.current.item))||[]);for(const t of g){const n=document.createElement("div");n.classList.add("bottom-subcontent-input-title"),n.textContent=t.title,e.appendChild(n);const s={};for(const e of null!==(h=t.dependencies)&&void 0!==h?h:[]){var h;s[e]=p[e]}const i="function"==typeof t.default?t.default(s):t.default;let a=null;switch(t.type){case"choice":{const n=document.createElement("select");n.dataset.paramid=t.id,e.appendChild(n);const r="function"==typeof t.options?t.options(s):t.options;for(const e of null!=r?r:[]){const t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),a=()=>{const e={};for(const n of null!==(s=t.dependencies)&&void 0!==s?s:[]){var s;e[n]=p[n]}const i=n.value,a="function"==typeof t.options?t.options(e):t.options;n.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}if(a.includes(i))n.value=i;else{const s="function"==typeof t.default?t.default(e):t.default;n.value=s,p[t.id]=s}},n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}break;case"text":{const n=document.createElement("input");n.type="text",n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}break;case"boolean":{const n=document.createElement("input");n.type="checkbox",n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.checked=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.checked=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.checked;for(const e of u.get(t.id)||[])e()})}break;case"duration":{const n=document.createElement("duration-input");n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}}if("function"==typeof a)for(const e of null!==(m=t.dependencies)&&void 0!==m?m:[]){var m;u.has(e)||u.set(e,[]),u.get(e).push(a)}}const v=document.createElement("button");v.classList.add("bottom-subcontent-button"),v.textContent="Submit",e.appendChild(v),v.addEventListener("click",()=>{const n={};for(const t of g){const s=e.querySelector(`[data-paramid="${t.id}"]`);n[t.id]=s.value}this.ws.execute({actions:[{name:t,params:n}]}),this.ws.gui.closeMenus()})}}},372(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Queue=void 0;var s=n(2852),i=n(2595),a=n(6400);function r(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){return e.get(d(e,t))}function d(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var c=new WeakMap,u=new WeakSet;class p{static areSameGroup(e,t){return this.groups[e]===this.groups[t]}constructor(e){var t,n;r(t=this,n=u),n.add(t),function(e,t,n){r(e,t),t.set(e,n)}(this,c,Promise.resolve()),this.ws=e,this.queues=Object.fromEntries(["void",...p.types].map(t=>[t,{type:t,item:null,previous:null,queue:[],hold:[],repeats:{},history:new i.Stack(100),memory:new s.Memory({size:1e3}),last:{timestamp:e.util.utcString(new Date),id:0}}])),this.cache={simple:new s.Memory({size:1e3}),full:new s.Memory({size:250})},this.current=this.queues[p.types[0]],this.pending=new Map,this.watchlist=new s.Memory({size:1e3}),this.talks=new s.Memory({size:500}),this.warnings=new s.Memory({size:1e3,timeout:864e5}),this.noWelcome=new s.Memory({timeout:36e5}),this.histories=new s.Memory({size:1e3}),this.contributions=new s.Memory({size:1e3}),this.blocks=new s.Memory({size:1e3}),this.blocked=new s.Memory({size:1e4}),this.playedSound={mention:new s.Memory({timeout:6e4})},this.bypass=new s.Memory({timeout:36e5,size:1e4}),this.backoff=2e3}switch(e){var t;this.current.type!==e&&("pending"===this.current.type&&(this.queues.pending.queue=this.queues.pending.queue.filter(e=>this.pending.has(e.id))),document.querySelector("#clear-queue").classList.toggle("hidden","pending"===e),this.current=this.queues[e],this.current.queue.some(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)})||(this.current.item=this.current.queue[0]||null),this.ws.gui.renderQueue(),this.ws.gui.newCurrentItem(this.current.item),document.querySelectorAll("#queue-tabs > .queue-tab.selected").forEach(e=>e.classList.remove("selected")),null===(t=document.querySelector(`#queue-tab-${e}`))||void 0===t||t.classList.add("selected"))}async fetch(){try{const i=this.ws.store.settings.queue;if(i.pending.enabled&&this.ws.rights.review){const e=(await this.ws.api.feeds(null,{ns:"*",full:!0})).pending;this.pending.clear(),Object.values(e).forEach(e=>this.pending.set(e.revid,e)),await this.outdated("pending")}const a=await this.ws.api.feeds(i.recent.enabled?{ns:this.ws.store.settings.namespaces.join("|"),since:this.queues.recent.last.timestamp}:null,i.pending.enabled&&this.ws.rights.review?{ns:"*",full:!1}:null,i.users.enabled?{ns:"*",since:this.queues.users.last.timestamp}:null,i.watchlist.enabled?{ns:"*",since:this.queues.watchlist.last.timestamp}:null,i.abuselog.enabled?{ns:this.ws.store.settings.namespaces.join("|"),since:this.queues.abuselog.last.timestamp}:null),r=this.ws.store.whitelist;for(const i of p.types){var e;const o=this.queues[i].last.id;let l=null!==(e=a[i])&&void 0!==e?e:[];const d=l.reduce((e,t)=>Math.max(e,t.timestamp),0);switch(d&&(this.queues[i].last.timestamp=this.ws.util.utcString(new Date(d))),p.groups[i]){case"edit":{const e=e=>e.revid>o;l="recent"===i?l.filter(t=>e(t)&&!r.pages.has(t.title)):l.filter(e)}break;case"abuselog":l=l.filter(e=>e.id>o);break;case"logevent":l=l.filter(e=>e.logid>o)}l=l.concat(this.queues[i].hold),l.length>25?this.queues[i].hold=l.splice(25).reverse():this.queues[i].hold=[];let c=!1;switch(i){case"recent":{const e=new Set;for(const n of l)for(const s of this.queues[i].queue){var t;e.has(s)||s.id!==(null===(t=this.current.item)||void 0===t?void 0:t.id)&&n.title===s.page.title&&s.id<n.revid&&e.add(s)}for(const t of e){const e=this.queues[i].queue.indexOf(t);e>-1&&(this.queues[i].queue.splice(e,1),this.ws.gui.removeQueueItem(i,t.id))}c=e.size>0}break;case"pending":for(const e of this.queues[i].queue){var n;if((null===(n=this.current.item)||void 0===n?void 0:n.id)!==e.id&&!this.pending.has(e.id)){const t=this.queues[i].queue.indexOf(e);t>-1&&(this.queues[i].queue.splice(t,1),this.ws.gui.removeQueueItem(i,e.id),c=!0)}}break;case"users":l=l.filter(e=>!e.temp);break;case"watchlist":{const e=new Set;for(const t of l)for(const n of this.queues[i].queue){var s;e.has(n)||n.id!==(null===(s=this.current.item)||void 0===s?void 0:s.id)&&(t.title===n.page.title&&n.id<t.revid?e.add(n):n.page.watched||e.add(n))}if(0===l.length)for(const t of this.queues[i].queue)t.page.watched||e.add(t);for(const t of e){const e=this.queues[i].queue.indexOf(t);e>-1&&(this.queues[i].queue.splice(e,1),this.ws.gui.removeQueueItem(i,t.id))}c=e.size>0}}if(0!==l.length)switch(p.groups[i]){case"edit":{this.queues[i].last.id=l.reduce((e,t)=>Math.max(e,t.revid),0);const e=this.ws.store.highlight,t=t=>{var n;return e.users.has(t.user)||e.pages.has(t.title)||(null===(n=t.tags)||void 0===n?void 0:n.some(t=>e.tags.has(t)))};l=l.filter(e=>{var n;return!r.users.has(e.user)&&!(null!==(n=e.tags)&&void 0!==n&&n.some(e=>r.tags.has(e)))&&(!this.bypass.has(e.user)||t(e))});const n={};let[s,a]=await Promise.allSettled(["recent"===i?this.ws.api.getEditCounts(l.map(e=>e.user).filter(e=>!this.bypass.has(e))):Promise.resolve([]),this.ws.api.getORES(l.filter(e=>{var t;if(null===(t=e.oresscores)||void 0===t||!t.length)return!0;n[e.revid]=e.oresscores},this.ws.store.settings.queue.ores_bias).map(e=>e.revid))]);"rejected"===s.status&&console.error("Edit counts failed:",s.reason),s="fulfilled"===s.status?s.value:{},"rejected"===a.status&&console.error("ORES failed:",a.reason),a="fulfilled"===a.status?a.value:{};for(const[e,t]of Object.entries(await this.ws.api.extractORES(n,this.ws.store.settings.queue.ores_bias)))a[e]=t;const o=this.queues[i].repeats,d=[];if("recent"===i){const e=this.ws.store.settings.queue.min_ores,n=this.ws.store.settings.queue.max_edits;l.forEach(r=>{var l,c;if(isNaN(a[r.revid])&&(o[r.revid]||0)<3)return o[r.revid]=(o[r.revid]||0)+1,this.queues[i].hold.push(r);delete o[r.revid];const u=null!==(l=null!==(c=s[r.user])&&void 0!==c?c:this.bypass.get(r.user))&&void 0!==l?l:0;u>n?(this.bypass.set(r.user,u),t(r)&&d.push(r)):((a[r.revid]||0)>=e||t(r))&&d.push(r)})}else l.forEach(e=>{if(isNaN(a[e.revid])&&(o[e.revid]||0)<3)return o[e.revid]=(o[e.revid]||0)+1,this.queues[i].hold.push(e);delete o[e.revid],d.push(e)});await this.add(i,d)}break;case"logevent":{let e=0;const t=new Set,n=[];l.forEach(s=>{t.has(s.logid)||(t.add(s.logid),s.logid>e&&(e=s.logid),n.push(s))}),this.queues[i].last.id=e,await this.add(i,n)}break;case"abuselog":{const e=l.filter(e=>null===e.editcount);let t={};e.length>0&&(t=await this.ws.api.getEditCounts(e.map(e=>e.user)));const n=this.ws.store.settings.queue.max_edits;let s=0;const a=[];l.forEach(e=>{var i;((null!==(i=e.editcount)&&void 0!==i?i:t[e.user])||0)>n||(e.id>s&&(s=e.id),a.push(e))}),this.queues[i].last.id=s,await this.add(i,a)}}else c&&this.ws.gui.renderQueue(this.queues[i].queue,this.current.edit,i)}await this.outdated(),this.backoff=p.refresh}catch(e){console.error(e),this.backoff=Math.min(2*this.backoff,12e4)}setTimeout(()=>this.fetch(),this.backoff)}async outdated(){{const e=[];for(const t of this.queues.pending.queue)t!==this.current.item&&(this.pending.has(t.id)||e.push(t));if(e.length>0)for(const t of e){const e=this.queues.pending.queue.indexOf(t);e>-1&&(this.queues.pending.queue.splice(e,1),this.ws.gui.removeQueueItem("pending",t.id))}}const e=new Set,t=["recent","watchlist","abuselog"];for(const n of t)this.queues[n].queue.forEach(t=>{("abuselog"!==n||t.revid)&&e.add(t.page.title)});const n=await this.ws.api.getLatestIds([...e]);for(const e of t){const t=[];for(const s of this.queues[e].queue){let i=s.id;if("abuselog"===e){if(!s.revid)continue;i=s.revid}const a=n[s.page.title];a&&a>i&&t.push([s.id,i])}if(t.length>0)for(const[n,i]of t){var s;const t="abuselog"===e?"revid":"id";if(i===(null===(s=this.queues[e].item)||void 0===s?void 0:s[t]))continue;const a=this.queues[e].queue.findIndex(e=>e[t]===i);a>-1&&(this.queues[e].queue.splice(a,1),this.ws.gui.removeQueueItem(e,n))}}this.ws.gui.renderQueue()}async add(e,t){const n={edit:"revid",logevent:"logid",abuselog:"id"}[p.groups[e]];(t=t.filter(t=>!this.queues[e].memory.has(t[n]))).forEach(t=>this.queues[e].memory.add(t[n]));const s=t.length;if(0===s)return;const i={ores:!1,mention:!1},a=await this.generate(e,t,!1);switch(p.groups[e]){case"edit":{const n=this.ws.store.settings.audio.ores_alert.threshold;for(let r=0;r<s;r++){t[r];const s=a[r];this.queues[e].queue.push(s),"recent"===e&&s.ores>=n&&(i.ores=!0),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}}break;case"logevent":for(let n=0;n<s;n++){t[n];const s=a[n];this.queues[e].queue.push(s),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}break;case"abuselog":for(let n=0;n<s;n++){t[n];const s=a[n];this.queues[e].queue.push(s),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}}this.sort(e),i.ores&&this.ws.store.settings.audio.ores_alert.enabled&&this.ws.audio.playSound(["queue","ores"]),i.mention&&this.ws.store.settings.username_highlighting.enabled&&this.ws.audio.playSound(["queue","mention"]),this.ws.gui.renderQueue(this.queues[e].queue,this.queues[e].item,e)}sort(e){var t;let n=-1;this.queues[e].item&&(n=this.queues[e].queue.findIndex(t=>t===this.queues[e].item));let s=this.queues[e].queue;n>=0&&(s=s.slice(0,n).concat(s.slice(n+1)));const i=this.ws.store.highlight,a=this.ws.store.settings.username_highlighting.enabled;switch(p.groups[e]){case"edit":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return-1;if(t.history)return 1;let n=e.ores;a&&e.mentions.has&&(n+=200),i.users.has(e.user.name)&&(n+=100),i.pages.has(e.page.title)&&(n+=75),n+=50*e.tags.filter(e=>i.tags.has(e)).length;let s=t.ores;return a&&t.mentions.has&&(s+=200),i.users.has(t.user.name)&&(s+=100),i.pages.has(t.page.title)&&(s+=75),s+=50*t.tags.filter(e=>i.tags.has(e)).length,n===s?t.id-e.id:s-n});break;case"logevent":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return 1;if(t.history)return-1;let n=100*(e.user.profanity.clamped||0);a&&e.mentions.has&&(n+=200);let s=100*(t.user.profanity.clamped||0);return a&&t.mentions.has&&(s+=200),n===s?t.id-e.id:s-n});break;case"abuselog":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return 1;if(t.history)return-1;let n=0;i.users.has(e.user.name)&&(n+=100),i.pages.has(e.page.title)&&(n+=75),a&&e.mentions.has&&(n+=200);let s=0;return i.users.has(t.user.name)&&(s+=100),i.pages.has(t.page.title)&&(s+=75),a&&t.mentions.has&&(s+=200),n===s?t.id-e.id:s-n})}const r=new Set(null!==(t=this.queues[e].item)&&void 0!==t&&t.id?[this.queues[e].item.id]:[]);s=s.filter(e=>!r.has(e.id)&&(r.add(e.id),!0)),n>=0&&s.splice(n,0,this.queues[e].item),this.queues[e].queue=[...s.slice(0,this.ws.store.settings.queue.max_size)],this.queues[e].item||(this.queues[e].item=this.queues[e].queue[0])}async generate(e,t,n,s={}){var i;if(0===t.length)return[];const r=null!==(i=null==s?void 0:s.bypass)&&void 0!==i&&i,o=this.ws,l=o.api.username,d=[];switch(p.groups[e]){case"edit":{t=(t=t.filter(e=>{const t=(e=>{if(n){if(this.cache.simple.has(e))return this.cache.simple.get(e);if(this.cache.full.has(e))return this.cache.full.get(e)}else if(this.cache.full.has(e))return this.cache.full.get(e);return null})(e.revid);var s;return!t||(e.pending&&!t.pending&&(t.pending=e.pending),null!==(s=void d.push(t))&&void 0!==s&&s)})).map(e=>{var t;let n=null;return e.pending&&(n=null===(t=this.pending.get(e.revid))||void 0===t?void 0:t.prior),null!=n||(n=e.old_revid||e.parentid),{item:e,prior:n}});const s=await o.api.parseEdits(t,n,this.ws.store.settings.queue.ores_bias,r);for(const t of s){var c;const{item:s,prior:i,data:a}=t,r={comment:!1,diff:!1};if(l&&a.edit.diff){const e=document.createElement("div");e.innerHTML=a.edit.diff,e.textContent&&(r.diff=o.util.match(l,e.textContent))}this.watchlist.set(s.title,a.page.watched),this.histories.set(s.title,a.page.history),this.contributions.set(s.user,a.user.contributions),this.blocks.set(s.user,a.user.blocks),this.blocked.set(s.user,a.user.blocked);const u=["0","1","2","3","4","4im"],g=this.getWarningLevel(a.user.talk||"");u.indexOf(g)>u.indexOf(this.warnings.get(s.user)||"0")&&this.warnings.set(s.user,g);const h={page:{namespace:s.ns,title:s.title,get history(){var e;return null!==(e=o.queue.histories.get(s.title))&&void 0!==e?e:a.page.history},get watched(){var e;return null!==(e=o.queue.watchlist.get(s.title))&&void 0!==e?e:a.page.watched},metadata:a.page.metadata,categories:a.page.categories,protection:a.page.protection},user:{name:s.user,ip:o.util.isIPAddress(s.user),temp:o.util.isTempAccount(s.user),anon:o.util.isIPAddress(s.user)||o.util.isTempAccount(s.user),edits:Math.max(a.user.edits,(null===(c=a.user.contributions)||void 0===c?void 0:c.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(s.user))&&void 0!==e?e:a.user.contributions},warning:this.getWarningLevel(a.user.talk||""),warnings:this.getWarningHistory(a.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(s.user))&&void 0!==e?e:a.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(s.user))&&void 0!==e?e:a.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(s.user))&&void 0!==e?e:a.user.talk}},mentions:r,AI:{edit:null,username:null},id:s.revid,prior:i,timestamp:s.timestamp,comment:s.parsedcomment,minor:s.minor||!1,diff:a.edit.diff,sizediff:("sizediff"in s?s.sizediff:s.newlen-s.oldlen)||0,ores:a.edit.ores,tags:s.tags||[],reverts:a.page.reverts,consecutive:a.page.consecutive,propagating:!1,reviewed:!1,history:!1,pending:s.pending||!1,group:p.groups[e],type:e,simple:n,origin:s};!n&&o.AI&&(o.store.settings.AI.edit_analysis.enabled&&o.AI.analyze.edit(h).then(e=>h.AI.edit=e).catch(e=>h.AI.edit={error:e.message}).finally(()=>{var e;h.id===(null===(e=this.current.item)||void 0===e?void 0:e.id)&&o.gui.updateAIAnalysisDisplay(h.AI.edit)}),h.user.anon||o.store.whitelist.users.has(h.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(h).then(e=>{h.AI.username=e,e.flag&&this.promptUAA(h,e)}).catch(e=>h.AI.username={error:e.message})),d.push(h),n?this.cache.simple.set(s.revid,h):(this.cache.full.set(s.revid,h),this.cache.simple.has(s.revid)&&this.cache.simple.delete(s.revid))}}break;case"logevent":{const s=await o.api.parseUsers(t.map(e=>e.title.replace(/^(User|User talk):/,"")),n,r),i=await o.api.parseUsers(t.map(e=>e.user),n,r);for(let r=0;r<t.length;r++){var u,g;const c=t[r],h=s[r],m=i[r],v=c.title.replace(/^(User|User talk):/,""),f={username:!1,comment:!1};l&&v&&(f.username=o.util.match(l,v)),this.contributions.set(v,h.user.contributions),this.contributions.set(c.user,m.user.contributions),this.blocks.set(v,h.user.blocks),this.blocks.set(c.user,m.user.blocks),this.blocked.set(v,h.user.blocked),this.blocked.set(c.user,m.user.blocked);const b=["0","1","2","3","4","4im"],w=this.getWarningLevel(h.user.talk||"");b.indexOf(w)>b.indexOf(this.warnings.get(v)||"0")&&this.warnings.set(v,w);const y=this.getWarningLevel(m.user.talk||"");b.indexOf(y)>b.indexOf(this.warnings.get(c.user)||"0")&&this.warnings.set(c.user,y);const x=a.profanity.evaluate(v),k={page:{namespace:c.ns,title:c.title,history:[],get watched(){return!1},metadata:[],categories:[],protection:{}},user:{name:v,ip:o.util.isIPAddress(v),temp:o.util.isTempAccount(v),anon:o.util.isIPAddress(v)||o.util.isTempAccount(v),edits:Math.max(h.user.edits,(null===(u=h.user.contributions)||void 0===u?void 0:u.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(v))&&void 0!==e?e:h.user.contributions},warning:this.getWarningLevel(h.user.talk||""),warnings:this.getWarningHistory(h.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(v))&&void 0!==e?e:h.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(v))&&void 0!==e?e:h.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(v))&&void 0!==e?e:h.user.talk},profanity:x},performer:{name:c.user,ip:o.util.isIPAddress(c.user),temp:o.util.isTempAccount(c.user),anon:o.util.isIPAddress(c.user)||o.util.isTempAccount(c.user),edits:Math.max(m.user.edits,(null===(g=m.user.contributions)||void 0===g?void 0:g.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(c.user))&&void 0!==e?e:m.user.contributions},warning:this.getWarningLevel(m.user.talk||""),warnings:this.getWarningHistory(m.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(c.user))&&void 0!==e?e:m.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(c.user))&&void 0!==e?e:m.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(c.user))&&void 0!==e?e:m.user.talk}},mentions:f,AI:{username:null},id:c.logid,timestamp:c.timestamp,comment:c.parsedcomment,ores:x.clamped||0,filters:x.matches.map(e=>({filter:e.name,id:e.match})),propagating:!1,reviewed:!1,history:!1,group:p.groups[e],type:e,simple:n,origin:c};!n&&o.AI&&(k.user.anon||o.store.whitelist.users.has(k.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(k).then(e=>{k.AI.username=e,e.flag&&this.promptUAA(k,e)}).catch(e=>k.AI.username={error:e.message})),d.push(k)}}break;case"abuselog":{const s=await o.api.parseAbuselogs(t,n,r);for(const t of s){var h,m;const{item:s,data:i}=t,a={comment:!1,diff:!1};if(l&&i.edit.diff){const e=document.createElement("div");e.innerHTML=i.edit.diff,e.textContent&&(a.diff=o.util.match(l,e.textContent))}this.watchlist.set(s.title,i.page.watched),this.histories.set(s.title,i.page.history),this.contributions.set(s.user,i.user.contributions),this.blocks.set(s.user,i.user.blocks),this.blocked.set(s.user,i.user.blocked);const r=["0","1","2","3","4","4im"],c=this.getWarningLevel(i.user.talk||"");r.indexOf(c)>r.indexOf(this.warnings.get(s.user)||"0")&&this.warnings.set(s.user,c);const u=["disallow","warn","showcaptcha","tag","none"],g=u.length;let v=g-1;for(let e=0;e<g;e++)if(s.result.has(u[e])){v=e;break}const f={page:{namespace:s.ns,title:s.title,get history(){var e;return null!==(e=o.queue.histories.get(s.title))&&void 0!==e?e:i.page.history},get watched(){var e;return null!==(e=o.queue.watchlist.get(s.title))&&void 0!==e?e:i.page.watched},metadata:i.page.metadata,categories:i.page.categories,protection:i.page.protection},user:{name:s.user,ip:o.util.isIPAddress(s.user),temp:o.util.isTempAccount(s.user),anon:o.util.isIPAddress(s.user)||o.util.isTempAccount(s.user),edits:Math.max(i.user.edits,(null===(h=i.user.contributions)||void 0===h?void 0:h.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(s.user))&&void 0!==e?e:i.user.contributions},warning:this.getWarningLevel(i.user.talk||""),warnings:this.getWarningHistory(i.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(s.user))&&void 0!==e?e:i.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(s.user))&&void 0!==e?e:i.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(s.user))&&void 0!==e?e:i.user.talk}},mentions:a,AI:{edit:null,username:null},id:s.id,revid:s.revid,timestamp:s.timestamp,comment:i.parsedcomment,minor:!1,diff:i.edit.diff,sizediff:null===(m=s.diff)||void 0===m?void 0:m.size,ores:+(1-v/(g-1)).toFixed(2),filters:s.entries.map(e=>({id:(null==e?void 0:e.filter_id)||"-1",filter:null==e?void 0:e.filter}))||[],reverts:i.page.reverts,propagating:!1,reviewed:!1,history:!1,group:p.groups[e],type:e,simple:n,origin:s};!n&&o.AI&&(o.store.settings.AI.edit_analysis.enabled&&i.edit.diff&&o.AI.analyze.edit(f).then(e=>f.AI.edit=e).catch(e=>f.AI.edit={error:e.message}).finally(()=>{var e;f.id===(null===(e=this.current.item)||void 0===e?void 0:e.id)&&o.gui.updateAIAnalysisDisplay(f.AI.edit)}),f.user.anon||o.store.whitelist.users.has(f.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(f).then(e=>{f.AI.username=e,e.flag&&this.promptUAA(f,e)}).catch(e=>f.AI.username={error:e.message})),d.push(f)}}}return d.forEach(e=>{if(e.comment){const t=(new DOMParser).parseFromString(e.comment,"text/html").body;t.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,n]=e.trim().split(/\s+/,2),s=new URL(t,`https://${this.ws.server}`).href;return n?`${s} ${n}`:s}).join(", ");e.setAttribute("srcset",t)}),e.comment=t.innerHTML;const n=(t.textContent||"").trim();e.has_comment=Boolean(n),!1===e.mentions.comment&&(e.mentions.comment=o.util.match(l,n)),e.mentions&&(e.mentions.has=Object.values(e.mentions).some(e=>e))}else e.has_comment=!1}),d}previous(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});if("pending"===this.current.type)return this.current.item=this.current.queue[Math.max(e-1,0)],this.ws.gui.renderQueue();if(e<=0){if(0===this.current.history.length)return;return this.current.queue.unshift(this.current.history.pop()),this.current.item=this.current.queue[0],this.ws.gui.renderQueue()}this.current.item=this.current.queue[e-1],this.ws.gui.renderQueue()}next(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});if(-1===e)return this.current.item=this.current.queue[0],this.ws.gui.renderQueue();if("pending"===this.current.type)return this.current.item=this.current.queue[Math.min(e+1,this.current.queue.length-1)],this.ws.gui.renderQueue();const t=this.current.item,n=p.groups[t.type];if(!t.reviewed&&("edit"===n||"abuselog"===n&&t.revid)){"watchlist"===t.type&&this.ws.api.markWatchlistSeen(t.page.title,t.id);const e="abuselog"===t.type?t.revid:t.id;if(["recent","watchlist","abuselog"].filter(e=>e!==t.type).forEach(t=>{this.queues[t].queue="abuselog"===t?this.queues[t].queue.filter(n=>n.revid!==e||(this.queues[t].history.push({...n,history:performance.now()}),!1)):this.queues[t].queue.filter(n=>n.id!==e||(this.queues[t].history.push({...n,history:performance.now()}),"watchlist"===t&&this.ws.api.markWatchlistSeen(n.page.title,n.id),!1))}),"abuselog"!==n){let e=this.queues.abuselog.queue.filter(e=>t.user.name===e.user.name&&t.page.title===e.page.title&&Math.abs(new Date(t.timestamp).getTime()-new Date(e.timestamp).getTime())<1e4);e.length>0&&Promise.allSettled(e.map(async e=>{let t=e.revid;return t||(t=await this.ws.api.getAbuseLogRevid(e.id)),t?(e.revid=t,{id:e.id,revid:t}):null})).then(e=>{const t=e.map(e=>"fulfilled"===e.status?e.value:null).filter(e=>e);this.queues.abuselog.queue=this.queues.abuselog.queue.filter(e=>!t.some(t=>t.revid===e.revid)),"abuselog"===this.current.type&&(t.forEach(e=>this.ws.gui.removeQueueItem("abuselog",e.id)),this.ws.gui.renderQueue(this.queues.abuselog.queue,this.queues.abuselog.item,"abuselog"))}).catch(()=>{})}}t.reviewed=!0,t&&this.ws.AI&&this.ws.AI.cancel.edit(t.id),this.current.queue.splice(e,1),this.ws.gui.removeQueueItem(this.current.type,t.id),0===this.current.queue.length?this.current.item=null:e<this.current.queue.length?this.current.item=this.current.queue[e]:this.current.item=this.current.queue[this.current.queue.length-1],t&&"edit"===p.groups[this.current.type]&&this.promptWelcome(t),this.current.history.push({...t,history:performance.now()}),this.ws.gui.renderQueue()}canGoPrevious(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});return-1===e?this.current.history.length>0:"pending"===this.current.type?e>0:0!==e||this.current.history.length>0}canGoNext(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});return-1===e?Boolean(this.current.queue[0]):"pending"!==this.current.type||e<this.current.queue.length-1}clear(e){"pending"!==e&&(this.queues[e].item=null,this.queues[e].queue=[],this.current.type===e&&(this.ws.gui.newCurrentItem(null),this.ws.gui.clearQueueItems()))}async promptWelcome(e){if(!this.ws.store.settings.auto_welcome.enabled&&e.user.anon&&0!==(e.user.edits||0)&&void 0!==e.user.talk&&!this.noWelcome.has(e.user.name))try{var t;const n=`User talk:${e.user.name}`,s=await this.ws.api.pagesExist([n]);if(void 0!==s[n])return null!==(t=void this.talks.set(e.user.name,s[n]))&&void 0!==t?t:s[n];await this.ws.gui.settings.waitForClose();const i=await this.ws.gui.dialog.confirm("Auto-Welcome User",`Would you like to welcome <span class="confirmation-modal-username">${this.ws.util.escape(e.user.name)}</span>?<br><br>\n\t\t\t\t\t<span style="font-size: 0.9em; color: #888;">Editing: <strong>${this.ws.util.escape(e.page.title)}</strong></span>`,{username:e.user.name,hideUAA:!1});this.noWelcome.add(e.user.name),i&&this.ws.execute({actions:[{name:"welcome-user",params:{template:"Auto"}}]},void 0,void 0,e)}catch(e){console.error("Error during auto-welcome check:",e)}}promptUAA(e,t){var n,s,i;return n=c,s=this,i=l(c,this).then(()=>d(u,this,g).call(this,e,t)).catch(()=>{}),n.set(d(n,s),i),l(c,this)}async propagate(e,t){if(e.propagating)return await e.propagating;if(e.simple){let n;e.propagating=new Promise(e=>n=e);const[s]=await this.generate(e.type,[e.origin],!1,{bypass:t});s.history=e.history,Object.assign(e,s),n(),e.propagating=!1}else this.generate(e.type,[e.origin],!1,{bypass:t}).then(([t])=>{const n=e.revid;t.history=e.history,Object.assign(e,t),e.revid=n})}loadFromItem(e){const t=this.current.type;if(p.areSameGroup(t,"edit")&&("pending"!==t||"edit"!==e.type)){this.queues[t].queue=this.queues[t].queue.filter(t=>t.id!==e.id);const n=this.queues[t].queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});n>-1&&(this.queues[t].queue[n]=e)}this.queues[t].item=this.queues[t].queue.find(t=>t.id===e.id)||e,this.ws.gui.renderQueue()}async loadFromRevision(e,t){try{let n;if(this.ws.gui.updateDiffDisplay("loading"),this.cache.full.has(t))n=this.cache.full.get(t);else{let s;if(this.cache.simple.has(t)){const e=this.cache.simple.get(t);s={revid:e.id,parentid:e.prior,ns:e.page.namespace,title:e.page.title,user:e.user.name,timestamp:e.timestamp,parsedcomment:e.comment,tags:e.origin.tags,sizediff:e.sizediff,minor:e.minor}}else{const n=await this.ws.api.getRevision(e,t,!0);if(!n)throw new Error("Revision not found");s={revid:n.revid,parentid:n.parentid,ns:n.ns,title:e,user:n.user,timestamp:n.timestamp,parsedcomment:n.parsedcomment,tags:n.tags,size:n.size,oldlen:n.oldlen||0,newlen:n.size,minor:n.minor}}[n]=await this.generate("edit",[s],!1,{bypass:!0})}const s=this.current.type;if(p.areSameGroup(s,"edit")&&"pending"!==s&&"abuselog"!==s){this.queues[s].queue=this.queues[s].queue.filter(e=>e.id!==n.id);const e=this.queues[s].queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});e>-1&&(this.queues[s].queue[e]=n)}this.queues[s].item=n,this.ws.gui.renderQueue()}catch(e){console.error("Error loading from revision:",e),document.querySelector("#diff-container").innerHTML=`<div class="error">Failed to load revision: ${this.ws.util.escape(e.message)}</div>`}}getWarningLevel(e){const t=["0","1","2","3","4","4im"];let n="0";const s=this.ws.util.monthSectionName(),i=this.ws.util.getPageSections(e);for(const e of i)if(e.title===s){const s=e.content.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/g);if(null===s)break;const i=[...s.map(e=>{const t=e.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/);return t?t[1].toString():"0"}),n].map(e=>[e,t.indexOf(e)]);n=i.sort((e,t)=>t[1]-e[1])[0][0]}return n}getWarningHistory(e){const t=[],n=this.ws.util.monthSectionName(),s=this.ws.util.getPageSections(e);for(const e of s)if(e.title===n){const n=e.content.matchAll(/<!-- Template:([\w-]+?)(\d(?:i?m)?) -->([^]+?)(?=<!-- Template:|$)/g);for(let s of n){const n=s[1],i=s[2],a=s[3],r=a.match(/(\d{2}:\d{2}.*?\d{4} \(UTC\))/);let o=r?r[1]:null;if(o&&(o=o.replace(/<[^>]*>/g,"")),o){const[,e,t,n,s]=o.match(/(\d{2}:\d{2}), (\d{1,2}) ([A-Za-z]+) (\d{4})/),i=["January","February","March","April","May","June","July","August","September","October","November","December"].indexOf(n);o=new Date(Date.UTC(s,i,t,...e.split(":"))).toUTCString()}else o=null;let l=null;const d=a.match(/\[\[User(?:[ _]talk)?:([^\]|]+)/i);d&&(l=d[1].trim());const c=a.match(/\[\[([^\]]+?)\]\]/),u=c?c[1]:null;t.push({template:n,level:i,timestamp:o,username:l,article:u,section:e.title})}}return t}}async function g(e,t){if(e.user.anon)return;if(this.ws.store.whitelist.users.has(e.user.name))return;if(!t.issues||0===t.issues.length)return;if(!t.explanation)return;const n=t.issues.map(e=>`${e.severity} ${e.policy} violation`).join(", "),s=Math.round(100*t.confidence),i=e.user.name;await this.ws.gui.settings.waitForClose();if(await this.ws.gui.dialog.confirm("Report Username to UAA",`\n\t\t\t\tThe username <span class="confirmation-modal-username">${this.ws.util.escape(i)}</span> for ${n}.<br><br>\n\t\t\t\t<strong>AI Confidence:</strong> ${s}%<br>\n\t\t\t\t<strong>Reasoning:</strong> ${t.explanation}<br>\n\t\t\t`,i)){await this.ws.gui.settings.waitForClose();const t=await this.ws.gui.dialog.UAA(e.user.name);t&&this.ws.execute({actions:[{name:"report-user-to-uaa",params:{reason:t}}]},void 0,void 0,e)}}t.Queue=p,o(p,"refresh",1e3),o(p,"types",["recent","pending","watchlist","abuselog","users"]),o(p,"groups",{void:"void",recent:"edit",pending:"edit",watchlist:"edit",edit:"edit",abuselog:"abuselog",users:"logevent"})},7054(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.WikiShield=void 0;var s=n(3241),i=n(8169),a=n(2535),r=n(4674),o=n(6151),l=n(372),d=n(8469),c=n(8678),u=n(9501),p=n(9808);function g(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function h(e,t){return e.get(m(e,t))}function m(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var v,f,b,w=new WeakMap,y=new WeakSet;class x{constructor(e,t,n,o){var c,p;g(c=this,p=y),p.add(c),function(e,t,n){g(e,t),t.set(e,n)}(this,w,{ready:[]}),this.__DEV__=o,this.started=!1,this.server=e,this.storage=new u.StorageManager,this.defaultStorage=new u.StorageManager,this.defaultStorage.load(),this.util=new s.Utility(this),this.api=new a.API(this,e,t,n),this.notifications=new r.Notifications(this),this.rights={},this.groups={},this.api.account().then(async e=>{this.rights=e.rights.reduce((e,t)=>({...e,[t]:!0}),{}),this.groups=e.groups.reduce((e,t)=>({...e,[t]:!0}),{});{const e=this.rights.review&&this.api.hasPendingChanges;document.querySelector("#queue-tab-pending").classList.toggle("hidden",!e),e||"pending"!==this.queue.current.type||this.queue.switch("recent")}await m(y,this,_).call(this),this.cleanup(),setInterval(()=>this.cleanup(),1e4),m(y,this,k).call(this,"ready")}),this.gui=new d.GUI(this),this.queue=new l.Queue(this),this.audio=new i.AudioManager(this),this.time={load:null,save:null}}get store(){return this.storage.data}disable(e,t){electron.disable(e,t)}on(e,t,n={}){return h(w,this)[e]&&h(w,this)[e].push({callback:t,options:n}),this}async init(e=null){return this.gui.build(),await this.audio.init(),await m(y,this,_).call(this,e)}async noinit(e=null){var t;const n=await m(y,this,_).call(this,e);if(null===(t=this.AI)||void 0===t||t.cancel.all(),this.store.settings.AI.enabled)if("Ollama"===this.store.settings.AI.provider)this.AI=new c.AI.providers.Ollama(this,this.store.settings.AI.Ollama);else this.AI=null;else this.AI=null;{const e=this.store.UI.queue.width;document.body.querySelector("#queue").style.width=e,document.body.querySelector("#right-container").style.width=`calc(100% - ${e})`}{const e=this.store.UI.details.width;document.body.querySelector("#right-details").style.width=e,document.body.querySelector("#right-top").style.width=e,document.body.querySelector("#main-container").style.width=`calc(100% - ${e})`}return this.gui.settings.update(),n}async start(){this.gui.start(),this.update(),this.queue.fetch(),this.started=!0}async update(){const e=performance.now();try{await this.api.account().then(e=>{this.rights=e.rights.reduce((e,t)=>({...e,[t]:!0}),{}),this.groups=e.groups.reduce((e,t)=>({...e,[t]:!0}),{})}),await this.api.getGlobalUserInfo(this.api.username).then(e=>{var t;(t=this.rights).rollback||(t.rollback=e.rights.includes("rollback"))}),this.rights.rollback||"LuniZunie"===this.api.username||this.disable("Rollback required","Your account no longer has rollback rights, which are required to use WikiShield.");{const e=this.rights.review&&this.api.hasPendingChanges;document.querySelector("#queue-tab-pending").classList.toggle("hidden",!e),e||"pending"!==this.queue.current.type||this.queue.switch("recent")}this.backup()}catch(e){console.error("Update error:",e)}setTimeout(()=>this.update(),Math.max(0,2500-(performance.now()-e)))}cleanup(){const e=Date.now();let t=!1;for(const[,n]of Object.entries(this.store.highlight))for(const[s,i]of n.entries())e>=i[1]&&(n.delete(s),t=!0);for(const[,n]of Object.entries(this.store.whitelist))for(const[s,i]of n.entries())e>=i[1]&&(n.delete(s),t=!0);t&&this.queue.current.item&&this.gui&&this.gui.renderQueue(this.queue.current.queue,this.queue.current.item)}controller(e){var t,n,s;if(this.started){if(this.gui.dialog.dialogs.active)return this.gui.dialog.controller(e);if(this.gui.settings.active)return this.gui.settings.controller(e);if(!("INPUT"===(null===(t=e.target)||void 0===t?void 0:t.tagName)||"TEXTAREA"===(null===(n=e.target)||void 0===n?void 0:n.tagName)||null!==(s=e.target)&&void 0!==s&&s.isContentEditable)&&"keydown"===e.type){if(e.repeat&&!this.store.settings.repeat_control_scripts)return;const t=(0,p.buildShortcut)(e);for(const n of this.store.control_scripts)n.keys.every(e=>e===t)&&(e.preventDefault(),this.execute(n))}}}async execute(e,t=!0,n=null,s=null){const i=(e,t)=>!e.name||("if"===e.name?this.gui.events.conditions[e.condition.name].check(this,t,e.condition.params):"if not"===e.name&&!this.gui.events.conditions[e.condition.name].check(this,t,e.condition.params));if(null===n){null!=s||(s=this.queue.current.item||1);const t=[e];let a=0;for(;t.length>0;){const e=t[0];if(i(e,s)){if(!e.actions){t.splice(0,1);continue}t.push(...e.actions)}e.name&&"if"!==e.name&&"if not"!==e.name&&this.gui.events.events[e.name].progress&&a++,t.splice(0,1)}if(a>0){let e=0;const t=new o.ProgressBar;n=(n,s)=>{const i="Done"===n?1:e/a;t.set(n,i,s),e++}}else n=e=>{}}if(i(e,s))for(const i of e.actions){if(!("name"in i))continue;const e={...i.params};for(const t of(null===(a=this.gui.events.events[i.name])||void 0===a||null===(r=a.parameters)||void 0===r?void 0:r.call(a,this,s))||[]){var a,r;t.id&&!(t.id in e)&&"default"in t&&(e[t.id]=t.default)}if("if"===i.name||"if not"===i.name)t=await this.execute(i,t,n,s);else{const a=this.gui.events.events[i.name],r=()=>{t=!1,this.audio.playSound(["action","failed"]),a.progress&&n(a.progress,!0)};try{if(t||!a.continuity){var l,d;const t=null!==(l=null===(d=a.valid)||void 0===d?void 0:d.call(a,this,s,e))&&void 0!==l?l:{valid:!0};if(t.valid){a.progress&&(n(a.progress,!1),this.audio.playSound(["action","default"])),this.store.statistics.actions_executed.total++;const t=await a.script(this,s,e);var c;if(!1===t.valid)r(),"reason"in t&&this.gui.dialog.toast("Action failed",t.reason,"error");else this.store.statistics.actions_executed.successful++,null===(c=a.successful)||void 0===c||c.call(a,this,s,e)}else r(),"reason"in t&&this.gui.dialog.toast("Action skipped",t.reason,"error")}}catch(e){r(),this.gui.dialog.toast("Please report to developer",`An error occurred while executing action "${i.name}". Check the console for details.`,"error"),console.error(`Error executing action "${i.name}":`,e.message||String(e))}}}return e.name||n("Done",!t),t}async getDEFCON(){const e="User:EnterpriseyBot/defcon",t=(await this.api.getPagesContent([e]))[e],n=t.match(/level\s*=\s*(\d+)/),s=t.match(/info\s*=\s*([\d.]+)/);return{level:n?Number(n[1]).toLocaleString():null,info:s?Number(s[1]).toLocaleString():null}}export(){this.time.save=performance.now(),this.store.statistics.session_time+=this.time.save-this.time.load;const{string:e,logs:t}=this.storage.encode();return u.StorageManager.output(t),e}backup(){this.time.save=performance.now(),this.store.statistics.session_time+=this.time.save-this.time.load,this.time.load=this.time.save;const{string:e}=this.storage.encode();return electron.localStorage.set(`WikiShield:BackupStorage-${this.api.username}`,`${Date.now()};${e}`),!0}async save(){this.backup();const e=`${Date.now()};${this.export()}`,t=this.api.username;if(window.isFinite)electron.saveAccount(t,e);else try{const n=await this.api.postWithToken({action:"options",optionname:"userjs-wikishield-storage",optionvalue:e});"success"===(null==n?void 0:n.options)||console.error(`[WikiShield] Failed to save account data for ${t}:`,n)}catch(e){console.error(`[WikiShield] Failed to save account data for ${t}:`,e)}}async load(){try{var e,t;return null!==(e=null===(t=[electron.localStorage.get(`WikiShield:BackupStorage-${this.api.username}`),(await this.api.post({action:"query",meta:"userinfo",uiprop:"options",format:"json"})).query.userinfo.options["userjs-wikishield-storage"]].reduce((e,t)=>{var n;null!=t||(t="0;e30=");let s=0,i=t;return t.includes(";")&&([s,i]=t.split(";",2),s=parseInt(s,10)),s>0&&s>(null!==(n=null==e?void 0:e.timestamp)&&void 0!==n?n:0)?{timestamp:s,data:i}:e},null))||void 0===t?void 0:t.data)&&void 0!==e?e:"e30="}catch(e){var n;return null!==(n=void console.error("Failed to load storage from wiki:",e))&&void 0!==n?n:"e30="}}page(e,t,n=!0){return`https://${this.server}/${t?`w/index.php${e}`:`wiki/${n?encodeURIComponent(e):e}`}`}open(e,t){"force"===t?t=!1:t||(t=!this.store.settings.wikipedia_popups.enabled),t?electron.openExternal(e):electron.openInBrowser(e).then(e=>{e&&requestAnimationFrame(()=>{if(this.gui.dialog.popups.push(e),!document.getElementById("popup-blocker")){const e=document.createElement("div");e.id="popup-blocker",e.innerText="Please close the popup or click anywhere on this page to continue using WikiShield.",document.body.appendChild(e),this.gui.dialog.check()}})})}}function k(e){if(h(w,this)[e])for(const n of h(w,this)[e])try{n.callback()}catch(e){}finally{var t;!0===(null===(t=n.options)||void 0===t?void 0:t.once)&&(h(w,this)[e]=h(w,this)[e].filter(e=>e!==n))}return this}async function _(e=null){const t=this.storage.decode(null!=e?e:await this.load()).logs;var n,s,i;(this.time.load=performance.now(),this.store.settings.AI.enabled)?"Ollama"===this.store.settings.AI.provider?"function"==typeof(null===(n=c.AI.providers)||void 0===n?void 0:n.Ollama)?this.AI=new c.AI.providers.Ollama(this,this.store.settings.AI.Ollama):(console.error("AI.providers.Ollama is not available. Falling back to null."),this.AI=null):(null===(s=this.AI)||void 0===s||s.cancel.all(),this.AI=null):(null===(i=this.AI)||void 0===i||i.cancel.all(),this.AI=null);return t}t.WikiShield=x,v=x,f="config",b={version:"2.0.0",changelog:{version:"6",HTML:fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/CHANGELOG.html").then(e=>e.text()).catch(()=>"<em>Could not fetch changelog.</em>")},pages:{AIV:"Wikipedia:Administrator intervention against vandalism",UAA:"Wikipedia:Usernames for administrator attention",RFPP:"Wikipedia:Requests for page protection/Increase",SRG:"Steward requests/Global"},config:{refresh:{recent:2e3,pending:2e3,watchlist:2e3,users:2e3},historyCount:10}},(f=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(f))in v?Object.defineProperty(v,f,{value:b,enumerable:!0,configurable:!0,writable:!0}):v[f]=b},4018(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.namespaces=void 0;t.namespaces=[{name:"Main",id:0,analysis_description:{edit:"",username:""}},{name:"Talk",id:1,analysis_description:{edit:"",username:""}},{name:"User",id:2,analysis_description:{edit:"Flag content unrelated to Wikipedia, such as self-promotion. If the page looks like a Wikipedia article, check that it isn't an obvious hoax, and that it is a subpage. Do not follow strict standards for these pages.",username:"Check whether the username matches the base page title. Most often, a user page should only be edited by that user. Consider alternative accounts, like User:Example creating User:Example (alt)."}},{name:"User talk",id:3,analysis_description:{edit:"",username:""}},{name:"Project",id:4,analysis_description:{edit:"",username:""}},{name:"Project talk",id:5,analysis_description:{edit:"",username:""}},{name:"File",id:6,analysis_description:{edit:"",username:""}},{name:"File talk",id:7,analysis_description:{edit:"",username:""}},{name:"MediaWiki",id:8,analysis_description:{edit:"",username:""}},{name:"MediaWiki talk",id:9,analysis_description:{edit:"",username:""}},{name:"Template",id:10,analysis_description:{edit:"",username:""}},{name:"Template talk",id:11,analysis_description:{edit:"",username:""}},{name:"Help",id:12,analysis_description:{edit:"",username:""}},{name:"Help talk",id:13,analysis_description:{edit:"",username:""}},{name:"Category",id:14,analysis_description:{edit:"",username:""}},{name:"Category talk",id:15,analysis_description:{edit:"",username:""}},{name:"Portal",id:100,analysis_description:{edit:"",username:""}},{name:"Portal talk",id:101,analysis_description:{edit:"",username:""}},{name:"Draft",id:118,analysis_description:{edit:"",username:""}},{name:"Draft talk",id:119,analysis_description:{edit:"",username:""}},{name:"MOS",id:126,analysis_description:{edit:"",username:""}},{name:"MOS talk",id:127,analysis_description:{edit:"",username:""}},{name:"TimedText",id:710,analysis_description:{edit:"",username:""}},{name:"TimedText talk",id:711,analysis_description:{edit:"",username:""}},{name:"Module",id:828,analysis_description:{edit:"Check whether the edit is meaningful Lua code. In this namespace, anything that isn't written in Lua can be safely assumed to be vandalism. Be careful about multi-line strings, as they might contain non-Lua code: check the context of the edit to make sure. Additionally, check if the edit introduces any obvious Lua syntax errors.",username:""}},{name:"Module talk",id:829,analysis_description:{edit:"",username:""}},{name:"Event",id:1728,analysis_description:{edit:"",username:""}},{name:"Event talk",id:1729,analysis_description:{edit:"",username:""}}]},6400(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.profanity=void 0;const n="\\*#\\-",s=`[${n}a4]`,i=`[${n}b6]`,a=`[${n}ck]`,r=`[${n}h]`,o=`[${n}i1y]`,l=`[${n}o0]`,d=`[${n}t7]`,c={a:s,b:i,c:a,d:`[${n}d6]`,e:`[${n}e3]`,f:`[${n}f]`,g:`[${n}g9]`,h:r,i:o,j:`[${n}j]`,k:`[${n}k]`,l:`[${n}l1]`,m:`[${n}m]`,n:`[${n}n]`,o:l,p:`[${n}p9]`,q:`[${n}q9]`,r:`[${n}r]`,s:`[${n}sz526]`,t:d,u:`[${n}uv]`,v:`[${n}vu]`,w:`[${n}w]`,x:`[${n}x]`,y:`[${n}y]`,z:`[${n}zs25]`,0:`[${n}0]`,1:`[${n}1]`,2:`[${n}2]`,3:`[${n}3]`,4:`[${n}4]`,5:`[${n}5]`,6:`[${n}6]`,7:`[${n}7]`,8:`[${n}8]`,9:`[${n}9]`};class u{constructor(e={}){this.conversion={};for(const[t,n]of Object.entries(e))for(const e of n)this.conversion[e]&&console.warn(`Profanity lookalike collision: ${e} is already mapped to ${this.conversion[e]}, remapping to ${t}`),this.conversion[e]=t}removeAccents(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}obscureReplacements(e){return e.replace(/(\/[|\\]\/|\\[|\\]\\)/g,"n").replace(/&/g,"and").replace(/zero/g,"0").replace(/one/g,"1").replace(/two/g,"2").replace(/three/g,"3").replace(/four/g,"4").replace(/five/g,"5").replace(/six/g,"6").replace(/seven/g,"7").replace(/eight/g,"8").replace(/nine/g,"9")}parseString(e,t=!1){e=t?e.replace(/[._,;:|]/g," ").replace(/\s+/g," ").toLowerCase():e.replace(/[\s._,;:|]/g,"").toLowerCase(),e=this.removeAccents(e);let n="";for(const t of e)this.conversion[t]?n+=this.conversion[t]:n+=t;return e=this.obscureReplacements(n)}analyzeObfuscation(e,t,n,s,i=!1){const a=e.substring(t,n);let r=0;if(/\s/.test(a)&&!i)return-.95;const o=this.countCaseChanges(a);if(o>0){o/Math.max(1,a.length-1)>.3&&(r+=.3)}if(/[._,;:|]/.test(a)){const e=(a.match(/[._,;:|]/g)||[]).length,t=(a.match(/[a-zA-Z0-9]/g)||[]).length;if(t>0){const n=e/t;n>.3&&(r+=Math.min(.5,.7*n))}}const l=this.checkWordBoundaries(e,t,n,s,i);r+=l;const d=this.checkSubstitution(a,s);if(d>0&&(r+=d),l<0){if(!this.isStandaloneWord(e,t,n)){this.isCamelCaseBoundary(e,t,n)?r+=.2:r-=.2}}return Math.max(-1,Math.min(1,r))}countCaseChanges(e){let t=0;for(let n=1;n<e.length;n++){const s=e[n-1],i=e[n];if(/[a-zA-Z]/.test(s)&&/[a-zA-Z]/.test(i)){s===s.toUpperCase()!==(i===i.toUpperCase())&&t++}}return t}checkWordBoundaries(e,t,n,s,i=!1){const a=t>0?e[t-1]:"",r=n<e.length?e[n]:"",o=e.substring(Math.max(0,t-8),Math.min(e.length,n+8)).toLowerCase(),l=[/WMF/,/pass(word|phrase|port|enger|ion|ive|ed|ing|es|key|code|over|by|able)/i,/class(room|mate|ified|es|ic|y|ification)/i,/grass(land|hopper|y|es)/i,/bass(ist|oon|line|es)/i,/mass(ive|acre|age|es|achusetts)/i,/assign(ment|ed|ing|s|ee|or)/i,/assess(ment|ed|ing|or|s)/i,/assemble|assembly|assertion|asset|assist|assume|assure|associate|association/i,/brass|crass|harass|morass|surpass|trespass|compass|embassy|embarrass/i,/cock(pit|tail|roach|ade|atoo|le|ney)/i,/scunthorpe|penistone|shitterton|lightwater|middlesex|sussex|essex|wessex/i,/dick(ens|inson|son|ey|ie)/i,/analyst|analytics|analyze|canal|banal/i,/therapist|therapeutic|therapy/i,/cumul(ative|us|at)|circum(stance|ference|cise|vent|navigate|scribe)/i,/butter(cup|fly|milk|scotch|fingers|nut)|buttress|button|rebuttal/i,/count(ry|er|ess|down|ing|ed|able|enance|erfeit|erpart)/i,/grape|drape|scrape|landscape|escapade/i,/shell(fish|fire|ter|ed)|eggshell|nutshell|bombshell|seashell/i,/whole(sale|some|hearted)/i,/exchange|exchequer/i,/title|titled|subtitle|entitle/i,/sextant|sextet|bisect|insect|intersect|section|sector/i,/cocktail|peacock|hancock|hitchcock|babcock|woodcock/i,/niger(ia|ian)|montenegro/i,/penisten|penetrat|penal(ty|ize|ise)|penchant|pencil|pendant|penguin|peninsula/i,/manslaughter|slaughterhouse/i,/shitake|shiitake/i,/arsenic|arsenal/i,/cummings|scumble/i,/smother|another|mother(board|land|hood)/i,/wanton|wanting|wanted|warrant/i,/trigger|bigger|digger|jigger|rigger|vigor|figure/i,/ballad|ball(room|park|istic|oon|et|ot|ard|ast)/i,/grape(fruit|vine|shot)/i,/raptor|rapport|rapid|rapier|rapture/i,/killed|killer|skill(ed|ful|s)|killjoy|kiln|kilo(gram|meter|byte|watt)/i,/bomb(ard|astic|shell|er|ing|ay)/i,/hellenic|hello|shell|othello/i,/crack(down|le|ed|ing|erjack)|firecracker/i,/jewel{1,2}/i,/skill/i];for(const e of l)if(e.test(o))return-.8;const d=/[a-zA-Z]/.test(a),c=/[a-zA-Z]/.test(r);if(d&&c){const i=e.substring(Math.max(0,t-8),t).toLowerCase(),a=e.substring(n,Math.min(e.length,n+8)).toLowerCase(),r=e.substring(Math.max(0,t-8),Math.min(e.length,n+8)).toLowerCase();return this.analyzePaddingLikelihood(i,a,s)>=.4||r.length>15&&r===r.toLowerCase()&&!/\s/.test(r)?0:-.5}if(d||c){const i=e.substring(Math.max(0,t-8),t).toLowerCase(),a=e.substring(n,Math.min(e.length,n+8)).toLowerCase();this.analyzePaddingLikelihood(i,a,s);return 0}const u=e.substring(t,n);return/\s/.test(u)&&!i?-.9:0}analyzePaddingLikelihood(e,t,n){let s=0;const i=/[bcdfghjklmnpqrstvwxyz]{3,}/i;(i.test(e)||i.test(t))&&(s+=.4);const a=t.match(/([a-z])\1{1,}/i);if(a&&a[0].length>=2){if(t.indexOf(a[0])>=t.length-3){(!/\b(ll|ss|tt|nn|mm|pp|dd|bb|gg|ff)$/i.test(a[0])||t.length<=3)&&(s+=.35)}}if(e.length<=2&&e.length>0&&(s+=.25),t.length<=3&&t.length>0){/^(er|ed|ing|ion|ly|al|ful|less|ness|ment|s)$/i.test(t)||(s+=.2)}/([qx][^u]|[jqxz]{2}|[bcdfghjklmnpqrstvwxz]{4,})/i.test(e+t)&&(s+=.3);const r=e+t;if(r.length>0){(r.match(/[aeiou]/gi)||[]).length/r.length<.2&&(s+=.3)}return Math.min(1,s)}checkSubstitution(e,t){const n=/[0-9@$!]/;if(!n.test(e))return 0;let s=0;for(const t of e)n.test(t)&&s++;const i=s/e.length;return Math.min(.3,.6*i)}isStandaloneWord(e,t,n){const s=t>0?e[t-1]:" ",i=n<e.length?e[n]:" ",a=/[\s.,;:!?()[\]{}"'`~\-_]/;return a.test(s)&&a.test(i)}isCamelCaseBoundary(e,t,n){if(0===t||n===e.length)return!1;const s=e[t-1],i=e[t],a=e[n-1],r=e[n],o=/[A-Z]/.test(i),l=/[a-z]/.test(s),d=(/[a-z]/.test(r),/[a-z]/.test(a));return!!(l&&o||d&&/[A-Z]/.test(r))}findMatchPosition(e,t,n,s){const i=e.toLowerCase();let a=-1,r=-1,o=-1;for(let n=0;n<=i.length-t.length;n++){const i=this.parseString(e.substring(n,n+t.length+10));if(i.includes(s)){const e=this.calculateSimilarity(s,i.substring(0,s.length));e>o&&(o=e,a=n,r=n+t.length)}}return{start:a,end:r}}calculateSimilarity(e,t){const n=Math.min(e.length,t.length);let s=0;for(let i=0;i<n;i++)e[i]===t[i]&&s++;return s/Math.max(e.length,t.length)}match(e){const t=this.parseString(e),n=[];for(const s of u.hits)if(s.term){const i=s.term,a=s.severity||.5,r=s.note||null,o=s.multiWord||!1;if(1===i.length&&/[^\x00-\x7F]/.test(i))continue;const l=o?this.parseString(e,!0):t,d=i.split("").reduce((e,t)=>{var n;if(o&&" "===t)return e+" *";return e+(null!==(n=c[t])&&void 0!==n?n:t)},""),u=new RegExp(d,"gi");let p;const g=this.buildPositionMap(e,o);for(;null!==(p=u.exec(l));){const t=p[0],l=p.index,d=l+t.length,c=g[l]||l,u=void 0!==g[d-1]?g[d-1]+1:d,h=this.analyzeObfuscation(e,c,u,i,o);let m=this.calculateMatchConfidence(t,i);h<-.5?m*=Math.max(.01,1+4*h):h<-.2?m*=Math.max(.05,1+2.5*h):h>.5&&(m=Math.min(1,m+.08*h));if(m>=Math.max(.05,.2-.015*i.length)){const o=e.substring(c,u);if(s.ignore&&Array.isArray(s.ignore)&&s.ignore.includes(o))continue;n.push({name:i,match:t,confidence:m,obfuscation:h,severity:a,note:r,originalSegment:o})}}}else if(s.regex){const t=e.match(new RegExp(s.regex.source,"g"));if(t)for(const e of t)n.push({name:s.name,match:e,confidence:1,obfuscation:.5,severity:s.severity||.5,note:s.note||"Pattern-based detection with high confidence. Obfuscation is moderate for formatted data.",originalSegment:e})}else s.test&&s.test(e)&&n.push({name:s.name,match:e,confidence:1,obfuscation:.5,severity:s.severity||.5,note:s.note||"Test-based detection with high confidence.",originalSegment:e});return n}buildPositionMap(e,t=!1){const n={};let s=0;for(let i=0;i<e.length;i++){const a=e[i];t?/[\s._,;:|]/.test(a)&&0!==i&&/[\s._,;:|]/.test(e[i-1])||(n[s]=i,s++):/[\s._,;:|]/.test(a)||(n[s]=i,s++)}return n}findOriginalPosition(e,t){let n=0;for(let s=0;s<e.length;s++){const i=e[s];if(!/\s/.test(i)){if(n===t)return s;n++}}return t}calculateMatchConfidence(e,t){const n=/[\*#_\-]/;let s=0,i=0,a=0,r=0;for(const t of e)n.test(t)?(i++,a++,r=Math.max(r,a)):(s++,a=0);const o=s+i;if(0===o)return 0;const l=s/o;if(l<.3)return 0;if(l<.5)return.1*l;const d=r>1?Math.max(.2,1-.2*r):1,c={};for(const t of e)n.test(t)||(c[t]=(c[t]||0)+1);let u=1;for(const e of Object.values(c))e>2&&(u*=Math.max(.4,1-.15*(e-2)));const p=o/t.length,g=p>1.5?Math.max(.2,1-.4*(p-1)):1;return Math.max(0,Math.min(1,l*d*u*g))}score(e){const t=this.match(e);let n=0;for(const e of t)n+=e.confidence;return n}evaluate(e){const t=this.match(e),n=this.parseString(e);if(0===t.length)return{finalScore:0,risk:"No",matches:[],details:{baseScore:0,weightedScore:0,severityScore:0,matchCount:0,averageConfidence:0,averageObfuscation:0,averageSeverity:0,textLength:e.length,densityPenalty:0,repetitionPenalty:0,diversityBonus:0,lengthModifier:1,highConfidenceMatches:0,mediumConfidenceMatches:0,lowConfidenceMatches:0}};let s=0,i=0,a=0,r=0,o=0,l=0;const d=new Set;for(const e of t){const t=e.severity||.5,n=e.confidence;r+=n,l+=Math.pow(n,1.5)*t,o+=e.obfuscation||0,d.add(e.name),n>=.7?s++:n>=.4?i++:a++}const c=r/t.length,u=o/t.length,p=r>0?l/r:0,g=1*s+.35*i+.08*a,h=n.length,m=t.length/Math.max(h/5,1),v=.6*Math.tanh(.3*m),f={};for(const e of n)/[a-z0-9]/.test(e)&&(f[e]=(f[e]||0)+1);let b=0;const w=Object.values(f).reduce((e,t)=>e+t,0);for(const e of Object.values(f))e>3&&(b+=Math.pow((e-3)/w,1.5));const y=Math.min(.8,2*b),x=d.size/t.length,k=x>.6?1*(x-.6):0,_=Math.max(.5,Math.min(1.5,1+Math.log10(Math.max(10,h))/10)),S=u>.4?.5*(u-.4):u<-.2?.4*Math.abs(u):0,q=t.filter(e=>e.severity>=1&&e.confidence>=.5||e.confidence>=.9).length,E=g*p*_;let L=E+.5*l+k+.8*q-(v+y+S);c<.5&&(L*=Math.max(.1,1.5*c)),L>3?L=3+1.5*Math.log10(L-2):L>1.5&&(L=1.5+.8*Math.sqrt(L-1.5)),L=Math.max(0,L);let A="No";return L>=4||q>=2?A="Critical":L>=2.5?A="High":L>=1.5?A="Medium":L>=.5&&(A="Low"),{clamped:Math.max(0,Math.min(1,L/5)),finalScore:Math.round(100*L)/100,risk:A,matches:t,details:{baseScore:Math.round(100*g)/100,weightedScore:Math.round(100*E)/100,severityScore:Math.round(100*l)/100,matchCount:t.length,uniqueMatches:d.size,averageConfidence:Math.round(100*c)/100,averageObfuscation:Math.round(100*u)/100,averageSeverity:Math.round(100*p)/100,textLength:e.length,densityPenalty:Math.round(100*v)/100,repetitionPenalty:Math.round(100*y)/100,diversityBonus:Math.round(100*k)/100,lengthModifier:Math.round(100*_)/100,obfuscationPenalty:Math.round(100*S)/100,criticalPatterns:q,highConfidenceMatches:s,mediumConfidenceMatches:i,lowConfidenceMatches:a}}}}!function(e,t,n){(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(u,"hits",[{name:"URL",regex:/(?:https?:\/\/(?:www\.)?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*(?:\/[^\s]*)?|(?:www\.)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:\/[^\s]*)?|[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.(?:com|org|net|edu|gov|mil|int|co|io|ai|app|dev|info|biz|name|pro|museum|aero|coop|jobs|mobi|travel|xxx|ac|ad|ae|af|ag|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(?:\/[^\s]*)?)/i,severity:.1,note:"URLs in usernames may indicate spam or advertising."},{name:"Phone number",regex:/(\+?\d{1,3}[-.\s]?|\(\+?\d{1,3}\)\s?)?(\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\d{4}[-.\s]?\d{3}[-.\s]?\d{3})/,severity:.3,note:"The pattern of numbers in this username resemble a phone number. Usernames containing personal information may be considered disruptive."},{name:"Email address",regex:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/,severity:.3,note:"Email addresses in usernames can indicate spam or contact sharing."},{term:"base64",severity:.2,note:"Base64 encoding may be used to obfuscate content to bypass filters."},{term:"fromhex",severity:.2,note:"Hex encoding may be used to obfuscate content to bypass filters."},{term:"1488",severity:.5,note:"Well-known Neo-Nazi symbol, however the number itself can appear in innocent contexts."},{term:"nazi",severity:1},{term:"swastika",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"卍",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"卐",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿕",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿖",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿗",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿘",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"aryan",severity:.7,note:"Associated with white supremacist ideology, though it can also be in reference to the self-designation of Indo-Iranian peoples."},{term:"fascism",severity:.5},{term:"fascist",severity:.5},{term:"facist",severity:.5},{term:"☭",severity:.5,note:"Hammer and sickle symbol, politically charged but context-dependent."},{term:"✡",severity:.4,note:"Star of David, can be used respectfully or in antisemitic contexts."},{term:"44",severity:.1,note:"Obfuscated symbol of the Nazi SS division. If appears as 'ᛋᛋ' or similar, indicates intent to reference the SS."},{term:"imbo wales",severity:.2,multiWord:!0,note:"Play on 'Jimbo Wales' name, may indicate mockery or impersonation."},{term:"sock",severity:.3,note:"May reference sockpuppet accounts but has innocent meanings."},{term:"puppet",severity:.3,note:"May reference sockpuppet accounts but has innocent meanings."},{term:"sock puppet",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"return",severity:.2,note:"Often used in usernames by sockpuppeteers."},{term:"is back",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"are back",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"timelash",severity:1,note:'Well-known sockpuppeteer ("Timelash") on Wikipedia.'},{term:"my little",severity:.8,multiWord:!0,note:"If related to 'my little pony', indicates sockpuppeteer."},{term:"my little pony",severity:1,multiWord:!0,note:"Well-known sockpuppeteer on Wikipedia."},{term:"friendship is magic",severity:1,multiWord:!0,note:"Well-known sockpuppeteer on Wikipedia."},{term:"anal",severity:.7},{term:"anus",severity:.5},{term:"sex",severity:.3},{term:"secs",severity:.05,note:"Obfuscated form of 'sex'."},{term:"seggs",severity:.2,note:"Obfuscated form of 'sex'."},{term:"willy",severity:.2,note:"Slang for penis."},{term:"wank",severity:.6,note:"British sexual slang for masturbation."},{term:"barf",severity:.3},{term:"bastard",severity:.5},{term:"batty boy",severity:.7,multiWord:!0,note:"Homophobic slur in British/Caribbean English."},{name:"bitch",regex:new RegExp(`${i+o}(${l}|${s})?${d}?${a+r}`),severity:.7},{term:"blow job",severity:.8,multiWord:!0},{term:"blowing",severity:.2,note:"Sexual innuendo but common verb."},{term:"boner",severity:.4},{term:"boob",severity:.4},{term:"booty",severity:.3},{term:"breast",severity:.4,note:"Anatomical term, but can be used inappropriately."},{term:"butt",severity:.2},{term:"bite me",severity:.5,multiWord:!0,note:"Often has defiant or provocative connotation."},{term:"butt plug",severity:.7,multiWord:!0},{term:"bollock",severity:.5,note:"British slang for testicles."},{term:"bollox",severity:.5,note:"Variant spelling of 'bollocks'."},{term:"bollix",severity:.5,note:"Variant spelling of 'bollocks'."},{term:"clit",severity:.7},{term:"cock",severity:.7},{term:"cum",severity:.7},{term:"brain dead",severity:.5,multiWord:!0,note:"Derogatory medical reference."},{term:"bukake",severity:.7},{term:"bully",severity:.5,note:"Indicates harassment behavior."},{term:"bullies",severity:.5,note:"Indicates harassment behavior."},{term:"bullied",severity:.3,note:"May indicate victimhood or boasting."},{term:"versus",severity:.4,note:"Combat/conflict framing, but legitimate word."},{term:"bumming",severity:.5,note:"British slang for anal sex or begging."},{term:"bunghole",severity:.5},{term:"cesspool",severity:.3,note:"Derogatory term for filthy place."},{term:"cesspit",severity:.3,note:"Variant of cesspool."},{term:"dick",severity:.7},{term:"prick",severity:.7},{term:"dildo",severity:.7},{term:"censor",severity:.1,note:"May indicate anti-censorship stance."},{term:"ching",severity:.8,note:"Part of racial slur against Asians."},{term:"ching chong",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"ching chang",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"wing wong",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"bot",severity:.4,note:"May indicate automated account claim."},{term:"ox long",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'cock's long'."},{term:"douche",severity:.5},{term:"cunt",severity:.7},{term:"cuck",severity:.4,note:"Derogatory term from manosphere."},{term:"curry munch",severity:.9,multiWord:!0,note:"Racist slur against South Asians."},{term:"crime",severity:.3,note:"Negative connotation but legitimate word."},{term:"pussy",severity:.7},{term:"deeznuts",severity:.3,note:"Crude joke phrase."},{term:"destroy",severity:.3,note:"Aggressive language."},{term:"destruction",severity:.3,note:"Aggressive language."},{term:"diaper",severity:.3,note:"Infantilization or fetish reference."},{term:"diarrhea",severity:.3},{term:"throbbing",severity:.5,note:"Sexual innuendo term."},{term:"dimwit",severity:.3},{term:"doo doo",severity:.3,multiWord:!0},{term:"dookie",severity:.3},{term:"fart",severity:.3},{term:"ejaculat",severity:.7},{term:"erect",severity:.5,note:"Sexual context or legitimate word."},{term:"erotic",severity:.5},{term:"fuck",severity:.8},{term:"phuck",severity:.8,note:'Alternative spelling of "fuck" to bypass detection.'},{term:"orgasm",severity:.7},{term:"rape",severity:1},{term:"lawsuit",severity:.3,note:"Legal threat implication."},{term:"fraud",severity:.5,note:"Accusation of criminal behavior."},{term:"tard",severity:.5,note:"Ableist slur suffix."},{term:"terror",severity:.7,note:"Violence/terrorism reference."},{term:"mike hunt",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'my cunt'."},{term:"mike ox",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'my cock's'."},{term:"masturbat",severity:.7},{term:"nutsack",severity:.5},{term:"ophile",severity:1,note:"Suffix for sexual predator terms like pedophile."},{term:"pedo",severity:.6},{term:"peeing",severity:.3},{term:"peanus",severity:.5,note:"Intentional misspelling of 'penis'."},{term:"penis",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"porn",severity:.7},{term:"piss",severity:.5},{term:"poop",severity:.3},{term:"prison",severity:.3,note:"Criminal context, but legitimate word."},{term:"prostitute",severity:.5,note:"Sexual work reference or insult."},{term:"queer",severity:.5,note:"Can be slur or reclaimed identity."},{term:"rectum",severity:.3,note:"Anatomical term."},{term:"report me",severity:.3,multiWord:!0,note:"Defiant/trolling phrase."},{term:"rimming",severity:.7},{term:"scrotum",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"semen",severity:.7},{term:"slut",severity:.7},{term:"sucks",severity:.3,note:"Mild profanity or legitimate verb."},{term:"sux",severity:.3,note:"Intentional misspelling of 'sucks'."},{term:"vagina",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"vadge",severity:.5,note:"Slang for vagina."},{term:"vomit",severity:.3},{term:"vulva",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"whore",severity:.7},{term:"chink",severity:1},{term:"jew",severity:.3,note:"Legitimate religious/ethnic term but tracked for antisemitic usage patterns."},{term:"nigger",severity:1},{term:"nigga",severity:1},{term:"nigguh",severity:1,note:"Phonetic spelling of racial slur."},{term:"niglet",severity:1},{term:"pajeet",severity:.7,note:"Derogatory term for South Asians."},{term:"slave",severity:.6,note:"Dehumanizing term with historical trauma, but legitimate historical uses."},{term:"master race",severity:1,multiWord:!0,note:"Nazi supremacist ideology phrase."},{term:"inferior race",severity:1,multiWord:!0},{term:"superior race",severity:1,multiWord:!0,note:"White supremacist ideology."},{term:"racist",severity:.8},{term:"racism",severity:.7},{term:"racial",severity:.3,note:"Neutral term but tracked for context in discriminatory language."},{term:"bigot",severity:.7},{term:"fag",severity:.7},{term:"taliban",severity:.7,note:"Terrorist organization reference."},{term:"antisemit",severity:1},{term:"bleed",severity:.3,note:"Can indicate violence or be medical."},{term:"bloody",severity:.3,note:"British profanity or literal blood reference."},{term:"hell",severity:.5,note:"Religious reference used as mild profanity, but legitimate uses."},{term:"damn",severity:.3},{term:"crap",severity:.3},{term:"darn",severity:.1,note:"Mild euphemism for 'damn'."},{term:"shutup",severity:.3,note:"Rude command indicating hostility."},{term:"spastic",severity:.5,note:"Ableist slur in British English, medical term in US."},{term:"disabled",severity:.1,note:"Legitimate disability term but tracked for ableist patterns."},{term:"loser",severity:.3},{term:"abuse",severity:.5,note:"Indicates harmful behavior or accusations."},{term:"spam",severity:.3,note:"Indicates unwanted content or disruption."},{term:"abusi",severity:.5,note:"Variant of 'abuse/abusive'."},{term:"hitler",severity:1},{term:"adolf",severity:.4,note:"Common name but often used in Hitler references."},{term:"gestapo",severity:1},{term:"heil",severity:.8,note:"Nazi salute reference."},{term:"final solution",severity:1,multiWord:!0,note:"Nazi euphemism for genocide."},{term:"death camp",severity:1,multiWord:!0},{term:"concentration camp",severity:1,multiWord:!0,note:"Holocaust reference, legitimate historical use but concerning in usernames."},{term:"gas chamber",severity:1,multiWord:!0},{term:"holocaust",severity:.5,note:"Historical tragedy reference, legitimate historical use."},{term:"zionis",severity:.5,note:"Political term stem, can be antisemitic depending on context."},{term:"fuhrer",severity:1},{term:"reich",severity:.7,note:"Nazi Germany reference, though legitimate German word."},{term:"massacre",severity:.7},{term:"slaughter",severity:.7},{term:"torture",severity:.7},{term:"lynch",severity:1,note:"Racist mob killing reference, though also a surname."},{term:"killer",severity:.5},{term:"mobster",severity:.5,note:"Organized crime reference."},{term:"gangster",severity:.3,note:"Criminal reference or slang."},{term:"druglord",severity:.5,note:"Drug trafficking reference."},{term:"drugs",severity:.3,note:"General term that can be legitimate or problematic."},{term:"meth",severity:.5,note:"Reference to illegal drug, though also shorthand for 'method'."},{term:"cocaine",severity:.5},{term:"heroin",severity:.5},{term:"weed",severity:.3,note:"Marijuana reference with varying legal status, also refers to plants."},{term:"marijuana",severity:.3,note:"Cannabis reference with complex legal status."},{term:"crack",severity:.5,note:"Drug reference or legitimate verb."},{term:"amphetamine",severity:.5},{term:"benzo",severity:.3,note:"Drug abbreviation or name prefix."},{term:"benzodiazepine",severity:.5},{term:"opioid",severity:.3,note:"Drug class, medical term."},{term:"opiate",severity:.3,note:"Drug class, medical term."},{term:"ketamine",severity:.5,note:"Drug reference or medical use."},{term:"rohypnol",severity:.7,note:"Date rape drug reference."},{term:"i like",severity:.2,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"i love",severity:.3,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"i hate",severity:.5,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"young",severity:.2,note:"Age reference with legitimate uses but flagged in combination."},{term:"underage",severity:.8,note:"Age reference with concerning implications in certain contexts."},{term:"teen",severity:.3,note:"Age reference, concerning in some contexts."},{term:"adolescent",severity:.2,note:"Age term, concerning in some contexts."},{term:"preteen",severity:.4,note:"Age reference with concerning implications in certain contexts."},{term:"rapist",severity:1},{term:"raping",severity:1},{term:"incest",severity:1},{term:"cult",severity:.3,note:"Religious/social group term with negative connotation."},{term:"sekt",severity:.3,note:"German for 'sect', cult reference."},{term:"disembowel",severity:1},{term:"behead",severity:1},{term:"traitor",severity:.5,note:"Accusatory term."},{term:"genocide",severity:1},{term:"ethnic clean",severity:1,multiWord:!0,note:"Euphemism for genocide."},{term:"klan",severity:1},{term:"klux",severity:1},{term:"kkk",severity:1},{term:"kill",severity:.5,note:"Violent language, but common word."},{term:"bomb",severity:.7,note:"Terrorism/violence reference."},{term:"organi",severity:.1,note:"Word stem for organization."},{term:"blog",severity:.1,note:"External site reference."},{term:"group",severity:.1,note:"Organizational term."},{term:"compan",severity:.1,note:"Company stem, spam indicator."},{term:"associat",severity:.1,note:"Association stem."},{term:"industr",severity:.1,note:"Industry stem, spam indicator."},{term:"corporate",severity:.1,note:"Business term, spam indicator."},{term:"famil",severity:.1,note:"Family stem, group indicator."},{term:"task",severity:.1,note:"Organizational term."},{term:"alliance",severity:.1,note:"Group term."},{term:"entertain",severity:.1,note:"Entertainment stem, promotional."},{term:"public",severity:.1,note:"Common term, promotional context."},{term:"private",severity:.1,note:"Common term, organizational."},{term:"troll",severity:.3,note:"Disruptive behavior indicator."},{term:"trolol",severity:.3,note:"Trolling variant/meme."},{term:"grief",severity:.3,note:"Gaming term for harassment."},{term:"password",severity:.3,note:"Security term, suspicious in username."},{term:"admin",severity:.7,note:"Role impersonation."},{term:"sysop",severity:.4,note:"Wikipedia role impersonation."},{term:"bureaucrat",severity:.5,note:"Wikipedia role impersonation."},{term:"moderator",severity:.5,note:"Role impersonation."},{term:"staff",severity:.5,note:"Role impersonation."},{term:"developer",severity:.5,note:"Role impersonation."},{term:"owner",severity:.4,note:"Role impersonation."},{term:"founder",severity:.3,note:"Role impersonation."},{term:"wmf",severity:.2,note:"Wikimedia Foundation impersonation."},{term:"foundation",severity:.3,note:"Organizational impersonation."},{term:"unblock",severity:.1,note:"Suggests blocked user."},{term:"4chan",severity:.5,note:"Imageboard site, trolling association."},{term:"8chan",severity:.3,note:"Controversial imageboard."},{term:"reddit",severity:.3,note:"External site reference."},{term:"plague",severity:.3,note:"Disease/attack term."},{term:"skibidi",severity:.1,note:"Internet meme reference."},{term:"milf",severity:.5},{term:"dilf",severity:.5},{term:"sext",severity:.5,note:"Sending sexual messages."},{term:"thot",severity:.3,note:"Derogatory sexual slang."},{term:"rizz",severity:.1,note:"Gen Z slang for charisma."},{term:"gyatt",severity:.1,note:"Sexualized Gen Z slang."},{term:"noob",severity:.1},{term:"lyric",severity:.1,note:"Possible lyrics website spammer."},{term:"propaganda",severity:.5,note:"Misinformation term."},{term:"asshole",severity:.7},{term:"fucktard",severity:.7},{term:"retard",severity:.7},{term:"imbecile",severity:.5},{term:"moron",severity:.5},{term:"chigga",severity:1},{term:"chigger",severity:1},{term:"wigga",severity:1},{term:"wigger",severity:1},{term:"igga",severity:.7,note:"Potential variant of racial slur.",ignore:["1994","ig94"]},{term:"igger",severity:.7,note:"Potential variant of racial slur."},{term:"mother fuck",severity:.7,multiWord:!0},{term:"bull shit",severity:.6,multiWord:!0},{term:"dumb ass",severity:.5,multiWord:!0},{term:"dumb fuck",severity:.7,multiWord:!0},{term:"goon",severity:.2,multiWord:!1}]);t.profanity=new u({a:["ɑ","𝑎","𝗮","𝕒","𝖆","𝓪","𝚊","𝞪","А","а","𝔞","𝒂","𝘢","𝛼","𝒶","𝙖","𝜶","𝐚","𝖺","🄰","🅰️","🅰","Ⓐ","ⓐ","@"],b:["b","𝑏","𝗯","𝕓","𝖇","𝓫","𝚋","𝞫","Ь","в","𝔟","𝒃","𝘣","𝛃","𝒷","𝙗","𝜷","𝐛","𝖻","🄱","🅱️","🅱","Ⓑ","ⓑ"],c:["c","𝑐","𝗰","𝕔","𝖈","𝓬","𝚌","ϲ","с","𝔠","𝒄","𝘤","𝒸","𝙘","𝐜","𝖼","🄲","Ⓒ","ⓒ"],d:["d","𝑑","𝗱","𝕕","𝖉","𝓭","𝚍","𝞭","ԁ","ԃ","𝔡","𝒅","𝘥","𝛿","𝒹","𝙙","𝜹","𝐝","𝖽","𝝏","🄳","Ⓓ","ⓓ"],e:["e","𝑒","𝗲","𝕖","𝖊","𝓮","𝚎","𝞮","е","𝔢","𝒆","𝘦","𝛆","𝒺","𝙚","𝜺","𝐞","𝖾","з","𝝐","🄴","Ⓔ","ⓔ","€"],f:["f","𝑓","𝗳","𝕗","𝖋","𝓯","𝚏","𝞯","ғ","ƒ","𝔣","𝒇","𝘧","𝒻","𝙛","𝜻","𝐟","𝖿","🄵","Ⓕ","ⓕ"],g:["g","𝑔","𝗴","𝕘","𝖌","𝓰","𝚐","ɡ","Ԍ","ԍ","𝔤","𝒈","𝘨","𝙜","𝐠","𝗀","🄶","Ⓖ","ⓖ"],h:["h","𝗵","𝕙","𝖍","𝓱","𝚑","һ","н","𝔥","𝒉","𝘩","ℎ","𝒽","𝙝","𝐡","𝗁","🄷","Ⓗ","ⓗ"],i:["i","𝑖","𝗶","𝕚","𝖎","𝓲","𝚒","𝞲","і","𝔦","𝒊","𝘪","𝒾","𝙞","𝜾","𝐢","𝗂","🄸","ℹ️","ℹ","Ⓘ","ⓘ","!"],j:["j","𝑗","𝗷","𝕛","𝖏","𝓳","𝚳","ј","𝔧","𝒋","𝘫","𝒿","𝙟","𝐣","𝗃","🄹","Ⓙ","ⓙ"],k:["k","𝑘","𝗸","𝕜","𝖐","𝓴","κ","к","𝔨","𝒌","𝘬","𝓀","𝙠","𝝀","𝐤","𝗄","𝞳","𝜿","қ","🄺","Ⓚ","ⓚ"],l:["l","𝑙","𝗹","𝕝","𝖑","𝓵","ⅼ","ӏ","𝔩","𝒍","𝘭","𝓁","𝙡","𝐥","𝗅","🄻","Ⓛ","ⓛ","|"],m:["m","𝑚","𝗺","𝕞","𝖒","𝓶","𝚖","м","𝔪","𝒎","𝘮","𝓂","𝙢","𝐦","𝗆","🄼","Ⓜ️","Ⓜ","ⓜ"],n:["n","𝑛","𝗻","𝕟","𝖓","𝓷","𝚗","ո","п","𝔫","𝒏","𝘯","𝓃","𝙣","𝐧","𝗇","𝞰","𝜼","🄽","Ⓝ","ⓝ"],o:["o","𝑜","𝗼","𝕠","𝖔","𝓸","𝚘","ο","о","𝔬","𝒐","𝘰","𝙤","𝝈","𝐨","𝗈","𝜽","𝝄","𝝓","𝝑","𝝋","🄾","🅾️","🅾","Ⓞ","ⓞ"],p:["p","𝑝","𝗽","𝕡","𝖕","𝓹","𝚙","ρ","р","𝔭","𝒑","𝘱","𝓅","𝙥","𝐩","𝗉","𝝆","🄿","🅿️","🅿","Ⓟ","ⓟ"],q:["q","𝑞","𝗾","𝕢","𝖖","𝓺","𝚚","ԛ","𝔮","𝒒","𝘲","𝓆","𝙦","𝐪","𝗊","🅀","Ⓠ","ⓠ"],r:["r","𝑟","𝗿","𝕣","𝖗","𝓻","𝚛","г","𝔯","𝒓","𝘳","𝓇","𝙧","𝐫","𝗋","𝞽","🅁","Ⓡ","ⓡ"],s:["s","𝑠","𝗌","𝕤","𝖘","𝓼","𝚜","ѕ","𝔰","𝒔","𝘴","𝓈","𝙨","𝐬","🅂","Ⓢ","ⓢ","$"],t:["t","𝑡","𝗍","𝕥","𝖙","𝓽","𝚝","τ","т","𝔱","𝒕","𝘵","𝓉","𝙩","𝐭","𝝉","🅃","Ⓣ","ⓣ","+"],u:["u","𝑢","𝗎","𝕦","𝖚","𝓾","𝚞","υ","𝔲","𝒖","𝘶","𝓊","𝙪","𝐮","𝛍","🅄","Ⓤ","ⓤ"],v:["v","𝑣","𝗏","𝕧","𝖛","𝓿","𝚟","ν","𝔳","𝒗","𝘷","𝓋","𝙫","𝐯","𝞶","𝝂","𝝊","🅅","Ⓥ","ⓥ"],w:["w","𝑤","𝗐","𝕨","𝖜","𝔀","𝚠","ω","ш","𝔴","𝒘","𝘸","𝓌","𝙬","𝐰","𝝎","𝝍","🅆","Ⓦ","ⓦ"],x:["x","𝑥","𝗑","𝕩","𝖝","𝔁","𝚡","χ","х","𝔵","𝒙","𝘹","𝓍","𝙭","𝐱","𝝒","𝝌","🅇","Ⓧ","ⓧ"],y:["y","𝑦","𝗒","𝕪","𝖞","𝔂","𝚢","у","𝔶","𝒚","𝘺","𝓎","𝙮","𝐲","𝞬","𝜸","𝞴","🅈","Ⓨ","ⓨ"],z:["z","𝑧","𝗓","𝕫","𝖟","𝔃","𝚣","ζ","𝔷","𝒛","𝘻","𝓏","𝙯","𝐳","🅉","Ⓩ","ⓩ"],0:["0","𝟎","𝟬","𝟢"],1:["1","𝟏","𝟭","𝟣","①","➀","❶","➊","⓵"],2:["2","𝟐","𝟮","𝟤","②","➁","❷","➋","⓶"],3:["3","𝟑","𝟯","𝟥","③","➂","❸","➌","⓷"],4:["4","𝟒","𝟰","𝟦","④","➃","❹","➍","⓸","ᛋ"],5:["5","𝟓","𝟱","𝟧","⑤","➄","❺","➎","⓹"],6:["6","𝟔","𝟲","𝟨","⑥","➅","❻","➏","⓺"],7:["7","𝟕","𝟳","𝟩","⑦","➆","❼","➐","⓻"],8:["8","𝟖","𝟴","𝟪","⑧","➇","❽","➑","⓼"],9:["9","𝟗","𝟵","𝟫","⑨","➈","❾","➒","⓽"]})},4712(e,t){function n(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function s(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;var i=new WeakSet;function a(e,t,n=!1){const s=(new Date).toISOString();this.logs.push({type:e,timestamp:s,message:t,expected:n})}t.Logger=class{constructor(){n(this,i),this.logs=[]}getLogs(){return[...this.logs]}log(e,t){s(i,this,a).call(this,"log",e,t)}warn(e,t){s(i,this,a).call(this,"warn",e,t)}error(e,t){s(i,this,a).call(this,"error",e,t)}dev(e,t){s(i,this,a).call(this,"dev",e,t)}}},9501(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.StorageManager=void 0;var s,i,a,r=n(4712),o=n(4029);n(9458),n(7345),n(7704),n(8415);class l{static get versions(){return new Map([[0,o.Version.v0],[1,o.Version.v1],[2,o.Version.v2],[3,o.Version.v3]])}constructor(){this.reset(new r.Logger)}reset(e){return null==e||e.log("Resetting storage to default."),this.data=l.version.default,l.version.init(e,this.data),l.version.validate(),l.version.construct(),this.data}load(e={}){var t,n;const s=new r.Logger;let i=null!==(n=(t=e).version)&&void 0!==n?n:t.version=0;if(l.versions.has(i)){const t=l.version.number;for(;i!==t;){const t=l.versions.get(i+1);if(!("function"==typeof(null==t?void 0:t.constructor)&&new t instanceof o.Version)){s.dev("[MISSING_UPGRADE_METHOD] Uh oh! Something has gone wrong; this message should never appear. Please report this to the WikiShield developers."),e=this.reset(s);break}s.log(`Upgrading storage from version ${i} to ${i+1}`,!0);try{if(!t.init(s,e)){e=this.reset(s);break}(e=t.upgrade()).version=++i}catch(t){s.error(`Error upgrading storage from version ${i} to ${i+1}: ${t}`),e=this.reset(s);break}}i=e.version,s.log(`Initializing storage at version ${i}.`,!0),l.version.init(s,e),s.log(`Validating storage at version ${i}.`,!0),l.version.validate(),s.log(`Constructing storage at version ${i}.`,!0),e=l.version.construct(),s.log(`Storage loaded successfully at version ${i}.`,!0),this.data=e}else s.error(`Storage version ${i} is corrupted or unsupported.`),this.reset(s);return{data:this.data,logs:s.getLogs()}}save(){const e=new r.Logger,t=l.version.number;e.log(`Initializing storage at version ${t}.`,!0),l.version.init(e,this.data),e.log(`Deconstructing storage at version ${t}.`,!0);const n=l.version.deconstruct();return e.log(`Storage saved successfully at version ${t}.`,!0),{data:n,logs:e.getLogs()}}decode(e){try{return this.load(JSON.parse(atob(e.trim()||"e30=")))}catch(e){return this.load({})}}encode(){const{data:e,logs:t}=this.save();return{string:btoa(JSON.stringify(e)),logs:t}}static output(e,t="<unknown>",n=console){var s;const i=!e.some(e=>!e.expected);null==n||null===(s=n.log)||void 0===s||s.call(n,`[${i?" ":"X"}] WikiShield Storage Logs: ${t}`);for(const t of e){var a;let e=`[${t.expected?" ":"X"}][${t.timestamp}][Storage]`,s=t.type;"dev"===s&&(s="error",e=`#DEV# ${e}`),null==n||null===(a=n[s])||void 0===a||a.call(n,`${e} ${t.message}`)}}static okay(e,t=console){var n,s,i,a;null!=e||(e=(new l).load(l.versions.get(0).default));const r=!(null===(n=null===(s=e.logs)||void 0===s||null===(i=s.some)||void 0===i?void 0:i.call(s,e=>!e.expected))||void 0===n||n);return r||(null!==(a=void l.output(e.logs,"Storage Check",t))&&void 0!==a?a:r)}}t.StorageManager=l,s=l,i="version",a=o.Version.v3,(i=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(i))in s?Object.defineProperty(s,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):s[i]=a},330(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.isURL=t.isObject=void 0;t.isObject=e=>null!==e&&"object"==typeof e&&!Array.isArray(e);t.isURL=e=>{try{return new URL(e),!0}catch(e){return!1}}},4029(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Version=void 0;var s=n(4712),i=n(330);function a(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class r{static sanitize(e,t,n=null){var s;const i=e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.loadedData);if(void 0===i)return null!==(s=void this.loadedLogger.warn(`Missing expected key path [ ${e.join(" -> ")} ] in stored data, defaulting to fallback value.`))&&void 0!==s?s:t;if("function"==typeof n){var a;const s=n(i);return void 0===s?null!==(a=void this.loadedLogger.warn(`Invalid value at key path [ ${e.join(" -> ")} ] in stored data, defaulting to fallback value.`))&&void 0!==a?a:t:s}return i}static exists(...e){return void 0!==e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.loadedData)}static deprecated(...e){var t;return!!this.exists(...e)&&(null===(t=void this.loadedLogger.warn(`Skipped deprecated key path [ ${e.join(" -> ")} ] in stored data.`,!0))||void 0===t||t)}static reset(...e){this.loadedLogger.warn(`Resetting key path [ ${e.join(" -> ")} ] in stored data to default value.`);const t=e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.default);if(void 0===t)return void this.loadedLogger.dev(`Could not find default value for key path [ ${e.join(" -> ")} ] in stored data.`);const n=e.pop();e.reduce((e,t)=>(void 0===e[t]&&(e[t]={}),e[t]),this.loadedData)[n]=t}static restrictObject(e,...t){var n;if(!(0,i.isObject)(e))return null!==(n=void this.reset(...t))&&void 0!==n&&n;const s=Object.keys(t.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.default));return Object.keys(e).forEach(n=>{s.includes(n)||(this.loadedLogger.warn(`Removing unexpected key [ ${[...t,n].join(" -> ")} ] from stored data.`),delete e[n])}),!0}static get default(){return{}}static init(e,t){return this.loadedLogger=e,this.loadedData=t,!0}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");return{}}static validate(){var e;const t=this.loadedData;return this.restrictObject(t),t.version===this.number||null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e}}t.Version=r,a(r,"loadedLogger",new s.Logger),a(r,"loadedData",{}),a(r,"number",0)},9458(e,t,n){var s,i,a,r,o=n(4029);o.Version.v0=(s=class extends o.Version{static get default(){return{version:0,changelog:"0",options:{maxQueueSize:50,maxEditCount:50,minimumORESScore:0,enableSoundAlerts:!0,soundAlertORESScore:.95,enableUsernameHighlighting:!0,enableWelcomeLatin:!1,enableAutoWelcome:!1,enableEditAnalysis:!1,enableUsernameAnalysis:!1,enableAutoReporting:!0,selectedAutoReportReasons:{Vandalism:!0,"Subtle vandalism":!0,"Image vandalism":!0,Sandbox:!0,Unsourced:!0,"Unsourced (BLP)":!0,"Unsourced genre":!0,POV:!1,Commentary:!0,"AI-generated":!0,"AI-generated (talk)":!0,"MOS violation":!1,Censoring:!1,Disruption:!0,Deleting:!0,Errors:!0,"Editing tests":!0,Chatting:!1,Jokes:!0,Owning:!1,Advertising:!0,"Spam links":!0,"Personal attacks":!0,TPO:!0,"AfD removal":!0},zen:{enabled:!1,sounds:!0,watchlist:!1,notifications:!0,editCount:!1,toasts:!1},enableCloudStorage:!0,masterVolume:.5,volumes:{click:.5,notification:.5,watchlist:.5,alert:.5,whoosh:.5,warn:.5,rollback:.5,report:.5,thank:.5,protection:.5,block:.5,sparkle:.5,success:.5,error:.5},soundMappings:{click:"click",notification:"notify",watchlist:"ping",alert:"alert",whoosh:"whoosh",warn:"warn",rollback:"rollback",report:"report",thank:"thank",protection:"protection",block:"block",sparkle:"sparkle",success:"success",error:"error"},watchlistExpiry:"1 week",whitelistExpiry:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlightedExpiry:{users:"1 week",pages:"1 week",tags:"1 week"},wiki:"en",namespacesShown:[0],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:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlightUser",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:"Mentor"}}]}],selectedPalette:0,theme:"theme-light"},statistics:{reviewed:0,reverts:0,reverts:0,reports:0,warnings:0,welcomes:0,whitelisted:0,highlighted:0,blocks:0,sessionStart:Date.now()},whitelist:{users:[],pages:[],tags:[]},highlighted:{users:[],pages:[],tags:[]},queueWidth:"15vw",detailsWidth:"15vw"}}},i=s,r=0,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},7345(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(4029);g.Version.v1=(s=class extends g.Version{static get default(){return{version:1,changelog:"3",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,recent:{enabled:!0,order:0},flagged:{enabled:!0,order:1},users:{enabled:!0,order:2},watchlist:{enabled:!0,order:3}},cloud_storage:{enabled:!0},username_highlighting:{enabled:!0,fuzzy:!0},auto_welcome:{enabled:!0},expiry:{watchlist:"1 week",whitelist:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlight:{users:"1 week",pages:"1 week",tags:"1 week"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Unsourced","Unsourced (BLP)","Unsourced genre","Commentary","AI-generated","AI-generated (talk)","Censoring",,"Disruption","Deleting","Errors","Editing tests","Jokes","Advertising","Spam links","Personal attacks","TPO","AfD removal"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.notice":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},notices:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}}},UI:{theme:{palette:0},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlightUser",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:"Auto"}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");this.deprecated("options","enableWelcomeLatin"),this.deprecated("options","volumes","whoosh"),this.deprecated("options","volumes","warn"),this.deprecated("options","volumes","rollback"),this.deprecated("options","volumes","thank"),this.deprecated("options","volumes","sparkle"),this.deprecated("options","volumes","watchlist"),this.deprecated("options","volumes","success"),this.deprecated("options","volumes","error"),this.deprecated("options","soundMappings"),this.deprecated("options","wiki"),this.deprecated("options","showTemps"),this.deprecated("options","showUsers"),this.deprecated("options","sortQueueItems"),this.deprecated("options","theme"),this.deprecated("options","zen","editCount"),this.deprecated("options","zen","watchlist");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:e.settings.performance.startup},namespaces:this.sanitize(["options","namespacesShown"],e.settings.namespaces),queue:{max_size:this.sanitize(["options","maxQueueSize"],e.settings.queue.max_size),max_edits:this.sanitize(["options","maxEditCount"],e.settings.queue.max_edits),min_ores:this.sanitize(["options","minimumORESScore"],e.settings.queue.min_ores),recent:{enabled:e.settings.queue.recent.enabled,order:e.settings.queue.recent.order},flagged:{enabled:e.settings.queue.flagged.enabled,order:e.settings.queue.flagged.order},users:{enabled:e.settings.queue.users.enabled,order:e.settings.queue.users.order},watchlist:{enabled:e.settings.queue.watchlist.enabled,order:e.settings.queue.watchlist.order}},cloud_storage:{enabled:this.sanitize(["options","enableCloudStorage"],e.settings.cloud_storage.enabled)},username_highlighting:{enabled:this.sanitize(["options","enableUsernameHighlighting"],e.settings.username_highlighting.enabled),fuzzy:e.settings.username_highlighting.fuzzy},auto_welcome:{enabled:this.sanitize(["options","enableAutoWelcome"],e.settings.auto_welcome.enabled)},expiry:{watchlist:this.sanitize(["options","watchlistExpiry"],e.settings.expiry.watchlist),whitelist:{users:this.sanitize(["options","whitelistExpiry","users"],e.settings.expiry.whitelist.users),pages:this.sanitize(["options","whitelistExpiry","pages"],e.settings.expiry.whitelist.pages),tags:this.sanitize(["options","whitelistExpiry","tags"],e.settings.expiry.whitelist.tags)},highlight:{users:this.sanitize(["options","highlightedExpiry","users"],e.settings.expiry.highlight.users),pages:this.sanitize(["options","highlightedExpiry","pages"],e.settings.expiry.highlight.pages),tags:this.sanitize(["options","highlightedExpiry","tags"],e.settings.expiry.highlight.tags)}},auto_report:{enabled:this.sanitize(["options","enableAutoReporting"],e.settings.auto_report.enabled),for:this.sanitize(["options","selectedAutoReportReasons"],e.settings.auto_report.for,e=>{if((0,o.isObject)(e))return e["AI-generated"]=e["AI-Generated"],delete e["AI-Generated"],e["AI-generated (talk)"]=e["AI-Generated (talk)"],delete e["AI-Generated (talk)"],Object.keys(e).filter(t=>!0===(null==e?void 0:e[t]))})},AI:{enabled:this.sanitize(["options","enableOllamaAI"],e.settings.AI.enabled),provider:e.settings.AI.provider,edit_analysis:{enabled:this.sanitize(["options","enableEditAnalysis"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["options","enableUsernameAnalysis"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["options","ollamaServerUrl"],e.settings.AI.Ollama.server),model:this.sanitize(["options","ollamaModel"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["options","enableSoundAlerts"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["options","soundAlertORESScore"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["options","masterVolume"],e.settings.audio.volume.master),"master.startup":e.settings.audio.volume["master.startup"],"master.music":e.settings.audio.volume["master.music"],"master.music.zen_mode":e.settings.audio.volume["master.music.zen_mode"],"master.ui":e.settings.audio.volume["master.ui"],"master.ui.click":this.sanitize(["options","volumes","click"],e.settings.audio.volume["master.ui.click"]),"master.queue":e.settings.audio.volume["master.queue"],"master.queue.ores":this.sanitize(["options","volumes","alert"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":e.settings.audio.volume["master.queue.mention"],"master.notification":e.settings.audio.volume["master.notification"],"master.notification.alert":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.alert"]),"master.notification.notice":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.notice"]),"master.notification.toast":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.toast"]),"master.action":e.settings.audio.volume["master.action"],"master.action.default":e.settings.audio.volume["master.action.default"],"master.action.failed":e.settings.audio.volume["master.action.failed"],"master.action.report":this.sanitize(["options","volumes","report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["options","volumes","block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["options","volumes","protection"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["options","zen","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["options","zen","sounds"],e.settings.zen_mode.sound.enabled)},music:{enabled:e.settings.zen_mode.music.enabled},alerts:{enabled:this.sanitize(["options","zen","notifications"],e.settings.zen_mode.alerts.enabled)},notices:{enabled:this.sanitize(["options","zen","notifications"],e.settings.zen_mode.notices.enabled)},toasts:{enabled:this.sanitize(["options","zen","toasts"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:e.settings.zen_mode.badges.enabled}}},UI:{theme:{palette:this.sanitize(["options","selectedPalette"],e.UI.theme.palette)},queue:{width:this.sanitize(["queueWidth"],e.UI.queue.width)},details:{width:this.sanitize(["detailsWidth"],e.UI.details.width)}},control_scripts:this.sanitize(["options","controlScripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name){if(!(e.condition in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else switch(e.name){case"welcome":if(!(0,o.isObject)(e.params))return!0;switch(e.params.template){case"Links":e.params.template="Graphical";break;case"Latin":e.params.template="Non-Latin";break;case"Mentor":return this.loadedLogger.warn(`Skipped deprecated "Mentor" welcome template at key [${[...n,s,"params","template"].join(" -> ")}].`,!0),!1}break;case"warn":if(!(0,o.isObject)(e.params))return!0;switch(e.params.warningType){case"AI-Generated":e.params.warningType="AI-generated";break;case"AI-Generated (talk)":e.params.warningType="AI-generated (talk)"}}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:e.statistics.edits_reviewed.total,thanked:e.statistics.edits_reviewed.thanked},recent_changes_reviewed:{total:e.statistics.recent_changes_reviewed.total},pending_changes_reviewed:{total:e.statistics.pending_changes_reviewed.total,accepted:e.statistics.pending_changes_reviewed.accepted,rejected:e.statistics.pending_changes_reviewed.rejected},watchlist_changes_reviewed:{total:e.statistics.watchlist_changes_reviewed.total},users_reviewed:{total:e.statistics.users_reviewed.total},reverts_made:{total:e.statistics.reverts_made.total,good_faith:e.statistics.reverts_made.good_faith,from_recent_changes:e.statistics.reverts_made.from_recent_changes,from_pending_changes:e.statistics.reverts_made.from_pending_changes,from_watchlist:e.statistics.reverts_made.from_watchlist,from_loaded_edits:e.statistics.reverts_made.from_loaded_edits},users_welcomed:{total:e.statistics.users_welcomed.total},warnings_issued:{total:e.statistics.warnings_issued.total,level_1:e.statistics.warnings_issued.level_1,level_2:e.statistics.warnings_issued.level_2,level_3:e.statistics.warnings_issued.level_3,level_4:e.statistics.warnings_issued.level_4,level_4im:e.statistics.warnings_issued.level_4im},reports_filed:{total:e.statistics.reports_filed.total,AIV:e.statistics.reports_filed.AIV,UAA:e.statistics.reports_filed.UAA,RFPP:e.statistics.reports_filed.RFPP},watchlist:{watched:e.statistics.watchlist.watched,unwatched:e.statistics.watchlist.unwatched},items_whitelisted:{total:e.statistics.items_whitelisted.total,users:e.statistics.items_whitelisted.users,pages:e.statistics.items_whitelisted.pages,tags:e.statistics.items_whitelisted.tags},items_highlighted:{total:e.statistics.items_highlighted.total,users:e.statistics.items_highlighted.users,pages:e.statistics.items_highlighted.pages,tags:e.statistics.items_highlighted.tags},blocks_issued:{total:e.statistics.blocks_issued.total},pages_protected:{total:e.statistics.pages_protected.total},actions_executed:{total:e.statistics.actions_executed.total,successful:e.statistics.actions_executed.successful},session_time:e.statistics.session_time},highlight:{users:this.sanitize(["highlighted","users"],e.highlight.users),pages:this.sanitize(["highlighted","pages"],e.highlight.pages),tags:this.sanitize(["highlighted","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),t.version!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const g=t.settings.namespaces;Array.isArray(g)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const h=t.settings.queue;this.restrictObject(h,"settings","queue");{const m=t.settings.queue.max_size;"number"==typeof m&&Number.isInteger(m)&&m>0||this.reset("settings","queue","max_size")}{const v=t.settings.queue.max_edits;"number"==typeof v&&Number.isInteger(v)&&v>0||this.reset("settings","queue","max_edits")}{const f=t.settings.queue.min_ores;"number"==typeof f&&f>=0&&f<=1||this.reset("settings","queue","min_ores")}["recent","flagged","users","watchlist"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const b=t.settings.cloud_storage;this.restrictObject(b,"settings","cloud_storage");"boolean"!=typeof t.settings.cloud_storage.enabled&&this.reset("settings","cloud_storage","enabled")}{const w=t.settings.username_highlighting;this.restrictObject(w,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const y=t.settings.auto_welcome;this.restrictObject(y,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const x=new Set(["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"]),k=t.settings.expiry;this.restrictObject(k,"settings","expiry");{const _=t.settings.expiry.watchlist;x.has(_)||this.reset("settings","expiry","watchlist")}{const S=t.settings.expiry.whitelist;this.restrictObject(S,"settings","expiry","whitelist");{const q=t.settings.expiry.whitelist.users;x.has(q)||this.reset("settings","expiry","whitelist","users")}{const E=t.settings.expiry.whitelist.pages;x.has(E)||this.reset("settings","expiry","whitelist","pages")}{const L=t.settings.expiry.whitelist.tags;x.has(L)||this.reset("settings","expiry","whitelist","tags")}}{const A=t.settings.expiry.highlight;this.restrictObject(A,"settings","expiry","highlight");{const T=t.settings.expiry.highlight.users;x.has(T)||this.reset("settings","expiry","highlight","users")}{const C=t.settings.expiry.highlight.pages;x.has(C)||this.reset("settings","expiry","highlight","pages")}{const z=t.settings.expiry.highlight.tags;x.has(z)||this.reset("settings","expiry","highlight","tags")}}}{const M=t.settings.auto_report;this.restrictObject(M,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const $=t.settings.auto_report.for;Array.isArray($)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const O=t.settings.AI;this.restrictObject(O,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const I=t.settings.AI.edit_analysis;this.restrictObject(I,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const P=t.settings.AI.username_analysis;this.restrictObject(P,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const j=t.settings.AI.Ollama;this.restrictObject(j,"settings","AI","Ollama");{const W=t.settings.AI.Ollama.server;(0,o.isURL)(W)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const D=t.settings.audio;this.restrictObject(D,"settings","audio");{const R=t.settings.audio.ores_alert;this.restrictObject(R,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const U=t.settings.audio.ores_alert.threshold;"number"==typeof U&&U>=0&&U<=1||this.reset("settings","audio","ores_alert","threshold")}}{const N=t.settings.audio.volume;this.restrictObject(N,"settings","audio","volume");const H=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.notice","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const F of H){const V=t.settings.audio.volume[F];"number"==typeof V&&V>=0&&V<=1||this.reset("settings","audio","volume",F)}}}{const B=t.settings.zen_mode;this.restrictObject(B,"settings","zen_mode");"boolean"!=typeof B.enabled&&this.reset("settings","zen_mode","enabled");{const G=t.settings.zen_mode.sound;this.restrictObject(G,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const Q=t.settings.zen_mode.music;this.restrictObject(Q,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const Y=t.settings.zen_mode.alerts;this.restrictObject(Y,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const Z=t.settings.zen_mode.notices;this.restrictObject(Z,"settings","zen_mode","notices");"boolean"!=typeof t.settings.zen_mode.notices.enabled&&this.reset("settings","zen_mode","notices","enabled")}{const K=t.settings.zen_mode.toasts;this.restrictObject(K,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const X=t.settings.zen_mode.badges;this.restrictObject(X,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}}{const J=t.UI;this.restrictObject(J,"UI");{const ee=t.UI.theme;this.restrictObject(ee,"UI","theme");{const te=t.UI.theme.palette;"number"==typeof te&&Number.isInteger(te)&&te>=0&&te<=3||this.reset("UI","theme","palette")}}{const ne=t.UI.queue;this.restrictObject(ne,"UI","queue");{const se=t.UI.queue.width;"string"==typeof se&&se.endsWith("vw")||this.reset("UI","queue","width");const ie=parseFloat(se.slice(0,-2));"number"==typeof ie&&!isNaN(ie)&&ie>=10&&ie<=30||this.reset("UI","queue","width")}}{const ae=t.UI.details;this.restrictObject(ae,"UI","details");{const re=t.UI.details.width;"string"==typeof re&&re.endsWith("vw")||this.reset("UI","details","width");const oe=parseFloat(re.slice(0,-2));"number"==typeof oe&&!isNaN(oe)&&oe>=10&&oe<=30||this.reset("UI","details","width")}}}{const le=t.control_scripts;function de(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name){var i;if(!(e.condition in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${e.condition} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]),e.actions=de.call(this,e.actions,...t,n,"actions")}else{var a;if(!(e.name in c.events))return this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`),!1;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=null!==(a=c.events[e.name].parameters)&&void 0!==a?a:[],i=new Set;for(const a of s)i.add(a.id),"choice"===a.type&&(a.id in e.params||(this.loadedLogger.warn(`Resetting missing choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]),a.options.includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]));for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(le)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>p.controls.has(e)),t.control_scripts[n].actions=de.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const ce=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,ue=t.statistics;this.restrictObject(ue,"statistics");{const pe=t.statistics.edits_reviewed;this.restrictObject(pe,"statistics","edits_reviewed");ce(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");ce(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const ge=t.statistics.recent_changes_reviewed;this.restrictObject(ge,"statistics","recent_changes_reviewed");ce(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const he=t.statistics.pending_changes_reviewed;this.restrictObject(he,"statistics","pending_changes_reviewed");ce(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");ce(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");ce(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const me=t.statistics.watchlist_changes_reviewed;this.restrictObject(me,"statistics","watchlist_changes_reviewed");ce(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const ve=t.statistics.users_reviewed;this.restrictObject(ve,"statistics","users_reviewed");ce(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const fe=t.statistics.reverts_made;this.restrictObject(fe,"statistics","reverts_made");ce(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");ce(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");ce(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");ce(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");ce(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");ce(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const be=t.statistics.users_welcomed;this.restrictObject(be,"statistics","users_welcomed");ce(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const we=t.statistics.warnings_issued;this.restrictObject(we,"statistics","warnings_issued");ce(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");ce(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");ce(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");ce(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");ce(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");ce(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const ye=t.statistics.reports_filed;this.restrictObject(ye,"statistics","reports_filed");ce(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");ce(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");ce(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");ce(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP")}{const xe=t.statistics.watchlist;this.restrictObject(xe,"statistics","watchlist");ce(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");ce(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const ke=t.statistics.items_whitelisted;this.restrictObject(ke,"statistics","items_whitelisted");ce(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");ce(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");ce(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");ce(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const _e=t.statistics.items_highlighted;this.restrictObject(_e,"statistics","items_highlighted");ce(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");ce(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");ce(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");ce(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const Se=t.statistics.blocks_issued;this.restrictObject(Se,"statistics","blocks_issued");ce(t.statistics.blocks_issued.total)||this.reset("statistics","blocks_issued","total")}{const qe=t.statistics.pages_protected;this.restrictObject(qe,"statistics","pages_protected");ce(t.statistics.pages_protected.total)||this.reset("statistics","pages_protected","total")}{const Ee=t.statistics.actions_executed;this.restrictObject(Ee,"statistics","actions_executed");ce(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");ce(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const Le=t.statistics.session_time;"number"==typeof Le&&Le>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Ae=t.highlight;this.restrictObject(Ae,"highlight");{const Te=t.highlight.users;Array.isArray(Te)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const Ce=t.highlight.pages;Array.isArray(Ce)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const ze=t.highlight.tags;Array.isArray(ze)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const Me=t.whitelist;this.restrictObject(Me,"whitelist");{const $e=t.whitelist.users;Array.isArray($e)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const Oe=t.whitelist.pages;Array.isArray(Oe)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const Ie=t.whitelist.tags;Array.isArray(Ie)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=1,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},7704(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(4029);g.Version.v2=(s=class extends g.Version{static get default(){return{version:2,changelog:"6",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,recent:{enabled:!0,order:0},flagged:{enabled:!0,order:1},users:{enabled:!0,order:2},watchlist:{enabled:!0,order:3}},cloud_storage:{enabled:!0},username_highlighting:{enabled:!0,fuzzy:!0},wikipedia_popups:{enabled:!0},auto_welcome:{enabled:!1},expiry:{watchlist:"1 week",whitelist:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlight:{users:"1 week",pages:"1 week",tags:"1 week"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Deliberate errors","Disruptive editing","Editing tests","Commentary","Inappropriate jokes","Deleting","Unsourced","Unsourced (BLP)","Unsourced genre","Original research","Censoring","AI-generated","AI-generated (talk)","Personal attacks","Harassment","TPO",,"AfD removal","Advertising","Spam links","Inappropriate edit summary","Misleading edit summary"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.notice":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},notices:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}},repeat_control_scripts:!0},UI:{theme:{palette:0},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warning:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]},{name:"highlightUser",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:"Auto"}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]},favorite:{warnings:[],reverts:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:this.sanitize(["settings","performance","startup"],e.settings.performance.startup)},namespaces:this.sanitize(["settings","namespaces"],e.settings.namespaces),queue:{max_size:this.sanitize(["settings","queue","max_size"],e.settings.queue.max_size),max_edits:this.sanitize(["settings","queue","max_edits"],e.settings.queue.max_edits),min_ores:this.sanitize(["settings","queue","min_ores"],e.settings.queue.min_ores),recent:{enabled:this.sanitize(["settings","queue","recent","enabled"],e.settings.queue.recent.enabled),order:this.sanitize(["settings","queue","recent","order"],e.settings.queue.recent.order)},flagged:{enabled:this.sanitize(["settings","queue","flagged","enabled"],e.settings.queue.flagged.enabled),order:this.sanitize(["settings","queue","flagged","order"],e.settings.queue.flagged.order)},users:{enabled:this.sanitize(["settings","queue","users","enabled"],e.settings.queue.users.enabled),order:this.sanitize(["settings","queue","users","order"],e.settings.queue.users.order)},watchlist:{enabled:this.sanitize(["settings","queue","watchlist","enabled"],e.settings.queue.watchlist.enabled),order:this.sanitize(["settings","queue","watchlist","order"],e.settings.queue.watchlist.order)}},cloud_storage:{enabled:this.sanitize(["settings","cloud_storage","enabled"],e.settings.cloud_storage.enabled)},username_highlighting:{enabled:this.sanitize(["settings","username_highlighting","enabled"],e.settings.username_highlighting.enabled),fuzzy:this.sanitize(["settings","username_highlighting","fuzzy"],e.settings.username_highlighting.fuzzy)},wikipedia_popups:{enabled:e.settings.wikipedia_popups.enabled},auto_welcome:{enabled:this.sanitize(["settings","auto_welcome","enabled"],e.settings.auto_welcome.enabled)},expiry:{watchlist:this.sanitize(["settings","expiry","watchlist"],e.settings.expiry.watchlist),whitelist:{users:this.sanitize(["settings","expiry","whitelist","users"],e.settings.expiry.whitelist.users),pages:this.sanitize(["settings","expiry","whitelist","pages"],e.settings.expiry.whitelist.pages),tags:this.sanitize(["settings","expiry","whitelist","tags"],e.settings.expiry.whitelist.tags)},highlight:{users:this.sanitize(["settings","expiry","highlight","users"],e.settings.expiry.highlight.users),pages:this.sanitize(["settings","expiry","highlight","pages"],e.settings.expiry.highlight.pages),tags:this.sanitize(["settings","expiry","highlight","tags"],e.settings.expiry.highlight.tags)}},auto_report:{enabled:this.sanitize(["settings","auto_report","enabled"],e.settings.auto_report.enabled),for:this.sanitize(["settings","auto_report","for"],e.settings.auto_report.for,e=>{if(!Array.isArray(e))return;const t=new Set(["Harassment","Inappropriate edit summary","Original research"]);return e.forEach(e=>{switch(e){case"Errors":return void t.add("Deliberate errors");case"Disruption":return void t.add("Disruptive editing");case"Jokes":return void t.add("Inappropriate jokes")}t.add(e)}),[...t]})},AI:{enabled:this.sanitize(["settings","AI","enabled"],e.settings.AI.enabled),provider:this.sanitize(["settings","AI","provider"],e.settings.AI.provider),edit_analysis:{enabled:this.sanitize(["settings","AI","edit_analysis","enabled"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["settings","AI","username_analysis","enabled"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["settings","AI","Ollama","server"],e.settings.AI.Ollama.server),model:this.sanitize(["settings","AI","Ollama","model"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["settings","audio","ores_alert","enabled"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["settings","audio","ores_alert","threshold"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["settings","audio","volume","master"],e.settings.audio.volume.master),"master.startup":this.sanitize(["settings","audio","volume","master.startup"],e.settings.audio.volume["master.startup"]),"master.music":this.sanitize(["settings","audio","volume","master.music"],e.settings.audio.volume["master.music"]),"master.music.zen_mode":this.sanitize(["settings","audio","volume","master.music.zen_mode"],e.settings.audio.volume["master.music.zen_mode"]),"master.ui":this.sanitize(["settings","audio","volume","master.ui"],e.settings.audio.volume["master.ui"]),"master.ui.click":this.sanitize(["settings","audio","volume","master.ui.click"],e.settings.audio.volume["master.ui.click"]),"master.queue":this.sanitize(["settings","audio","volume","master.queue"],e.settings.audio.volume["master.queue"]),"master.queue.ores":this.sanitize(["settings","audio","volume","master.queue.ores"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":this.sanitize(["settings","audio","volume","master.queue.mention"],e.settings.audio.volume["master.queue.mention"]),"master.notification":this.sanitize(["settings","audio","volume","master.notification"],e.settings.audio.volume["master.notification"]),"master.notification.alert":this.sanitize(["settings","audio","volume","master.notification.alert"],e.settings.audio.volume["master.notification.alert"]),"master.notification.notice":this.sanitize(["settings","audio","volume","master.notification.notice"],e.settings.audio.volume["master.notification.notice"]),"master.notification.toast":this.sanitize(["settings","audio","volume","master.notification.toast"],e.settings.audio.volume["master.notification.toast"]),"master.action":this.sanitize(["settings","audio","volume","master.action"],e.settings.audio.volume["master.action"]),"master.action.default":this.sanitize(["settings","audio","volume","master.action.default"],e.settings.audio.volume["master.action.default"]),"master.action.failed":this.sanitize(["settings","audio","volume","master.action.failed"],e.settings.audio.volume["master.action.failed"]),"master.action.report":this.sanitize(["settings","audio","volume","master.action.report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["settings","audio","volume","master.action.block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["settings","audio","volume","master.action.protect"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["settings","zen_mode","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["settings","zen_mode","sound","enabled"],e.settings.zen_mode.sound.enabled)},music:{enabled:this.sanitize(["settings","zen_mode","music","enabled"],e.settings.zen_mode.music.enabled)},alerts:{enabled:this.sanitize(["settings","zen_mode","alerts","enabled"],e.settings.zen_mode.alerts.enabled)},notices:{enabled:this.sanitize(["settings","zen_mode","notices","enabled"],e.settings.zen_mode.notices.enabled)},toasts:{enabled:this.sanitize(["settings","zen_mode","toasts","enabled"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:this.sanitize(["settings","zen_mode","badges","enabled"],e.settings.zen_mode.badges.enabled)}},repeat_control_scripts:e.settings.repeat_control_scripts},UI:{theme:{palette:this.sanitize(["UI","theme","palette"],e.UI.theme.palette)},queue:{width:this.sanitize(["UI","queue","width"],e.UI.queue.width)},details:{width:this.sanitize(["UI","details","width"],e.UI.details.width)}},control_scripts:this.sanitize(["control_scripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name){if(!(e.condition in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else if("warn"===e.name){if(!(0,o.isObject)(e.params))return!0;e.params.warning=e.params.warningType,delete e.params.warningType}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:this.sanitize(["statistics","edits_reviewed","total"],e.statistics.edits_reviewed.total),thanked:this.sanitize(["statistics","edits_reviewed","thanked"],e.statistics.edits_reviewed.thanked)},recent_changes_reviewed:{total:this.sanitize(["statistics","recent_changes_reviewed","total"],e.statistics.recent_changes_reviewed.total)},pending_changes_reviewed:{total:this.sanitize(["statistics","pending_changes_reviewed","total"],e.statistics.pending_changes_reviewed.total),accepted:this.sanitize(["statistics","pending_changes_reviewed","accepted"],e.statistics.pending_changes_reviewed.accepted),rejected:this.sanitize(["statistics","pending_changes_reviewed","rejected"],e.statistics.pending_changes_reviewed.rejected)},watchlist_changes_reviewed:{total:this.sanitize(["statistics","watchlist_changes_reviewed","total"],e.statistics.watchlist_changes_reviewed.total)},users_reviewed:{total:this.sanitize(["statistics","users_reviewed","total"],e.statistics.users_reviewed.total)},reverts_made:{total:this.sanitize(["statistics","reverts_made","total"],e.statistics.reverts_made.total),good_faith:this.sanitize(["statistics","reverts_made","good_faith"],e.statistics.reverts_made.good_faith),from_recent_changes:this.sanitize(["statistics","reverts_made","from_recent_changes"],e.statistics.reverts_made.from_recent_changes),from_pending_changes:this.sanitize(["statistics","reverts_made","from_pending_changes"],e.statistics.reverts_made.from_pending_changes),from_watchlist:this.sanitize(["statistics","reverts_made","from_watchlist"],e.statistics.reverts_made.from_watchlist),from_loaded_edits:this.sanitize(["statistics","reverts_made","from_loaded_edits"],e.statistics.reverts_made.from_loaded_edits)},users_welcomed:{total:this.sanitize(["statistics","users_welcomed","total"],e.statistics.users_welcomed.total)},warnings_issued:{total:this.sanitize(["statistics","warnings_issued","total"],e.statistics.warnings_issued.total),level_1:this.sanitize(["statistics","warnings_issued","level_1"],e.statistics.warnings_issued.level_1),level_2:this.sanitize(["statistics","warnings_issued","level_2"],e.statistics.warnings_issued.level_2),level_3:this.sanitize(["statistics","warnings_issued","level_3"],e.statistics.warnings_issued.level_3),level_4:this.sanitize(["statistics","warnings_issued","level_4"],e.statistics.warnings_issued.level_4),level_4im:this.sanitize(["statistics","warnings_issued","level_4im"],e.statistics.warnings_issued.level_4im)},reports_filed:{total:this.sanitize(["statistics","reports_filed","total"],e.statistics.reports_filed.total),AIV:this.sanitize(["statistics","reports_filed","AIV"],e.statistics.reports_filed.AIV),UAA:this.sanitize(["statistics","reports_filed","UAA"],e.statistics.reports_filed.UAA),RFPP:this.sanitize(["statistics","reports_filed","RFPP"],e.statistics.reports_filed.RFPP)},watchlist:{watched:this.sanitize(["statistics","watchlist","watched"],e.statistics.watchlist.watched),unwatched:this.sanitize(["statistics","watchlist","unwatched"],e.statistics.watchlist.unwatched)},items_whitelisted:{total:this.sanitize(["statistics","items_whitelisted","total"],e.statistics.items_whitelisted.total),users:this.sanitize(["statistics","items_whitelisted","users"],e.statistics.items_whitelisted.users),pages:this.sanitize(["statistics","items_whitelisted","pages"],e.statistics.items_whitelisted.pages),tags:this.sanitize(["statistics","items_whitelisted","tags"],e.statistics.items_whitelisted.tags)},items_highlighted:{total:this.sanitize(["statistics","items_highlighted","total"],e.statistics.items_highlighted.total),users:this.sanitize(["statistics","items_highlighted","users"],e.statistics.items_highlighted.users),pages:this.sanitize(["statistics","items_highlighted","pages"],e.statistics.items_highlighted.pages),tags:this.sanitize(["statistics","items_highlighted","tags"],e.statistics.items_highlighted.tags)},blocks_issued:{total:this.sanitize(["statistics","blocks_issued","total"],e.statistics.blocks_issued.total)},pages_protected:{total:this.sanitize(["statistics","pages_protected","total"],e.statistics.pages_protected.total)},actions_executed:{total:this.sanitize(["statistics","actions_executed","total"],e.statistics.actions_executed.total),successful:this.sanitize(["statistics","actions_executed","successful"],e.statistics.actions_executed.successful)},session_time:this.sanitize(["statistics","session_time"],e.statistics.session_time)},highlight:{users:this.sanitize(["highlight","users"],e.highlight.users),pages:this.sanitize(["highlight","pages"],e.highlight.pages),tags:this.sanitize(["highlight","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)},favorite:{warnings:e.favorite.warnings,reverts:e.favorite.reverts}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),t.version!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const g=t.settings.namespaces;Array.isArray(g)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const h=t.settings.queue;this.restrictObject(h,"settings","queue");{const m=t.settings.queue.max_size;"number"==typeof m&&Number.isInteger(m)&&m>0||this.reset("settings","queue","max_size")}{const v=t.settings.queue.max_edits;"number"==typeof v&&Number.isInteger(v)&&v>0||this.reset("settings","queue","max_edits")}{const f=t.settings.queue.min_ores;"number"==typeof f&&f>=0&&f<=1||this.reset("settings","queue","min_ores")}["recent","flagged","users","watchlist"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const b=t.settings.cloud_storage;this.restrictObject(b,"settings","cloud_storage");"boolean"!=typeof t.settings.cloud_storage.enabled&&this.reset("settings","cloud_storage","enabled")}{const w=t.settings.username_highlighting;this.restrictObject(w,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const y=t.settings.wikipedia_popups;this.restrictObject(y,"settings","wikipedia_popups");"boolean"!=typeof t.settings.wikipedia_popups.enabled&&this.reset("settings","wikipedia_popups","enabled")}{const x=t.settings.auto_welcome;this.restrictObject(x,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const k=new Set(["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"]),_=t.settings.expiry;this.restrictObject(_,"settings","expiry");{const S=t.settings.expiry.watchlist;k.has(S)||this.reset("settings","expiry","watchlist")}{const q=t.settings.expiry.whitelist;this.restrictObject(q,"settings","expiry","whitelist");{const E=t.settings.expiry.whitelist.users;k.has(E)||this.reset("settings","expiry","whitelist","users")}{const L=t.settings.expiry.whitelist.pages;k.has(L)||this.reset("settings","expiry","whitelist","pages")}{const A=t.settings.expiry.whitelist.tags;k.has(A)||this.reset("settings","expiry","whitelist","tags")}}{const T=t.settings.expiry.highlight;this.restrictObject(T,"settings","expiry","highlight");{const C=t.settings.expiry.highlight.users;k.has(C)||this.reset("settings","expiry","highlight","users")}{const z=t.settings.expiry.highlight.pages;k.has(z)||this.reset("settings","expiry","highlight","pages")}{const M=t.settings.expiry.highlight.tags;k.has(M)||this.reset("settings","expiry","highlight","tags")}}}{const $=t.settings.auto_report;this.restrictObject($,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const O=t.settings.auto_report.for;Array.isArray(O)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const I=t.settings.AI;this.restrictObject(I,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const P=t.settings.AI.edit_analysis;this.restrictObject(P,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const j=t.settings.AI.username_analysis;this.restrictObject(j,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const W=t.settings.AI.Ollama;this.restrictObject(W,"settings","AI","Ollama");{const D=t.settings.AI.Ollama.server;(0,o.isURL)(D)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const R=t.settings.audio;this.restrictObject(R,"settings","audio");{const U=t.settings.audio.ores_alert;this.restrictObject(U,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const N=t.settings.audio.ores_alert.threshold;"number"==typeof N&&N>=0&&N<=1||this.reset("settings","audio","ores_alert","threshold")}}{const H=t.settings.audio.volume;this.restrictObject(H,"settings","audio","volume");const F=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.notice","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const V of F){const B=t.settings.audio.volume[V];"number"==typeof B&&B>=0&&B<=1||this.reset("settings","audio","volume",V)}}}{const G=t.settings.zen_mode;this.restrictObject(G,"settings","zen_mode");"boolean"!=typeof G.enabled&&this.reset("settings","zen_mode","enabled");{const Q=t.settings.zen_mode.sound;this.restrictObject(Q,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const Y=t.settings.zen_mode.music;this.restrictObject(Y,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const Z=t.settings.zen_mode.alerts;this.restrictObject(Z,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const K=t.settings.zen_mode.notices;this.restrictObject(K,"settings","zen_mode","notices");"boolean"!=typeof t.settings.zen_mode.notices.enabled&&this.reset("settings","zen_mode","notices","enabled")}{const X=t.settings.zen_mode.toasts;this.restrictObject(X,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const J=t.settings.zen_mode.badges;this.restrictObject(J,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}"boolean"!=typeof t.settings.repeat_control_scripts&&this.reset("settings","repeat_control_scripts")}{const ee=t.UI;this.restrictObject(ee,"UI");{const te=t.UI.theme;this.restrictObject(te,"UI","theme");{const ne=t.UI.theme.palette;"number"==typeof ne&&Number.isInteger(ne)&&ne>=0&&ne<=3||this.reset("UI","theme","palette")}}{const se=t.UI.queue;this.restrictObject(se,"UI","queue");{const ie=t.UI.queue.width;"string"==typeof ie&&ie.endsWith("vw")||this.reset("UI","queue","width");const ae=parseFloat(ie.slice(0,-2));"number"==typeof ae&&!isNaN(ae)&&ae>=10&&ae<=30||this.reset("UI","queue","width")}}{const re=t.UI.details;this.restrictObject(re,"UI","details");{const oe=t.UI.details.width;"string"==typeof oe&&oe.endsWith("vw")||this.reset("UI","details","width");const le=parseFloat(oe.slice(0,-2));"number"==typeof le&&!isNaN(le)&&le>=10&&le<=30||this.reset("UI","details","width")}}}{const de=t.control_scripts;function ce(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name){var i;if(!(e.condition in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${e.condition} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]),e.actions=ce.call(this,e.actions,...t,n,"actions")}else{var a,r;if(!(e.name in c.events))return null!==(a=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`))&&void 0!==a&&a;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=null!==(r=c.events[e.name].parameters)&&void 0!==r?r:[],i=new Set;for(const a of s)i.add(a.id),"choice"===a.type&&(a.id in e.params||(this.loadedLogger.warn(`Resetting missing choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]),a.options.includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]));for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(de)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>p.controls.has(e)),t.control_scripts[n].actions=ce.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const ue=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,pe=t.statistics;this.restrictObject(pe,"statistics");{const ge=t.statistics.edits_reviewed;this.restrictObject(ge,"statistics","edits_reviewed");ue(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");ue(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const he=t.statistics.recent_changes_reviewed;this.restrictObject(he,"statistics","recent_changes_reviewed");ue(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const me=t.statistics.pending_changes_reviewed;this.restrictObject(me,"statistics","pending_changes_reviewed");ue(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");ue(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");ue(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const ve=t.statistics.watchlist_changes_reviewed;this.restrictObject(ve,"statistics","watchlist_changes_reviewed");ue(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const fe=t.statistics.users_reviewed;this.restrictObject(fe,"statistics","users_reviewed");ue(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const be=t.statistics.reverts_made;this.restrictObject(be,"statistics","reverts_made");ue(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");ue(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");ue(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");ue(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");ue(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");ue(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const we=t.statistics.users_welcomed;this.restrictObject(we,"statistics","users_welcomed");ue(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const ye=t.statistics.warnings_issued;this.restrictObject(ye,"statistics","warnings_issued");ue(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");ue(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");ue(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");ue(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");ue(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");ue(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const xe=t.statistics.reports_filed;this.restrictObject(xe,"statistics","reports_filed");ue(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");ue(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");ue(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");ue(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP")}{const ke=t.statistics.watchlist;this.restrictObject(ke,"statistics","watchlist");ue(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");ue(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const _e=t.statistics.items_whitelisted;this.restrictObject(_e,"statistics","items_whitelisted");ue(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");ue(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");ue(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");ue(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const Se=t.statistics.items_highlighted;this.restrictObject(Se,"statistics","items_highlighted");ue(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");ue(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");ue(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");ue(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const qe=t.statistics.blocks_issued;this.restrictObject(qe,"statistics","blocks_issued");ue(t.statistics.blocks_issued.total)||this.reset("statistics","blocks_issued","total")}{const Ee=t.statistics.pages_protected;this.restrictObject(Ee,"statistics","pages_protected");ue(t.statistics.pages_protected.total)||this.reset("statistics","pages_protected","total")}{const Le=t.statistics.actions_executed;this.restrictObject(Le,"statistics","actions_executed");ue(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");ue(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const Ae=t.statistics.session_time;"number"==typeof Ae&&Ae>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Te=t.highlight;this.restrictObject(Te,"highlight");{const Ce=t.highlight.users;Array.isArray(Ce)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const ze=t.highlight.pages;Array.isArray(ze)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const Me=t.highlight.tags;Array.isArray(Me)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const $e=t.whitelist;this.restrictObject($e,"whitelist");{const Oe=t.whitelist.users;Array.isArray(Oe)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const Ie=t.whitelist.pages;Array.isArray(Ie)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const Pe=t.whitelist.tags;Array.isArray(Pe)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}{const je=t.favorite;this.restrictObject(je,"favorite");{const We=t.favorite.warnings;Array.isArray(We)||this.reset("favorite","warnings"),t.favorite.warnings=t.favorite.warnings.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite warning [ ${e} ] from stored data.`),t})}{const De=t.favorite.reverts;Array.isArray(De)||this.reset("favorite","reverts"),t.favorite.reverts=t.favorite.reverts.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite revert [ ${e} ] from stored data.`),t})}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=2,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},8415(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(3241),h=n(5564),m=n(8469),v=n(4029);v.Version.v3=(s=class extends v.Version{static get default(){return{version:3,changelog:"6",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,ores_bias:.5,recent:{enabled:!0,order:0},pending:{enabled:!0,order:1},users:{enabled:!1,order:2},watchlist:{enabled:!0,order:3},abuselog:{enabled:!0,order:4}},username_highlighting:{enabled:!0,fuzzy:!1},wikipedia_popups:{enabled:!0},auto_welcome:{enabled:!1},talk_page_thanks_for_temporary_users:{enabled:!0},expiry:{watchlist:"1W",whitelist:{users:"infinity",pages:"infinity",tags:"infinity"},highlight:{users:"1W",pages:"1W",tags:"1W"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Deliberate errors","Disruptive editing","Editing tests","Commentary","Inappropriate jokes","Deleting","Unsourced","Unsourced (BLP)","Unsourced genre","Original research","Censoring","AI-generated","AI-generated (talk)","Personal attacks","Harassment","TPO","AfD removal","Advertising","Spam links","Attempt","Inappropriate edit summary","Misleading edit summary"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.message":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},messages:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}},accessibility:{colorblind:!1,dyslexia:!1,high_contrast:!1,reduce_motion:!1},repeat_control_scripts:!0},UI:{theme:{app:"auto",palette:"traffic"},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"," "],actions:[{name:"next-item",params:{}}]},{keys:["arrowleft"],actions:[{name:"previous-item",params:{}}]},{keys:["q"],actions:[{name:"next-item",params:{}},{name:"revert",params:{warning:"Vandalism"}},{name:"highlight-user",params:{}}]},{keys:["h"],actions:[{name:"open-page-history",params:{}}]},{keys:["c"],actions:[{name:"open-user-contributions",params:{}}]},{keys:["t"],actions:[{name:"thank-user",params:{}}]},{keys:["w"],actions:[{name:"welcome-user",params:{}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},abuselogs_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_abuselogs:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0,global_blocks:0,global_locks:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]},favorite:{warnings:[],reverts:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");this.deprecated("settings","cloud_storage");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:this.sanitize(["settings","performance","startup"],e.settings.performance.startup)},namespaces:this.sanitize(["settings","namespaces"],e.settings.namespaces),queue:{max_size:this.sanitize(["settings","queue","max_size"],e.settings.queue.max_size),max_edits:this.sanitize(["settings","queue","max_edits"],e.settings.queue.max_edits),min_ores:this.sanitize(["settings","queue","min_ores"],e.settings.queue.min_ores),ores_bias:e.settings.queue.ores_bias,recent:{enabled:this.sanitize(["settings","queue","recent","enabled"],e.settings.queue.recent.enabled),order:this.sanitize(["settings","queue","recent","order"],e.settings.queue.recent.order)},pending:{enabled:this.sanitize(["settings","queue","flagged","enabled"],e.settings.queue.pending.enabled),order:this.sanitize(["settings","queue","flagged","order"],e.settings.queue.pending.order)},users:{enabled:this.sanitize(["settings","queue","users","enabled"],e.settings.queue.users.enabled),order:this.sanitize(["settings","queue","users","order"],e.settings.queue.users.order)},watchlist:{enabled:this.sanitize(["settings","queue","watchlist","enabled"],e.settings.queue.watchlist.enabled),order:this.sanitize(["settings","queue","watchlist","order"],e.settings.queue.watchlist.order)},abuselog:{enabled:e.settings.queue.abuselog.enabled,order:e.settings.queue.abuselog.order}},username_highlighting:{enabled:this.sanitize(["settings","username_highlighting","enabled"],e.settings.username_highlighting.enabled),fuzzy:this.sanitize(["settings","username_highlighting","fuzzy"],e.settings.username_highlighting.fuzzy)},wikipedia_popups:{enabled:e.settings.wikipedia_popups.enabled},auto_welcome:{enabled:this.sanitize(["settings","auto_welcome","enabled"],e.settings.auto_welcome.enabled)},talk_page_thanks_for_temporary_users:{enabled:e.settings.talk_page_thanks_for_temporary_users.enabled},expiry:{watchlist:this.sanitize(["settings","expiry","watchlist"],e.settings.expiry.watchlist,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),whitelist:{users:this.sanitize(["settings","expiry","whitelist","users"],e.settings.expiry.whitelist.users,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),pages:this.sanitize(["settings","expiry","whitelist","pages"],e.settings.expiry.whitelist.pages,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),tags:this.sanitize(["settings","expiry","whitelist","tags"],e.settings.expiry.whitelist.tags,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e]))},highlight:{users:this.sanitize(["settings","expiry","highlight","users"],e.settings.expiry.highlight.users,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),pages:this.sanitize(["settings","expiry","highlight","pages"],e.settings.expiry.highlight.pages,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),tags:this.sanitize(["settings","expiry","highlight","tags"],e.settings.expiry.highlight.tags,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e]))}},auto_report:{enabled:this.sanitize(["settings","auto_report","enabled"],e.settings.auto_report.enabled),for:this.sanitize(["settings","auto_report","for"],e.settings.auto_report.for,e=>{if(!Array.isArray(e))return;const t=new Set(["Attempt"]);return e.forEach(e=>t.add(e)),[...t]})},AI:{enabled:this.sanitize(["settings","AI","enabled"],e.settings.AI.enabled),provider:this.sanitize(["settings","AI","provider"],e.settings.AI.provider),edit_analysis:{enabled:this.sanitize(["settings","AI","edit_analysis","enabled"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["settings","AI","username_analysis","enabled"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["settings","AI","Ollama","server"],e.settings.AI.Ollama.server),model:this.sanitize(["settings","AI","Ollama","model"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["settings","audio","ores_alert","enabled"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["settings","audio","ores_alert","threshold"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["settings","audio","volume","master"],e.settings.audio.volume.master),"master.startup":this.sanitize(["settings","audio","volume","master.startup"],e.settings.audio.volume["master.startup"]),"master.music":this.sanitize(["settings","audio","volume","master.music"],e.settings.audio.volume["master.music"]),"master.music.zen_mode":this.sanitize(["settings","audio","volume","master.music.zen_mode"],e.settings.audio.volume["master.music.zen_mode"]),"master.ui":this.sanitize(["settings","audio","volume","master.ui"],e.settings.audio.volume["master.ui"]),"master.ui.click":this.sanitize(["settings","audio","volume","master.ui.click"],e.settings.audio.volume["master.ui.click"]),"master.queue":this.sanitize(["settings","audio","volume","master.queue"],e.settings.audio.volume["master.queue"]),"master.queue.ores":this.sanitize(["settings","audio","volume","master.queue.ores"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":this.sanitize(["settings","audio","volume","master.queue.mention"],e.settings.audio.volume["master.queue.mention"]),"master.notification":this.sanitize(["settings","audio","volume","master.notification"],e.settings.audio.volume["master.notification"]),"master.notification.alert":this.sanitize(["settings","audio","volume","master.notification.alert"],e.settings.audio.volume["master.notification.alert"]),"master.notification.message":this.sanitize(["settings","audio","volume","master.notification.notice"],e.settings.audio.volume["master.notification.message"]),"master.notification.toast":this.sanitize(["settings","audio","volume","master.notification.toast"],e.settings.audio.volume["master.notification.toast"]),"master.action":this.sanitize(["settings","audio","volume","master.action"],e.settings.audio.volume["master.action"]),"master.action.default":this.sanitize(["settings","audio","volume","master.action.default"],e.settings.audio.volume["master.action.default"]),"master.action.failed":this.sanitize(["settings","audio","volume","master.action.failed"],e.settings.audio.volume["master.action.failed"]),"master.action.report":this.sanitize(["settings","audio","volume","master.action.report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["settings","audio","volume","master.action.block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["settings","audio","volume","master.action.protect"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["settings","zen_mode","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["settings","zen_mode","sound","enabled"],e.settings.zen_mode.sound.enabled)},music:{enabled:this.sanitize(["settings","zen_mode","music","enabled"],e.settings.zen_mode.music.enabled)},alerts:{enabled:this.sanitize(["settings","zen_mode","alerts","enabled"],e.settings.zen_mode.alerts.enabled)},messages:{enabled:this.sanitize(["settings","zen_mode","notices","enabled"],e.settings.zen_mode.messages.enabled)},toasts:{enabled:this.sanitize(["settings","zen_mode","toasts","enabled"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:this.sanitize(["settings","zen_mode","badges","enabled"],e.settings.zen_mode.badges.enabled)}},accessibility:{colorblind:e.settings.accessibility.colorblind,dyslexia:e.settings.accessibility.dyslexia,high_contrast:e.settings.accessibility.high_contrast,reduce_motion:e.settings.accessibility.reduce_motion},repeat_control_scripts:this.sanitize(["settings","repeat_control_scripts"],e.settings.repeat_control_scripts)},UI:{theme:{app:e.UI.theme.app,palette:this.sanitize(["UI","theme","palette"],e.UI.theme.palette,t=>["traffic","heat","natural","cool"][t]||e.UI.theme.palette)},queue:{width:this.sanitize(["UI","queue","width"],e.UI.queue.width)},details:{width:this.sanitize(["UI","details","width"],e.UI.details.width)}},control_scripts:this.sanitize(["control_scripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name||"if not"===e.name){var i,a;const r="if not"===e.name,o=()=>e.name=r?"if":"if not";switch("string"==typeof e.condition&&(e.condition={name:e.condition,params:{}}),null!==(a=(i=e.condition).params)&&void 0!==a||(i.params={}),e.condition.name){case"operatorNonAdmin":o();case"operatorAdmin":e.condition.name="account-admin";break;case"userIsHighlighted":e.condition.name="username-highlighted";break;case"userIsWhitelisted":e.condition.name="username-whitelisted";break;case"pageIsWhitelisted":e.condition.name="page-whitelisted";break;case"userIsAnon":o();case"userIsRegistered":e.codition.name="user-registered";break;case"userIsIP":e.condition.name="user-ip";break;case"userIsTemp":e.condition.name="user-temp";break;case"userHasEmptyTalkPage":e.condition.name="user-empty-talk";break;case"editIsMajor":o();case"editIsMinor":e.condition.name="edit-minor";break;case"editSizeNegative":e.condition.name="edit-size",e.condition.params={condition:"<",size:0};break;case"editSizePositive":e.condition.name="edit-size",e.condition.params={condition:">",size:0};break;case"editSizeLarge":e.condition.name="abs-edit-size",e.condition.params={condition:"≥",size:1e3};break;case"userEditCountLow":e.condition.name="user-edit-count",e.condition.params={condition:"<",count:10};break;case"userEditCountHigh":e.condition.name="user-edit-count",e.condition.params={condition:"≥",count:100};break;case"atFinalWarning":e.condition.name="user-final-warning";break;case"userNoWarnings":o();case"userHasWarnings":e.condition.name="user-has-warnings"}if(!(e.condition.name in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else{var r;switch(null!==(r=e.params)&&void 0!==r||(e.params={}),e.name){case"toggleZenMode":e.name="toggle-zen-mode";break;case"acceptFlaggedEdit":if(e.name="accept-pending-edit",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.reason,delete e.params.reason;break;case"rejectFlaggedEdit":if(e.name="reject-pending-edit",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.reason,delete e.params.reason;break;case"prevEdit":e.name="previous-item";break;case"nextEdit":e.name="next-item";break;case"deleteQueue":e.name="clear-queue";break;case"openRevertMenu":e.name="open-revert-menu";break;case"openWarnMenu":e.name="open-warn-menu";break;case"openUserPage":e.name="open-user-page";break;case"openUserTalk":e.name="open-user-talk";break;case"openUserContribs":e.name="open-user-contributions";break;case"openFilterLog":e.name="open-user-filter-log";break;case"openPage":e.name="open-page";break;case"openTalk":e.name="open-page-talk";break;case"openHistory":e.name="open-page-history";break;case"openRevision":e.name="open-revision";break;case"openDiff":e.name="open-diff";break;case"switchToRecentQueue":e.name="switch-to-recent-queue";break;case"switchToFlaggedQueue":e.name="switch-to-pending-queue";break;case"switchToUsersQueue":e.name="switch-to-users-queue";break;case"switchToWatchlistQueue":e.name="switch-to-watchlist-queue";break;case"watchPage":e.name="watch-page";break;case"unwatchPage":e.name="unwatch-page";break;case"whitelistUser":e.name="whitelist-user";break;case"whitelistPage":e.name="whitelist-page";break;case"unwhitelistUser":e.name="unwhitelist-user";break;case"unwhitelistPage":e.name="unwhitelist-page";break;case"highlightUser":e.name="highlight-user";break;case"highlightPage":e.name="highlight-page";break;case"unwhitelistUser":e.name="unhighlight-user";break;case"unwhitelistPage":e.name="unhighlight-page";break;case"thankUser":e.name="thank-user";break;case"warn":e.name="warn-user";break;case"rollback":if(e.name="rollback-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"rollbackGoodFaith":if(e.name="rollback-goodfaith-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"undo":if(e.name="undo-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"reportToAIV":if(e.name="report-user-to-aiv",!(0,o.isObject)(e.params))return!0;e.params.reason=e.params.reportMessage,delete e.params.reportMessage,e.params.summary=e.params.comment,delete e.params.comment;break;case"reportToUAA":if(e.name="report-user-to-uaa",!(0,o.isObject)(e.params))return!0;e.params.reason=e.params.reportMessage,delete e.params.reportMessage,e.params.summary=e.params.comment,delete e.params.comment;break;case"requestProtection":if(e.name="request-page-protection",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.comment,delete e.params.comment;break;case"welcome":e.name="welcome-user";break;case"toggleConsecutive":e.name="toggle-consecutive-edits";break;case"block":return this.loadedLogger.warn(`Skipping deprecated action 'block' in control script at ${[...n,s].join(" -> ")}.`),!1;case"protect":return this.loadedLogger.warn(`Skipping deprecated action 'protect' in control script at ${[...n,s].join(" -> ")}.`),!1;case"openSettings":return this.loadedLogger.warn(`Skipping deprecated action 'openSettings' in control script at ${[...n,s].join(" -> ")}.`),!1}}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:this.sanitize(["statistics","edits_reviewed","total"],e.statistics.edits_reviewed.total),thanked:this.sanitize(["statistics","edits_reviewed","thanked"],e.statistics.edits_reviewed.thanked)},recent_changes_reviewed:{total:this.sanitize(["statistics","recent_changes_reviewed","total"],e.statistics.recent_changes_reviewed.total)},pending_changes_reviewed:{total:this.sanitize(["statistics","pending_changes_reviewed","total"],e.statistics.pending_changes_reviewed.total),accepted:this.sanitize(["statistics","pending_changes_reviewed","accepted"],e.statistics.pending_changes_reviewed.accepted),rejected:this.sanitize(["statistics","pending_changes_reviewed","rejected"],e.statistics.pending_changes_reviewed.rejected)},watchlist_changes_reviewed:{total:this.sanitize(["statistics","watchlist_changes_reviewed","total"],e.statistics.watchlist_changes_reviewed.total)},users_reviewed:{total:this.sanitize(["statistics","users_reviewed","total"],e.statistics.users_reviewed.total)},abuselogs_reviewed:{total:e.statistics.abuselogs_reviewed.total},reverts_made:{total:this.sanitize(["statistics","reverts_made","total"],e.statistics.reverts_made.total),good_faith:this.sanitize(["statistics","reverts_made","good_faith"],e.statistics.reverts_made.good_faith),from_recent_changes:this.sanitize(["statistics","reverts_made","from_recent_changes"],e.statistics.reverts_made.from_recent_changes),from_pending_changes:this.sanitize(["statistics","reverts_made","from_pending_changes"],e.statistics.reverts_made.from_pending_changes),from_watchlist:this.sanitize(["statistics","reverts_made","from_watchlist"],e.statistics.reverts_made.from_watchlist),from_abuselogs:e.statistics.reverts_made.from_abuselogs,from_loaded_edits:this.sanitize(["statistics","reverts_made","from_loaded_edits"],e.statistics.reverts_made.from_loaded_edits)},users_welcomed:{total:this.sanitize(["statistics","users_welcomed","total"],e.statistics.users_welcomed.total)},warnings_issued:{total:this.sanitize(["statistics","warnings_issued","total"],e.statistics.warnings_issued.total),level_1:this.sanitize(["statistics","warnings_issued","level_1"],e.statistics.warnings_issued.level_1),level_2:this.sanitize(["statistics","warnings_issued","level_2"],e.statistics.warnings_issued.level_2),level_3:this.sanitize(["statistics","warnings_issued","level_3"],e.statistics.warnings_issued.level_3),level_4:this.sanitize(["statistics","warnings_issued","level_4"],e.statistics.warnings_issued.level_4),level_4im:this.sanitize(["statistics","warnings_issued","level_4im"],e.statistics.warnings_issued.level_4im)},reports_filed:{total:this.sanitize(["statistics","reports_filed","total"],e.statistics.reports_filed.total),AIV:this.sanitize(["statistics","reports_filed","AIV"],e.statistics.reports_filed.AIV),UAA:this.sanitize(["statistics","reports_filed","UAA"],e.statistics.reports_filed.UAA),RFPP:this.sanitize(["statistics","reports_filed","RFPP"],e.statistics.reports_filed.RFPP),global_blocks:e.statistics.reports_filed.global_blocks,global_locks:e.statistics.reports_filed.global_locks},watchlist:{watched:this.sanitize(["statistics","watchlist","watched"],e.statistics.watchlist.watched),unwatched:this.sanitize(["statistics","watchlist","unwatched"],e.statistics.watchlist.unwatched)},items_whitelisted:{total:this.sanitize(["statistics","items_whitelisted","total"],e.statistics.items_whitelisted.total),users:this.sanitize(["statistics","items_whitelisted","users"],e.statistics.items_whitelisted.users),pages:this.sanitize(["statistics","items_whitelisted","pages"],e.statistics.items_whitelisted.pages),tags:this.sanitize(["statistics","items_whitelisted","tags"],e.statistics.items_whitelisted.tags)},items_highlighted:{total:this.sanitize(["statistics","items_highlighted","total"],e.statistics.items_highlighted.total),users:this.sanitize(["statistics","items_highlighted","users"],e.statistics.items_highlighted.users),pages:this.sanitize(["statistics","items_highlighted","pages"],e.statistics.items_highlighted.pages),tags:this.sanitize(["statistics","items_highlighted","tags"],e.statistics.items_highlighted.tags)},blocks_issued:{total:this.sanitize(["statistics","blocks_issued","total"],e.statistics.blocks_issued.total)},pages_protected:{total:this.sanitize(["statistics","pages_protected","total"],e.statistics.pages_protected.total)},actions_executed:{total:this.sanitize(["statistics","actions_executed","total"],e.statistics.actions_executed.total),successful:this.sanitize(["statistics","actions_executed","successful"],e.statistics.actions_executed.successful)},session_time:this.sanitize(["statistics","session_time"],e.statistics.session_time)},highlight:{users:this.sanitize(["highlight","users"],e.highlight.users),pages:this.sanitize(["highlight","pages"],e.highlight.pages),tags:this.sanitize(["highlight","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)},favorite:{warnings:this.sanitize(["favorite","warnings"],e.favorite.warnings),reverts:this.sanitize(["favorite","reverts"],e.favorite.reverts)}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),(null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const v=t.settings.namespaces;Array.isArray(v)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const f=t.settings.queue;this.restrictObject(f,"settings","queue");{const b=t.settings.queue.max_size;"number"==typeof b&&Number.isInteger(b)&&b>0||this.reset("settings","queue","max_size")}{const w=t.settings.queue.max_edits;"number"==typeof w&&Number.isInteger(w)&&w>0||this.reset("settings","queue","max_edits")}{const y=t.settings.queue.min_ores;"number"==typeof y&&y>=0&&y<=1||this.reset("settings","queue","min_ores")}{const x=t.settings.queue.ores_bias;"number"==typeof x&&x>=0&&x<=1||this.reset("settings","queue","ores_bias")}["recent","pending","users","watchlist","abuselog"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const k=t.settings.username_highlighting;this.restrictObject(k,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const _=t.settings.wikipedia_popups;this.restrictObject(_,"settings","wikipedia_popups");"boolean"!=typeof t.settings.wikipedia_popups.enabled&&this.reset("settings","wikipedia_popups","enabled")}{const S=t.settings.auto_welcome;this.restrictObject(S,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const q=t.settings.talk_page_thanks_for_temporary_users;this.restrictObject(q,"settings","talk_page_thanks_for_temporary_users");"boolean"!=typeof t.settings.talk_page_thanks_for_temporary_users.enabled&&this.reset("settings","talk_page_thanks_for_temporary_users","enabled")}{const E=t.settings.expiry;this.restrictObject(E,"settings","expiry");{const L=t.settings.expiry.watchlist;g.expiryRegex.test(L)||this.reset("settings","expiry","watchlist")}{const A=t.settings.expiry.whitelist;this.restrictObject(A,"settings","expiry","whitelist");{const T=t.settings.expiry.whitelist.users;g.expiryRegex.test(T)||this.reset("settings","expiry","whitelist","users")}{const C=t.settings.expiry.whitelist.pages;g.expiryRegex.test(C)||this.reset("settings","expiry","whitelist","pages")}{const z=t.settings.expiry.whitelist.tags;g.expiryRegex.test(z)||this.reset("settings","expiry","whitelist","tags")}}{const M=t.settings.expiry.highlight;this.restrictObject(M,"settings","expiry","highlight");{const $=t.settings.expiry.highlight.users;g.expiryRegex.test($)||this.reset("settings","expiry","highlight","users")}{const O=t.settings.expiry.highlight.pages;g.expiryRegex.test(O)||this.reset("settings","expiry","highlight","pages")}{const I=t.settings.expiry.highlight.tags;g.expiryRegex.test(I)||this.reset("settings","expiry","highlight","tags")}}}{const P=t.settings.auto_report;this.restrictObject(P,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const j=t.settings.auto_report.for;Array.isArray(j)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const W=t.settings.AI;this.restrictObject(W,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const D=t.settings.AI.edit_analysis;this.restrictObject(D,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const R=t.settings.AI.username_analysis;this.restrictObject(R,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const U=t.settings.AI.Ollama;this.restrictObject(U,"settings","AI","Ollama");{const N=t.settings.AI.Ollama.server;(0,o.isURL)(N)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const H=t.settings.audio;this.restrictObject(H,"settings","audio");{const F=t.settings.audio.ores_alert;this.restrictObject(F,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const V=t.settings.audio.ores_alert.threshold;"number"==typeof V&&V>=0&&V<=1||this.reset("settings","audio","ores_alert","threshold")}}{const B=t.settings.audio.volume;this.restrictObject(B,"settings","audio","volume");const G=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.message","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const Q of G){const Y=t.settings.audio.volume[Q];"number"==typeof Y&&Y>=0&&Y<=1||this.reset("settings","audio","volume",Q)}}}{const Z=t.settings.zen_mode;this.restrictObject(Z,"settings","zen_mode");"boolean"!=typeof Z.enabled&&this.reset("settings","zen_mode","enabled");{const K=t.settings.zen_mode.sound;this.restrictObject(K,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const X=t.settings.zen_mode.music;this.restrictObject(X,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const J=t.settings.zen_mode.alerts;this.restrictObject(J,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const ee=t.settings.zen_mode.messages;this.restrictObject(ee,"settings","zen_mode","messages");"boolean"!=typeof t.settings.zen_mode.messages.enabled&&this.reset("settings","zen_mode","messages","enabled")}{const te=t.settings.zen_mode.toasts;this.restrictObject(te,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const ne=t.settings.zen_mode.badges;this.restrictObject(ne,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}{const se=t.settings.accessibility;this.restrictObject(se,"settings","accessibility");"boolean"!=typeof t.settings.accessibility.colorblind&&this.reset("settings","accessibility","colorblind");"boolean"!=typeof t.settings.accessibility.dyslexia&&this.reset("settings","accessibility","dyslexia");"boolean"!=typeof t.settings.accessibility.high_contrast&&this.reset("settings","accessibility","high_contrast");"boolean"!=typeof t.settings.accessibility.reduce_motion&&this.reset("settings","accessibility","reduce_motion")}"boolean"!=typeof t.settings.repeat_control_scripts&&this.reset("settings","repeat_control_scripts")}{const ie=t.UI;this.restrictObject(ie,"UI");{const ae=t.UI.theme;this.restrictObject(ae,"UI","theme");{const re=t.UI.theme.app;["light","dark","auto"].includes(re)||this.reset("UI","theme","app")}t.UI.theme.palette in m.GUI.palettes||this.reset("UI","theme","palette")}{const oe=t.UI.queue;this.restrictObject(oe,"UI","queue");{const le=t.UI.queue.width;"string"==typeof le&&le.endsWith("vw")||this.reset("UI","queue","width");const de=parseFloat(le.slice(0,-2));"number"==typeof de&&!isNaN(de)&&de>=10&&de<=30||this.reset("UI","queue","width")}}{const ce=t.UI.details;this.restrictObject(ce,"UI","details");{const ue=t.UI.details.width;"string"==typeof ue&&ue.endsWith("vw")||this.reset("UI","details","width");const pe=parseFloat(ue.slice(0,-2));"number"==typeof pe&&!isNaN(pe)&&pe>=10&&pe<=30||this.reset("UI","details","width")}}}{const ge=t.control_scripts;function he(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name||"if not"===e.name){var i,a,r,l;const s=e.condition;if(!(s.name in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${s.name} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]);const o=(0,h.sortDependencies)(null!==(a=null===(r=(l=u.conditions[s.name]).parameters)||void 0===r?void 0:r.call(l))&&void 0!==a?a:[]),c=new Set;for(const e of o){const i={};for(const t of null!==(d=e.dependencies)&&void 0!==d?d:[]){var d;i[t]=s.params[t]}const a="function"==typeof e.default?e.default(i):e.default;if(e.id in s.params||"default"in e&&(this.loadedLogger.warn(`Resetting missing parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a),c.add(e.id),"default"in e)switch(e.type){case"choice":("function"==typeof e.options?e.options(i):e.options).includes(s.params[e.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"text":"string"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid text parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"boolean":"boolean"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"number":"number"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid number parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a)}}for(const e of Object.keys(s.params))c.has(e)||(this.loadedLogger.warn(`Removing invalid parameter [ ${e} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete s.params[e]);e.actions=he.call(this,e.actions,...t,n,"actions")}else{var p,m,v,f;if(!(e.name in c.events))return null!==(p=void this.loadedLogger.warn(`Removing invalid action [ ${e.name} ] at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`))&&void 0!==p&&p;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=(0,h.sortDependencies)(null!==(m=null===(v=(f=c.events[e.name]).parameters)||void 0===v?void 0:v.call(f))&&void 0!==m?m:[]),i=new Set;for(const a of s){const s={};for(const t of null!==(b=a.dependencies)&&void 0!==b?b:[]){var b;s[t]=e.params[t]}const r="function"==typeof a.default?a.default(s):a.default;if(a.id in e.params||"default"in a&&(this.loadedLogger.warn(`Resetting missing parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r),i.add(a.id),"default"in a)switch(a.type){case"choice":("function"==typeof a.options?a.options(s):a.options).includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"text":"string"!=typeof e.params[a.id]&&(this.loadedLogger.warn(`Resetting invalid text parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"boolean":"boolean"!=typeof e.params[a.id]&&(this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"duration":"string"==typeof e.params[a.id]&&g.expiryRegex.test(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid duration parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r)}}for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(ge)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>(0,p.validateShortcut)(e)),t.control_scripts[n].actions=he.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const me=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,ve=t.statistics;this.restrictObject(ve,"statistics");{const fe=t.statistics.edits_reviewed;this.restrictObject(fe,"statistics","edits_reviewed");me(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");me(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const be=t.statistics.recent_changes_reviewed;this.restrictObject(be,"statistics","recent_changes_reviewed");me(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const we=t.statistics.pending_changes_reviewed;this.restrictObject(we,"statistics","pending_changes_reviewed");me(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");me(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");me(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const ye=t.statistics.watchlist_changes_reviewed;this.restrictObject(ye,"statistics","watchlist_changes_reviewed");me(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const xe=t.statistics.users_reviewed;this.restrictObject(xe,"statistics","users_reviewed");me(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const ke=t.statistics.abuselogs_reviewed;this.restrictObject(ke,"statistics","abuselogs_reviewed");me(t.statistics.abuselogs_reviewed.total)||this.reset("statistics","abuselogs_reviewed","total")}{const _e=t.statistics.reverts_made;this.restrictObject(_e,"statistics","reverts_made");me(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");me(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");me(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");me(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");me(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");me(t.statistics.reverts_made.from_abuselogs)||this.reset("statistics","reverts_made","from_abuselogs");me(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const Se=t.statistics.users_welcomed;this.restrictObject(Se,"statistics","users_welcomed");me(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const qe=t.statistics.warnings_issued;this.restrictObject(qe,"statistics","warnings_issued");me(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");me(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");me(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");me(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");me(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");me(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const Ee=t.statistics.reports_filed;this.restrictObject(Ee,"statistics","reports_filed");me(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");me(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");me(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");me(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP");me(t.statistics.reports_filed.global_blocks)||this.reset("statistics","reports_filed","global_blocks");me(t.statistics.reports_filed.global_locks)||this.reset("statistics","reports_filed","global_locks")}{const Le=t.statistics.watchlist;this.restrictObject(Le,"statistics","watchlist");me(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");me(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const Ae=t.statistics.items_whitelisted;this.restrictObject(Ae,"statistics","items_whitelisted");me(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");me(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");me(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");me(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const Te=t.statistics.items_highlighted;this.restrictObject(Te,"statistics","items_highlighted");me(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");me(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");me(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");me(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const Ce=t.statistics.actions_executed;this.restrictObject(Ce,"statistics","actions_executed");me(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");me(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const ze=t.statistics.session_time;"number"==typeof ze&&ze>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Me=t.highlight;this.restrictObject(Me,"highlight");{const $e=t.highlight.users;Array.isArray($e)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const Oe=t.highlight.pages;Array.isArray(Oe)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const Ie=t.highlight.tags;Array.isArray(Ie)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const Pe=t.whitelist;this.restrictObject(Pe,"whitelist");{const je=t.whitelist.users;Array.isArray(je)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const We=t.whitelist.pages;Array.isArray(We)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const De=t.whitelist.tags;Array.isArray(De)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}{const Re=t.favorite;this.restrictObject(Re,"favorite");{const Ue=t.favorite.warnings;Array.isArray(Ue)||this.reset("favorite","warnings"),t.favorite.warnings=t.favorite.warnings.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite warning [ ${e} ] from stored data.`),t})}{const Ne=t.favorite.reverts;Array.isArray(Ne)||this.reset("favorite","reverts"),t.favorite.reverts=t.favorite.reverts.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite revert [ ${e} ] from stored data.`),t})}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=3,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},955(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.getWarningFromLookup=function(e){return a[e]},t.warningsLookup=t.warnings=t.warningTemplateColors=void 0;t.warningTemplateColors={0:"grey",1:"#4169e1",2:"#ff8c00",3:"#ff4500",4:"#b22222","4im":"#000000"};const n={0:"1",1:"2",2:"3",3:"4",4:"report","4im":"report"},s=t.warnings={Vandalism:{title:"Vandalism",icon:"fas fa-skull-crossbones",description:"Warnings for different types of vandalism.",warnings:[{reportable:!0,queueType:["edit"],title:"Vandalism",name:"vandalism",icon:"fas fa-skull-crossbones",description:"Warning for general vandalism.",summary:"vandalism",auto:n,templates:[{name:"1",template:"uw-vandalism1"},{name:"2",template:"uw-vandalism2"},{name:"3",template:"uw-vandalism3"},{name:"4",template:"uw-vandalism4"},{name:"4im",template:"uw-vandalism4im"}]},{reportable:!0,queueType:["edit"],title:"Subtle vandalism",name:"subtle vandalism",icon:"fas fa-user-secret",description:"Warning for subtle vandalism.",summary:"subtle vandalism",auto:n,templates:[{name:"1",template:"uw-subtle1"},{name:"2",template:"uw-subtle2"},{name:"3",template:"uw-subtle3"},{name:"4",template:"uw-subtle4"}]},{reportable:!0,queueType:["edit"],title:"Image vandalism",name:"image vandalism",icon:"fas fa-image",description:"Warning for image vandalism.",summary:"image vandalism",auto:n,templates:[{name:"1",template:"uw-image1"},{name:"2",template:"uw-image2"},{name:"3",template:"uw-image3"},{name:"4",template:"uw-image4"},{name:"4im",template:"uw-image4im"}]},{reportable:!0,queueType:["edit"],title:"Sandbox",name:"[[WP:BADSAND|inappropriate]] sandbox use",icon:"fas fa-vial",description:"Warning for vandalism, libelous, or defamatory content added to sandbox",summary:"[[WP:BADSAND|inappropriate]] sandbox use",auto:n,templates:[{name:"1",template:"uw-sandbox1"},{name:"2",template:"uw-sandbox2"},{name:"3",template:"uw-sandbox3"},{name:"4",template:"uw-sandbox4"},{name:"4im",template:"uw-sandbox4im"}]},{reportable:!0,queueType:["edit"],title:"Deliberate errors",name:"deliberate errors",icon:"fas fa-bug",description:"Adding deliberate errors to articles.",summary:"deliberate errors",auto:n,templates:[{name:"1",template:"uw-error1"},{name:"2",template:"uw-error2"},{name:"3",template:"uw-error3"},{name:"4",template:"uw-error4"}]}]},Disruption:{title:"Disruption",icon:"fas fa-exclamation",description:"Warnings for different types of disruptive behavior.",warnings:[{reportable:!0,queueType:["edit"],title:"Disruptive editing",name:"[[WP:DE|disruptive editing]]",icon:"fas fa-exclamation",description:"Default warning for making disruptive edits but may be good faith.",summary:"[[WP:DE|disruptive editing]]",auto:n,templates:[{name:"1",template:"uw-disruptive1"},{name:"2",template:"uw-disruptive2"},{name:"3",template:"uw-disruptive3"},{name:"4",template:"uw-generic4",generic:"''Disruptive editing. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Editing tests",name:"editing tests",icon:"fas fa-flask",description:"Making test edits on live articles.",summary:"test edits",auto:n,templates:[{name:"1",template:"uw-test1"},{name:"2",template:"uw-test2"},{name:"3",template:"uw-test3"},{name:"4",template:"uw-generic4",generic:"''Test edits. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Commentary",name:"commentary",icon:"fas fa-comment-alt",description:"Adding opinion or commentary to articles.",summary:"commentary / talking in article",auto:n,templates:[{name:"1",template:"uw-talkinarticle1"},{name:"2",template:"uw-talkinarticle2"},{name:"3",template:"uw-talkinarticle3"},{name:"4",template:"uw-generic4",generic:"''Adding commentary to articles. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Inappropriate jokes",name:"inappropriate humor",icon:"fas fa-grin-squint",description:"Adding inappropriate humor to an article.",summary:"inappropriate humor",auto:n,templates:[{name:"1",template:"uw-joke1"},{name:"2",template:"uw-joke2"},{name:"3",template:"uw-joke3"},{name:"4",template:"uw-joke4"},{name:"4im",template:"uw-joke4im"}]},{reportable:!0,queueType:["edit"],title:"Deleting",name:"unexplained deletion",icon:"fas fa-trash",description:"Used when a user does not explain deletion of part of an article.",summary:"unexplained deletion",auto:n,templates:[{name:"1",template:"uw-delete1"},{name:"2",template:"uw-delete2"},{name:"3",template:"uw-delete3"},{name:"4",template:"uw-delete4"},{name:"4im",template:"uw-delete4im"}]}]},"Content Issues":{title:"Content Issues",icon:"fas fa-file-alt",description:"Warnings for different types of content issues.",warnings:[{reportable:!0,queueType:["edit"],title:"Unsourced",name:"unsourced changes",icon:"fas fa-question",description:"Warning for unsourced content.",summary:"unsourced changes",auto:n,templates:[{name:"1",template:"uw-unsourced1"},{name:"2",template:"uw-unsourced2"},{name:"3",template:"uw-unsourced3"},{name:"4",template:"uw-unsourced4"}]},{reportable:!0,queueType:["edit"],title:"Unsourced (BLP)",name:"unsourced [[WP:BLP|biographies of living persons']] changes",icon:"fas fa-person-circle-question",description:"Warning for unsourced BLP content.",summary:"unsourced [[WP:BLP|biographies of living persons']] changes",auto:n,templates:[{name:"1",template:"uw-biog1"},{name:"2",template:"uw-biog2"},{name:"3",template:"uw-biog3"},{name:"4",template:"uw-biog4"},{name:"4im",template:"uw-biog4im"}]},{reportable:!0,queueType:["edit"],title:"Unsourced genre",name:"unsourced genre changes",icon:"fas fa-music",description:"Warning for unsourced genre changes.",summary:"unsourced genre changes",auto:n,templates:[{name:"1",template:"uw-genre1"},{name:"2",template:"uw-genre2"},{name:"3",template:"uw-genre3"},{name:"4",template:"uw-genre4"}]},{reportable:!0,queueType:["edit"],title:"Original research",name:"[[WP:OR|original research]]",icon:"fas fa-lightbulb",description:"Adding original research or synthesis.",summary:"[[WP:OR|original research]]",auto:n,templates:[{name:"1",template:"uw-nor1"},{name:"2",template:"uw-nor2"},{name:"3",template:"uw-nor3"},{name:"4",template:"uw-nor4"}]},{reportable:!0,queueType:["edit"],title:"POV",name:"[[WP:NPOV|non-neutral changes]]",icon:"fas fa-balance-scale-left",description:"Adding content which violates the neutral point of view policy.",summary:"[[WP:NPOV|non-neutral changes]]",auto:n,templates:[{name:"1",template:"uw-npov1"},{name:"2",template:"uw-npov2"},{name:"3",template:"uw-npov3"},{name:"4",template:"uw-npov4"}]},{reportable:!0,queueType:["edit"],title:"Censoring",name:"[[WP:NOTCENSORED|censoring content]]",icon:"fas fa-ban",description:"Censoring topically-relevant content.",summary:"[[WP:NOTCENSORED|censoring content]]",auto:n,templates:[{name:"1",template:"uw-notcensored1"},{name:"2",template:"uw-notcensored2"},{name:"3",template:"uw-notcensored3"},{name:"4",template:"uw-notcensored4"}]},{reportable:!0,queueType:["edit"],title:"AI-generated",name:"[[WP:LLM|AI-generated content]]",icon:"fas fa-robot",description:"Adding AI-generated content.",summary:"[[WP:LLM|AI-generated content]]",auto:n,templates:[{name:"1",template:"uw-ai1"},{name:"2",template:"uw-ai2"},{name:"3",template:"uw-ai3"},{name:"4",template:"uw-ai4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==0}},{reportable:!0,queueType:["edit"],title:"AI-generated (talk)",name:"[[WP:LLM|AI-generated content]] in a discussion",icon:"fas fa-robot",description:"Writing an AI-generated comment.",summary:"[[WP:LLM|AI-generated content]] in a discussion",auto:n,templates:[{name:"1",template:"uw-aitalk1"},{name:"2",template:"uw-aitalk2"},{name:"3",template:"uw-aitalk3"},{name:"4",template:"uw-aitalk4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==1}},{reportable:!0,queueType:["edit"],title:"MOS violation",name:"[[WP:MOS|manual of style]] violation",icon:"fas fa-spell-check",description:"Not following the Manual of Style.",summary:"[[WP:MOS|manual of style]] violation",auto:n,templates:[{name:"1",template:"uw-mos1"},{name:"2",template:"uw-mos2"},{name:"3",template:"uw-mos3"},{name:"4",template:"uw-mos4"}]},{reportable:!1,queueType:["edit"],title:"English variant",name:"[[WP:ENGVAR|different English variant]]",icon:"fas fa-globe",description:"Content added in a different English variant than the rest of the article.",summary:"[[WP:ENGVAR|different English variant]]",auto:"notice",templates:[{name:"notice",template:"uw-engvar"}]},{reportable:!1,queueType:["edit"],title:"Not English",name:"non-English content",icon:"fas fa-language",description:"Content added in a language other than English.",summary:"non-English content",auto:"notice",templates:[{name:"notice",template:"uw-lang-noteng"}]}]},Conduct:{title:"Conduct",icon:"fas fa-user-shield",description:"Warnings for different types of conduct issues.",warnings:[{reportable:!0,queueType:["edit"],title:"Personal attacks",name:"[[WP:NPA|personal attacks]]",icon:"fas fa-bomb",description:"Personal attacks towards another user.",summary:"[[WP:NPA|personal attacks]]",auto:n,templates:[{name:"1",template:"uw-npa1"},{name:"2",template:"uw-npa2"},{name:"3",template:"uw-npa3"},{name:"4",template:"uw-npa4"},{name:"4im",template:"uw-npa4im"}]},{reportable:!0,queueType:["edit"],title:"Harassment",name:"[[WP:HARASS|harassment]]",icon:"fas fa-shield-alt",description:"Harassment of another user.",summary:"[[WP:HARASS|harassment]] of another user",auto:n,templates:[{name:"1",template:"uw-harass1"},{name:"2",template:"uw-harass2"},{name:"3",template:"uw-harass3"},{name:"4",template:"uw-harass4"},{name:"4im",template:"uw-harass4im"}]},{reportable:!0,queueType:["edit"],title:"TPO",name:"[[WP:TPO|removing or editing]] others' posts",icon:"fas fa-hand-paper",description:"Removing or editing others' posts.",summary:"[[WP:TPO|removing or editing]] others' posts",auto:n,templates:[{name:"1",template:"uw-tpo1"},{name:"2",template:"uw-tpo2"},{name:"3",template:"uw-tpo3"},{name:"4",template:"uw-tpo4"},{name:"4im",template:"uw-tpo4im"}]},{reportable:!0,queueType:["edit"],title:"Chatting",name:"inappropriate use of article talk pages",icon:"fas fa-comments",description:"Using article talk pages for inappropriate discussion.",summary:"inappropriate use of article talk pages",auto:n,templates:[{name:"1",template:"uw-chat1"},{name:"2",template:"uw-chat2"},{name:"3",template:"uw-chat3"},{name:"4",template:"uw-chat4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==1}},{reportable:!0,queueType:["edit"],title:"Owning",name:"assuming [[WP:OWN|ownership of articles]]",icon:"fas fa-user-shield",description:"Assuming ownership of articles.",summary:"assuming [[WP:OWN|ownership of articles]]",auto:n,templates:[{name:"1",template:"uw-own1"},{name:"2",template:"uw-own2"},{name:"3",template:"uw-own3"},{name:"4",template:"uw-own4"}]},{reportable:!0,queueType:["edit"],title:"AfD removal",name:"removing AfD templates or comments",icon:"fas fa-gavel",description:"Removing AfD templates or other users' comments from AfD discussions.",summary:"removing AfD templates or comments",auto:n,templates:[{name:"1",template:"uw-afd1"},{name:"2",template:"uw-afd2"},{name:"3",template:"uw-afd3"},{name:"4",template:"uw-afd4"}]},{reportable:!1,queueType:["edit"],title:"Edit warring",name:"[[WP:EW|edit warring]]",icon:"fas fa-jet-fighter",description:"Engaging in edit warring.",summary:"[[WP:EW|edit warring]]",auto(e){var t;return+(null==e||null===(t=e.user)||void 0===t?void 0:t.edits)<500?"notice":"warning"},templates:[{name:"notice",template:"uw-ew-soft",color:"grey"},{name:"warning",template:"uw-ew",color:"#ff4500"}]},{reportable:!0,queueType:["edit"],title:"Gaming the system",name:"[[WP:GAME|gaming the system]]",icon:"fas fa-chess-knight",description:"Attempting to game Wikipedia's policies or guidelines.",summary:"[[WP:GAME|gaming the system]]",auto:n,templates:[{name:"1",template:"uw-gaming1"},{name:"2",template:"uw-gaming2"},{name:"3",template:"uw-gaming3"},{name:"4",template:"uw-gaming4"},{name:"4im",template:"uw-gaming4im"}]}]},Promotional:{title:"Promotional",icon:"fas fa-bullhorn",description:"Warnings for promotional content.",warnings:[{reportable:!0,queueType:["edit"],title:"Advertising",name:"[[WP:PROMO|advertising or promotion]]",icon:"fas fa-ad",description:"Adding advertising or promotional content.",summary:"[[WP:PROMO|advertising or promotion]]",auto:n,templates:[{name:"1",template:"uw-advert1"},{name:"2",template:"uw-advert2"},{name:"3",template:"uw-advert3"},{name:"4",template:"uw-advert4"},{name:"4im",template:"uw-advert4im"}]},{reportable:!0,queueType:["edit"],title:"Spam links",name:"adding [[WP:ELNO|inappropriate links]]",icon:"fas fa-link",description:"Adding spam or promotional links.",summary:"adding [[WP:ELNO|inappropriate links]]",auto:n,templates:[{name:"1",template:"uw-spam1"},{name:"2",template:"uw-spam2"},{name:"3",template:"uw-spam3"},{name:"4",template:"uw-spam4"},{name:"4im",template:"uw-spam4im"}]},{reportable:!1,queueType:["edit"],title:"COI Edit",name:"editing with a [[WP:COI|conflict of interest]]",icon:"fas fa-user-tie",description:"Editing with a conflict of interest.",summary:"editing with a [[WP:COI|conflict of interest]]",auto:"notice",templates:[{name:"notice",template:"uw-coi"},{name:"warning",template:"uw-coi-warn"},{name:"username",template:"uw-coi-username"}]},{reportable:!1,queueType:["logevent"],title:"COI Log",name:"apparent [[WP:COI|conflict of interest]]",icon:"fas fa-user-tie",description:"Apparent conflict of interest.",summary:"apparent [[WP:COI|conflict of interest]]",auto:"username",templates:[{name:"username",template:"uw-coi-username"}]}]},"Abuse Log":{title:"Abuse Log",icon:"fas fa-shield-virus",description:"Warnings for triggering edit filters.",warnings:[{reportable:!0,queueType:["abuselog"],title:"Attempt",name:"triggering an edit filter",icon:"fas fa-vial",description:"Triggering an edit filter.",auto:n,templates:[{name:"1",template:"uw-attempt1"},{name:"2",template:"uw-attempt2"},{name:"3",template:"uw-attempt3"},{name:"4",template:"uw-attempt4"},{name:"4im",template:"uw-attempt4im"}],show:e=>!Boolean(null==e?void 0:e.revid)}]},"Edit Summary":{title:"Edit Summary",icon:"fas fa-pen-alt",description:"Warnings for inappropriate edit summaries.",warnings:[{reportable:!1,queueType:["edit"],title:"No edit summary",name:"no [[WP:ES|edit summary]] provided",icon:"fas fa-pen-nib",description:"Making an edit without providing an edit summary.",summary:"no [[WP:ES|edit summary]] provided",auto(e){var t;return+(null==e||null===(t=e.user)||void 0===t?void 0:t.edits)<500?"newcomer":"experienced"},templates:[{name:"notice",template:"uw-es"},{name:"experienced",template:"uw-es2"}]},{reportable:!0,queueType:["edit","logevent","abuselog"],title:"Inappropriate edit summary",name:"inappropriate [[WP:ES|edit summary]]",icon:"fas fa-pen-alt",description:"Using an inappropriate edit summary.",summary:"inappropriate [[WP:ES|edit summary]]",auto:n,templates:[{name:"1",template:"uw-bes1"},{name:"2",template:"uw-bes2"},{name:"3",template:"uw-bes3"},{name:"4",template:"uw-bes4"},{name:"4im",template:"uw-bes4im"}]},{reportable:!0,queueType:["edit","logevent","abuselog"],title:"Misleading edit summary",name:"misleading [[WP:ES|edit summary]]",icon:"fas fa-mask",description:"Using a misleading edit summary.",summary:"misleading [[WP:ES|edit summary]]",auto:n,templates:[{name:"1",template:"uw-mislead1"},{name:"2",template:"uw-mislead2"},{name:"3",template:"uw-mislead3"},{name:"4",template:"uw-generic4",generic:"''Misleading edit summary. ([[WP:WikiShield|WS]])''"}]},{reportable:!1,queueType:["edit","abuselog"],title:"Minor edit abuse",name:"improper use of [[WP:ME|minor edit]] checkbox",icon:"fas fa-minus",description:"Non-minor edit marked as minor",summary:"improper use of [[WP:ME|minor edit]] checkbox",auto:"notice",templates:[{name:"notice",template:"uw-minor"}]}]}},i={};for(const[e,t]of Object.entries(s)){const e=t.warnings.length;for(let n=0;n<e;n++){const e=t.warnings[n];i[e.title]=e}}const a=t.warningsLookup=i},863(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.welcomes=void 0;const n=t.welcomes={Auto:{title:"Auto",template:e=>{}},Default:{title:"Default",template:"Welcome",sign:!0},Basic:{title:"Basic",template:"W-basic",sign:!1},"Non-Latin":{title:"Non-Latin",template:"Welcome-non-latin",sign:!0},"Vandalism fighter":{title:"Vandalism fighter",template:"Welcome-vandalism fighter",sign:!1},Personal:{title:"Personal",template:"Welcome-personal",sign:!0},Cookie:{title:"Cookie",template:"Welcome cookie",sign:!0},Kitten:{title:"Kitten",template:"Welcome kitten",sign:!1},Graphical:{title:"Graphical",template:"W-graphical",sign:!1},Screen:{title:"Screen",template:"W-screen",sign:!1},Autobiography:{title:"Autobiography",template:"Welcome-auto",sign:!0},COI:{title:"COI",template:"Welcome-COI",sign:!0}};n.Auto.template=e=>!n["Non-Latin"].hide&&/[^\u0000-\u007F]/.test(e.name)?"Non-Latin":"Default"},4153(e,t,n){var s=n(8878);void 0===window.electron?(window.isElectron=!1,window.electron={mwapiLoader:async()=>{window.dispatchEvent(new CustomEvent("mwapi-loaded",{detail:{server:window.location.host,username:mw.user.getName(),pendingChangesServers:s.MediaWikiAPI.pendingChangesServers,dev:!1}}))},mwapiLoaded:e=>window.addEventListener("mwapi-loaded",t=>{const{server:n,username:s,pendingChangesServers:i,dev:a}=t.detail;e(n,s,i,a)}),mwapi:()=>Promise.reject(new Error("Not running in Electron environment")),menuEnabler:()=>{},setBadgeCount:()=>{},sendNotification:()=>Promise.reject(new Error("Not running in Electron environment")),localStorage:{get:e=>localStorage.getItem(e),set:(e,t)=>localStorage.setItem(e,t),delete:e=>localStorage.removeItem(e)},copyToClipboard:async e=>{if(navigator.clipboard&&navigator.clipboard.writeText)await navigator.clipboard.writeText(e);else{const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}},log:e=>console.debug(e),info:e=>console.info(e),warn:e=>console.warn(e),error:e=>console.error(e),errorbox:(e,t)=>alert(`${e}\n\n${t}`),onOpenBrowser:()=>{},onOpenUrl:()=>{},onOpenNotification:()=>{},nOpenChangelog:()=>{},closePopup:e=>e.close(),openExternal:e=>window.open(e,"_blank"),openInBrowser:async e=>{const t=.8*window.screen.availWidth,n=.8*window.screen.availHeight,s=window.screenX+(window.outerWidth-t)/2,i=window.screenY+(window.outerHeight-n)/2,a=window.open(e,"myPopup",`width=${t},height=${n},left=${s},top=${i},resizable=false,scrollbars=true,menubar=false,toolbar=false,location=false,status=false`);return a.focus(),a.addEventListener("beforeunload",()=>{a.closed&&window.dispatchEvent(new CustomEvent("popup-closed",{detail:a}))}),a},onPopupClosed:e=>window.addEventListener("popup-closed",t=>e(t.detail)),onBeforeunload:()=>{},unloaded:()=>{},saveAccount:()=>{},disable:(e,t)=>{alert(`${e}\n\n${t}`),location.reload()}}):window.isElectron=!0,document.querySelectorAll("[data-electron]").forEach(e=>{"false"===e.dataset.electron&&window.isElectron?e.remove():"true"!==e.dataset.electron||window.isElectron||e.remove()})},7411(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{constructor(){super(),e(this,"handleDragStart",(e,t)=>{this.draggedIndex=e,this.placeholderIndex=e,t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e),requestAnimationFrame(()=>{this.updateDragState()})}),e(this,"handleDragOver",(e,t)=>{if(t.preventDefault(),null===this.draggedIndex||e===this.placeholderIndex)return;const n=[...this.items],s=n[this.draggedIndex];n.splice(this.draggedIndex,1),n.splice(e,0,s),this.items=n,this.draggedIndex=e,this.placeholderIndex=e,this.render()}),e(this,"handleDragEnd",()=>{this.dispatchEvent(new CustomEvent("reorder",{detail:{keys:this.items.map(e=>e.key)},bubbles:!0})),this.draggedIndex=null,this.placeholderIndex=null,this.updateDragState()}),this.items=[],this.draggedIndex=null,this.placeholderIndex=null,this.itemWrappers=[]}connectedCallback(){this.className="draggable-order-list",this.syncItemsFromChildren()}syncItemsFromChildren(){const e=Array.from(this.children);this.items=e.map((e,t)=>({child:e,key:e.dataset.key||e.getAttribute("key")||t})),this.render()}addItem(e,t){this.items.push({child:e,key:t||this.items.length}),this.render()}clearItems(){this.items=[],this.render()}updateDragState(){const e=null!==this.draggedIndex;this.classList.toggle("is-dragging",e),this.itemWrappers.forEach((e,t)=>{e.classList.toggle("dragging",this.draggedIndex===t)})}render(){this.innerHTML="",this.itemWrappers=[],this.items.forEach((e,t)=>{const n=document.createElement("div");n.className="draggable-order-item-wrapper",n.draggable=!0,n.dataset.key=e.key,n.addEventListener("dragstart",e=>this.handleDragStart(t,e)),n.addEventListener("dragover",e=>this.handleDragOver(t,e)),n.addEventListener("dragend",this.handleDragEnd),n.appendChild(e.child.cloneNode?e.child.cloneNode(!0):e.child),this.appendChild(n),this.itemWrappers.push(n)}),this.updateDragState()}}class n extends HTMLElement{static get observedAttributes(){return["name","enabled"]}constructor(){super(),e(this,"handleToggle",e=>{e.stopPropagation(),this._enabled=!this._enabled,this.updateEnabledState(),this.dispatchEvent(new CustomEvent("toggle",{detail:{enabled:this._enabled},bubbles:!0}))}),this._name="",this._enabled=!0}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"name":this._name=n||"",this.nameSpan&&(this.nameSpan.textContent=this._name);break;case"enabled":this._enabled="false"!==n&&"0"!==n,this.updateEnabledState()}}get name(){return this._name}set name(e){this.setAttribute("name",e)}get enabled(){return this._enabled}set enabled(e){this.setAttribute("enabled",e)}updateEnabledState(){this.classList.toggle("disabled",!this._enabled),this.toggle&&(this.toggle.title=this._enabled?"Click to disable":"Click to enable")}render(){this.className="draggable-order-item",this.innerHTML="",this.nameSpan=document.createElement("span"),this.nameSpan.className="draggable-order-item-name",this.nameSpan.textContent=this._name,this.toggle=document.createElement("div"),this.toggle.className="draggable-order-item-toggle",this.toggle.addEventListener("click",this.handleToggle),this.appendChild(this.nameSpan),this.appendChild(this.toggle),this.updateEnabledState()}}customElements.define("draggable-order-list",t),customElements.define("draggable-order-item",n)},7732(e,t,n){var s=n(3241);class i extends HTMLElement{constructor(){super(),this.duration={years:0,months:0,weeks:0,days:0,hours:0,minutes:0,seconds:0},this.isInfinite=!1}connectedCallback(){this.render(),this.attachEventListeners()}render(){this.innerHTML=`\n <label class="infinity-label">\n <span>Infinite Duration</span>\n </label>\n <div class="duration-inputs">\n ${[{key:"years",label:"Years"},{key:"months",label:"Months"},{key:"weeks",label:"Weeks"},{key:"days",label:"Days"},{key:"hours",label:"Hours"},{key:"minutes",label:"Minutes"},{key:"seconds",label:"Seconds"}].map(e=>`\n <label>\n <span>${e.label}</span>\n <input\n type="number"\n min="0"\n data-unit="${e.key}"\n value="0"\n step="1"\n placeholder="0"\n />\n </label>\n `).join("")}\n </div>\n `}attachEventListeners(){const e=this.querySelector(".infinity-label");e.addEventListener("click",()=>{this.isInfinite=!this.isInfinite,e.classList.toggle("selected",this.isInfinite),this.dispatchChangeEvent()}),this.querySelectorAll('input[type="number"]').forEach(e=>{e.addEventListener("input",e=>{const t=e.target.dataset.unit;this.duration[t]=parseInt(e.target.value,10)||0,this.dispatchChangeEvent()})})}dispatchChangeEvent(){this.dispatchEvent(new CustomEvent("change",{detail:this.getDurationString(),bubbles:!0}))}get value(){return this.getDurationString()}getDurationString(){if(this.isInfinite)return"infinite";let e="";const t={years:"Y",months:"M",weeks:"W",days:"D",hours:"H",minutes:"M",seconds:"S"};for(const[n,s]of Object.entries(this.duration))s>0&&(e+=`${s}${t[n]}`);return e||"0S"}set value(e){if("infinite"===e||"infinity"===e||"∞"===e){this.isInfinite=!0;const e=this.querySelector(".infinity-label");return void(e&&e.classList.add("selected"))}this.isInfinite=!1;const t=this.querySelector(".infinity-label");t&&t.classList.remove("selected");const n=s.expiryRegex.exec(e);if(n)for(const e of Object.keys(this.duration)){const t=n.groups[e];this.duration[e]=t?parseInt(t,10):0;const s=this.querySelector(`input[data-unit="${e}"]`);s&&(s.value=this.duration[e])}}}customElements.define("duration-input",i)},1914(e,t,n){n(7732),n(2784),n(5155),n(7411),n(1731)},5155(e,t){function n(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.NumericInput=void 0;class s extends HTMLElement{static get observedAttributes(){return["value","min","max","step"]}constructor(){super(),n(this,"handleMinus",()=>{const e=Number(this.inputValue),t=Math.round(100*Math.max(e-this.step,this.min))/100;this.updateValue(t)}),n(this,"handlePlus",()=>{const e=Number(this.inputValue),t=Math.round(100*Math.min(e+this.step,this.max))/100;this.updateValue(t)}),n(this,"handleInputChange",()=>{const e=this.input.value;if(isNaN(Number(e)))return void(this.input.value=this.inputValue);let t=Math.round(100*Math.min(Math.max(Number(e),this.min),this.max))/100;t=this.step>=1?Math.round(t):t,this.updateValue(t)}),n(this,"handleKeyUp",e=>{"enter"===e.key.toLowerCase()&&(this.handleInputChange(),e.target.blur())}),n(this,"handleInput",e=>{this.inputValue=e.target.value}),this.inputValue=0,this._min=-1/0,this._max=1/0,this._step=1}connectedCallback(){this.render(),this.setupEventListeners()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"value":this.inputValue=Number(n)||0,this.input&&(this.input.value=this.inputValue);break;case"min":this._min=Number(null!=n?n:-1/0);break;case"max":this._max=Number(null!=n?n:1/0);break;case"step":this._step=Number(null!=n?n:1)}}get value(){return this.inputValue}set value(e){this.setAttribute("value",e)}get min(){return this._min}get max(){return this._max}get step(){return this._step}updateValue(e){this.inputValue=e,this.input.value=e,this.dispatchEvent(new CustomEvent("change",{detail:{value:e},bubbles:!0}))}setupEventListeners(){this.minusBtn.addEventListener("click",this.handleMinus),this.plusBtn.addEventListener("click",this.handlePlus),this.input.addEventListener("input",this.handleInput),this.input.addEventListener("blur",this.handleInputChange),this.input.addEventListener("keyup",this.handleKeyUp),this.input.addEventListener("wheel",e=>{e.preventDefault(),e.deltaY<0?this.handlePlus():e.deltaY>0&&this.handleMinus()})}render(){this.className="numeric-input-container",this.minusBtn=document.createElement("span"),this.minusBtn.className="fa fa-minus numeric-input-button",this.input=document.createElement("input"),this.input.type="text",this.input.className="numeric-input",this.input.value=this.inputValue,this.input.autocomplete="off",this.plusBtn=document.createElement("span"),this.plusBtn.className="fa fa-plus numeric-input-button",this.appendChild(this.minusBtn),this.appendChild(this.input),this.appendChild(this.plusBtn)}}t.NumericInput=s,customElements.define("numeric-input",s)},2784(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{static get observedAttributes(){return["value","checked"]}constructor(){super(),e(this,"handleClick",()=>{this._value=!this._value,this.updateState(),this.dispatchEvent(new CustomEvent("change",{detail:{value:this._value,checked:this._value},bubbles:!0}))}),this._value=!1}connectedCallback(){this.render(),this.updateState()}attributeChangedCallback(e,t,n){t!==n&&("value"!==e&&"checked"!==e||(this._value="true"===n||"1"===n||""===n,this.updateState()))}get value(){return this._value}set value(e){this._value=!!e,this.setAttribute("value",this._value),this.updateState()}get checked(){return this._value}set checked(e){this.value=e}updateState(){this.classList.toggle("active",this._value)}render(){this.classList.add("settings-toggle"),this.innerHTML="";const e=document.createElement("div");e.className="toggle-switch";const t=document.createElement("div");t.className="toggle-slider",e.appendChild(t),this.appendChild(e),this.addEventListener("click",this.handleClick)}}customElements.define("toggle-input",t)},1731(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{static get observedAttributes(){return["title","description","value"]}constructor(){super(),e(this,"handleVolumeChange",e=>{const t=Math.max(0,Math.min(1,parseFloat(e.target.value)));this._value=t,this.slider.value=t,this.input.value=t.toFixed(2),this.dispatchEvent(new CustomEvent("change",{detail:{value:t},bubbles:!0}))}),this._title="",this._description="",this._value=.5,this._sound="",this._preview=null}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"title":this._title=n||"",this.titleEl&&(this.titleEl.textContent=this._title);break;case"description":this._description=n||"",this.descEl&&(this.descEl.textContent=this._description);break;case"value":this._value=Math.max(0,Math.min(1,parseFloat(n))),this.slider&&(this.slider.value=this._value),this.input&&(this.input.value=this._value.toFixed(2))}}get title(){return this._title}set title(e){this.setAttribute("title",e)}get value(){return this._value}set value(e){this.setAttribute("value",e)}setPreview(e,t){this._preview={audio:e,path:t},this.render()}render(){this.className="volume-control",this.innerHTML="";const e=document.createElement("div");e.className="volume-control-header";const t=document.createElement("div");if(t.className="volume-control-info",this.titleEl=document.createElement("div"),this.titleEl.className="volume-control-title",this.titleEl.textContent=this._title,this.descEl=document.createElement("div"),this.descEl.className="volume-control-desc",this.descEl.textContent=this._description,t.appendChild(this.titleEl),t.appendChild(this.descEl),e.appendChild(t),this._preview){const t=document.createElement("button");t.className="volume-control-preview",t.title="Preview sound",t.addEventListener("click",()=>{if(t.classList.contains("playing"))return;t.classList.add("playing");const e=t.querySelector("i");e&&(e.className="fa fa-stop");const n=new AbortController;t.onclick=()=>n.abort(),this._preview.audio.stopPreviews(),this._preview.audio.playSound(this._preview.path,n.signal,!0).finally(()=>{t.onclick=null,t.classList.remove("playing"),e&&(e.className="fa fa-play")})});const n=document.createElement("i");n.className="fa fa-play",t.appendChild(n),e.appendChild(t)}this.appendChild(e);const n=document.createElement("div");n.className="volume-control-slider-container",this.slider=document.createElement("input"),this.slider.type="range",this.slider.className="volume-control-slider",this.slider.min="0",this.slider.max="1",this.slider.step="0.01",this.slider.value=this._value,this.slider.autocomplete="off",this.slider.addEventListener("input",this.handleVolumeChange),n.appendChild(this.slider),this.input=document.createElement("input"),this.input.type="number",this.input.className="volume-control-input",this.input.min="0",this.input.max="1",this.input.step="0.01",this.input.value=this._value.toFixed(2),this.input.autocomplete="off",this.input.addEventListener("input",this.handleVolumeChange),n.appendChild(this.input),this.appendChild(n)}}customElements.define("volume-control",t)},8816(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.run=r,n(4153),n(1914);var s=n(7054),i=n(9501),a=n(691);function r(){addEventListener("wheel",e=>{e.target.closest(".no-scroll")||"INPUT"===e.target.tagName&&"number"===e.target.type&&(e.stopPropagation(),e.target.value=Number(e.target.value)+(e.deltaY<0?1:-1),e.target.dispatchEvent(new Event("input")))},{passive:!0}),electron.menuEnabler(),electron.mwapiLoaded(async(e,t,n,r)=>{if(i.StorageManager.okay(null,electron)){var o;document.querySelector("#rollback-needed .request-link").href=null!==(o=await fetch("https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q7765871&props=sitelinks/urls&format=json&origin=*").then(e=>e.json()).then(t=>{var n;return(null===(n=Object.values(t.entities.Q7765871.sitelinks).find(t=>t.url.startsWith(`https://${e}/wiki/`)))||void 0===n?void 0:n.url)||null}).catch(()=>null))&&void 0!==o?o:"https://www.wikidata.org/wiki/Q7765871";const i=new s.WikiShield(e,t,n,r);electron.onOpenBrowser(()=>i.open(null,!1)),electron.onOpenUrl(e=>i.open(e,!1)),electron.onOpenNotification(e=>{const t=new URL(e);if(t.searchParams.has("markasread")){const e=i.notifications.find(null,+t.searchParams.get("markasread"));e&&i.notifications.read(e.type,e.notification)}i.open(e)}),electron.menuEnabler({browser:!0}),i.on("ready",()=>{electron.onBeforeunload(async()=>{await i.save(),electron.unloaded()}),window.addEventListener("beforeunload",async()=>await i.save());const e=new a.Killswitch(i);e.on("kill",()=>{alert("WikiShield has been temporarily disabled. Please contact the development team for more information."),window.close()}),e.on("force-update",()=>{alert("The current version of WikiShield is no longer supported. Please update to the latest version to continue using WikiShield."),window.close()}),e.on("update",()=>{electron.sendNotification({title:"WikiShield Update",body:"A new version of WikiShield is available. Please update to the latest version for the best experience."},"")}),e.on("unsafe",()=>{alert("Could not verify the integrity of WikiShield. Make sure you are connected to the internet. If the problem persists, please contact the development team."),window.close()}),e.on("okay",async()=>{addEventListener("keydown",e=>i.controller(e)),addEventListener("keyup",e=>i.controller(e)),await i.init()},{once:!0}),e.check().then(()=>e.monitor(1e4))},{once:!0})}else alert("An error has occurred with the WikiShield storage system that could lead to data loss. For that reason, WikiShield has been automatically disabled. Please report this immediately to the development team."),window.close()}),electron.mwapiLoader().catch(e=>{alert(`An error occurred while loading the WikiShield API:\n\n${e.stack||e}`),window.close()})}window.isElectron&&r()},317(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AutoScroll=function(){document.querySelectorAll(".auto-scroll").forEach(e=>{e.dataset.autoScrollInitialized||(e.parentElement.addEventListener("wheel",t=>{e.dataset.autoScrollFreeze=750,e.dataset.autoScrollLastTime=performance.now();let n=parseFloat(e.dataset.autoScrollOffset)||0;const s=Math.abs(t.deltaX),i=Math.abs(t.deltaY),a=Math.abs(t.deltaZ),r=s+i+a;if(0===r)return;let o;switch(Math.max(s,i,a)){case s:o=Math.sign(t.deltaX);break;case i:o=Math.sign(t.deltaY);break;case a:o=Math.sign(t.deltaZ)}n+=o*r,e.dataset.autoScrollOffset=n},{passive:!0}),e.dataset.autoScrollInitialized=!0);let t=parseFloat(e.dataset.autoScrollOffset)||0;if("autoScrollFreeze"in e.dataset){const n=parseFloat(e.dataset.autoScrollLastTime)||performance.now(),s=performance.now();t+=s-n,e.dataset.autoScrollOffset=t,e.dataset.autoScrollLastTime=s;const i=parseFloat(e.dataset.autoScrollFreeze);i>0?e.dataset.autoScrollFreeze=i-s+n:(delete e.dataset.autoScrollFreeze,delete e.dataset.autoScrollLastTime)}const s=parseFloat(e.dataset.autoScrollSpeed)||1;let i=parseFloat(e.dataset.autoScrollCarry)||0;i+=s;const a=Math.floor(i);e.dataset.autoScrollCarry=(i-a).toString();let r=e.querySelectorAll(":scope > .auto-scroll-item").length;if(0===r){const t=e.innerHTML;e.innerHTML="";const n=document.createElement("span");n.className="auto-scroll-item",n.innerHTML=t,e.appendChild(n),r=1}const o=e.querySelector(":scope > .auto-scroll-item"),l=getComputedStyle(o),d=o.clientWidth+(parseFloat(l.marginLeft)||0)+(parseFloat(l.marginRight)||0),c=e.clientWidth;if(d<c)return void e.querySelectorAll(":scope > .auto-scroll-item:not(:first-child)").forEach(e=>e.remove());const u=Math.ceil(c/d)+1-r;if(u>0)for(let e=0;e<u;e++){const e=o.cloneNode(!0);o.parentNode.insertBefore(e,o.nextSibling)}else if(u<0){const t=e.querySelectorAll(":scope > .auto-scroll-item");for(let e=0;e<-u;e++){var p;null===(p=t[e])||void 0===p||p.remove()}}const g=(performance.now()-t)/1e3*60*s%d;e.scrollLeft=g;const h=(e,t,n)=>{(async function(e,t,n,s=()=>!0){if(0===t)return Promise.resolve([0,0]);const i=e.scrollLeft,a=i+t,r=performance.now()+n;let o;const l=new Promise(e=>o=e),d=()=>{const l=performance.now(),c=i+Math.min(1,(l-(r-n))/n)*t;l>=r?(e.scrollLeft=a,o([0,0])):s(e,c)?(e.scrollLeft=c,requestAnimationFrame(d)):o([t-c+i,Math.max(0,r-l)])};return requestAnimationFrame(d),l})(e,t,n,(e,t)=>{var n;const s=d;return!(t>=s)||null!==(n=void(e.scrollLeft=t%s))&&void 0!==n&&n}).then(([t,n])=>{t>0&&h(e,t,n)})};s>0&&h(e,a,1e3*n)})};const n=1/60},4784(e,t){function n(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function s(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Dialog=void 0;var i=new WeakSet;function a(e){null!=e&&e.parentElement&&(e.classList.add("hidden"),setTimeout(()=>{e.parentElement&&e.remove()},300))}async function r(){if(this.dialogs.processing||0===this.dialogs.queue.length)return;this.dialogs.processing=!0;const{fn:e,resolve:t,reject:n}=this.dialogs.queue.shift();try{this.dialogs.active=!0;const n=await e();this.dialogs.active=null,t(n)}catch(e){this.dialogs.active=null,n(e)}finally{this.dialogs.processing=!1,requestAnimationFrame(()=>s(i,this,r).call(this))}}function o(e,t=!1){return new Promise((n,a)=>{t&&this.dialogs.active?e().then(n).catch(a):(this.dialogs.queue.push({fn:e,child:t,resolve:n,reject:a}),s(i,this,r).call(this))})}function l(e,t,n="",s=""){return new Promise(i=>{const a=document.createElement("div");a.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal"),a.appendChild(r);const o=document.createElement("div");o.classList.add("confirmation-modal-header"),r.appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal-title"),l.textContent=e,o.appendChild(l);const d=document.createElement("div");d.classList.add("confirmation-modal-body"),d.innerHTML=t,r.appendChild(d);const c=document.createElement("input");c.type="text",c.classList.add("confirmation-modal-input"),c.placeholder=n,c.value=s,d.appendChild(c),c.focus(),c.select();const u=document.createElement("div");u.classList.add("confirmation-modal-footer"),r.appendChild(u);const p=document.createElement("button");p.classList.add("confirmation-modal-button","confirmation-modal-button-cancel"),p.style.setProperty("--background","211, 51, 51"),p.textContent="Cancel",u.appendChild(p);const g=document.createElement("button");g.classList.add("confirmation-modal-button","confirmation-modal-button-submit"),g.style.setProperty("--background","51, 153, 211"),g.textContent="Submit",u.appendChild(g);const h=e=>{document.removeEventListener("keydown",m,!0),a.classList.add("closing"),r.classList.add("closing"),setTimeout(()=>{a.remove(),i(e)},200)},m=e=>{if("Enter"===e.key)return e.preventDefault(),e.stopPropagation(),h(c.value),!1;if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),h(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",m,!0),p.addEventListener("click",()=>h(null)),g.addEventListener("click",()=>h(c.value)),a.addEventListener("click",e=>{e.target===a&&h(null)})})}function d(e){return new Promise(t=>{const n=e=>{document.removeEventListener("keydown",s,!0),i.classList.add("closing"),a.classList.add("closing"),setTimeout(()=>{i.remove(),t(e)},200)},s=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),n(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",s,!0);const i=document.createElement("div");i.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(i);const a=document.createElement("div");a.classList.add("confirmation-modal"),i.appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal-header"),a.appendChild(r);const o=document.createElement("div");o.classList.add("confirmation-modal-title"),o.textContent="Report to UAA",r.appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal-body"),l.innerHTML="Select reason for reporting <span class='confirmation-modal-username'></span> to UAA:",a.appendChild(l),l.querySelector(".confirmation-modal-username").textContent=e;const d=document.createElement("div");d.classList.add("confirmation-modal-footer","confirmation-modal-footer-vertical"),a.appendChild(d),["Disruptive","Offensive","Promotional","Misleading"].forEach(e=>{const t=`${e} username`,s=document.createElement("button");s.classList.add("confirmation-modal-button","confirmation-modal-button-reason"),s.textContent=t,s.addEventListener("click",()=>n(t)),d.appendChild(s)});const c=document.createElement("button");c.classList.add("confirmation-modal-button","confirmation-modal-button-cancel"),c.style.setProperty("--background","211, 51, 51"),c.textContent="Cancel",c.addEventListener("click",()=>n(null)),d.appendChild(c),i.addEventListener("click",e=>{e.target===i&&n(null)})})}function c(e,t,n=null,s=!1){return new Promise(i=>{const a=e=>{document.removeEventListener("keydown",r,!0),o.classList.add("closing"),l.classList.add("closing"),setTimeout(()=>{o.remove(),i(e)},200)},r=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),a(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",r,!0);const o=document.createElement("div");o.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal"),o.appendChild(l);const d=document.createElement("div");d.classList.add("confirmation-modal-header"),l.appendChild(d);const c=document.createElement("div");c.classList.add("confirmation-modal-title"),c.textContent=e,d.appendChild(c);const u=document.createElement("div");u.classList.add("confirmation-modal-body"),u.innerHTML=t,l.appendChild(u);const p=document.createElement("div");if(p.classList.add("confirmation-modal-footer"),l.appendChild(p),n&&!s){const s=document.createElement("button");s.classList.add("confirmation-modal-button","confirmation-modal-button-uaa"),s.style.setProperty("--background","211, 51, 51"),s.textContent="Report to UAA",p.appendChild(s),s.addEventListener("click",()=>{document.removeEventListener("keydown",r,!0),o.classList.add("closing"),l.classList.add("closing"),setTimeout(async()=>{o.remove();const s=await this.UAA(n,!0);s?this.ws.execute({name:"reportToUAA",params:{reportMessage:s}},void 0,void 0,{user:{name:n}}):i(await this.confirm(e,t,n,!1,!0))},200)})}const g=document.createElement("div");g.classList.add("confirmation-modal-footer-right"),p.appendChild(g);const h=document.createElement("button");h.classList.add("confirmation-modal-button","confirmation-modal-button-no"),h.textContent="No",h.addEventListener("click",()=>a(!1)),g.appendChild(h);const m=document.createElement("button");m.classList.add("confirmation-modal-button","confirmation-modal-button-yes"),m.style.setProperty("--background","51, 102, 204"),m.textContent="Yes",m.addEventListener("click",()=>a(!0)),g.appendChild(m),o.addEventListener("click",e=>{e.target===o&&a(null)}),requestAnimationFrame(()=>m.focus())})}function u(e,t){return new Promise(async n=>{const s=document.createElement("div");s.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(s);const i=document.createElement("div");i.classList.add("confirmation-modal"),s.appendChild(i);const a=document.createElement("div");a.classList.add("confirmation-modal-header"),a.textContent=e,i.appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal-body"),r.innerHTML='<div class="dialog-loading">\n <div class="dialog-spinner"></div>\n <div class="dialog-loading-text">Loading...</div>\n </div>',i.appendChild(r);const o=()=>{document.removeEventListener("keydown",l,!0),s.classList.add("closing"),i.classList.add("closing"),setTimeout(()=>{s.remove(),n()},200)},l=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),o(),!1};document.addEventListener("keydown",l,!0),s.addEventListener("click",e=>{e.target===s&&o()}),t instanceof Promise?t.then(e=>{r&&(r.innerHTML=e)}).catch(()=>{r&&(r.innerHTML="Failed to load content")}):r.innerHTML=t})}t.Dialog=class{constructor(e){n(this,i),this.ws=e,this.dialogs={processing:!1,active:null,queue:[]},this.popups=[],addEventListener("focus",()=>{this.popups.length>0&&(this.popups.forEach(e=>electron.closePopup(e)),this.popups=[],requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())}))}),electron.onPopupClosed(e=>{const t=this.popups.indexOf(e);-1!==t&&this.popups.splice(t,1),0===this.popups.length&&requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())})})}controller(e){}check(){if(0===this.popups.length)return requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())});requestAnimationFrame(()=>this.check())}toast(e,t,n="default",r=5e3){const o=this.ws.store.settings.zen_mode;if(o.enabled&&!o.toasts.enabled)return!1;const l=document.createElement("div");l.classList.add("toast-alert",n);const d=document.createElement("div");d.classList.add("toast-icon"),l.appendChild(d);const c=document.createElement("i");switch(c.classList.add("fa"),d.appendChild(c),n){case"success":c.classList.add("fa-check");break;case"warning":c.classList.add("fa-exclamation-triangle");break;case"error":c.classList.add("fa-xmark");break;default:c.classList.add("fa-info-circle")}const u=document.createElement("div");u.classList.add("toast-content"),l.appendChild(u);const p=document.createElement("div");p.classList.add("toast-title"),p.textContent=e,u.appendChild(p);const g=document.createElement("div");g.classList.add("toast-message"),g.textContent=t,u.appendChild(g);const h=document.createElement("div");h.classList.add("toast-close"),h.addEventListener("click",()=>{s(i,this,a).call(this,l)}),l.appendChild(h);const m=document.createElement("i");return m.classList.add("fa","fa-xmark"),h.appendChild(m),document.body.querySelector("#app").appendChild(l),setTimeout(()=>{this.ws.audio.playSound(["notification","toast"]),l.classList.add("show")},10),r>0&&setTimeout(()=>s(i,this,a).call(this,l),r),!0}input(e,t,n="",a="",r=!1){return s(i,this,o).call(this,()=>s(i,this,l).call(this,e,t,n,a),r)}UAA(e,t=!1){return s(i,this,o).call(this,()=>s(i,this,d).call(this,e),t)}confirm(e,t,n=null,a=!1,r=!1){return s(i,this,o).call(this,()=>s(i,this,c).call(this,e,t,n,a),r)}show(e,t){return s(i,this,o).call(this,()=>s(i,this,u).call(this,e,t))}}},8469(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.GUI=void 0;var s=n(4192),i=n(4041),a=n(7054),r=n(2069),o=n(4784),l=n(8921),d=n(9117),c=n(372),u=n(955),p=n(7698),g=n(317);function h(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function m(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var v=new WeakSet;class f{constructor(e){h(this,v),this.ws=e,this.dialog=new o.Dialog(this.ws),this.events=new l.EventManager(this.ws),this.settings=new d.Settings(this.ws),this.intervals={DEFCON:null,outdated:null},this.controllers={current:null}}async build(){this.updateDEFCON(),document.documentElement.style.colorScheme={light:"only light",auto:"light dark",dark:"only dark"}[this.ws.store.UI.theme.app]||"light dark";const e={code:["ArrowUp","ArrowUp","ArrowDown","ArrowDown","ArrowLeft","ArrowRight","ArrowLeft","ArrowRight","b","a"],index:0,function:t=>{t.key!==e.code[e.index]?e.index=t.key===e.code[0]?1:0:++e.index===e.code.length&&(e.index=0,this.ws.open("https://ws.luni.me/konami-easter-egg","force"))}};addEventListener("keydown",e.function),this.updateAccessibility(),document.querySelector("#initial").classList.remove("hidden"),document.querySelectorAll(".VERSION").forEach(e=>e.textContent=a.WikiShield.config.version),Math.random()<.01&&(document.querySelector("#wikishield-sikiwhield").textContent="SikiWhield");const t=new AbortController;let n;const s=new Promise(e=>n=e);let i;this.ws.audio.playSound(["startup"],t.signal,!1,()=>n()),await s;const r=this.ws.store.settings.performance.startup;if("always_off"!==r){const e=document.getElementById("dots-canvas"),t=e.getContext("2d"),n=Math.min(devicePixelRatio||1,2);class s{constructor(){m(this,"radius",2),this.x=Math.random()*e.width,this.y=Math.random()*e.height,this.vx=.5*(Math.random()-.5),this.vy=.5*(Math.random()-.5),this.color=s.colors[Math.random()*s.colors.length|0],this.fill=`rgba(${this.color}, 0.8)`,this.shadow=`rgba(${this.color}, 0.8)`}update(){this.x+=this.vx,this.y+=this.vy,this.x<0?this.x=e.width:this.x>e.width&&(this.x=0),this.y<0?this.y=e.height:this.y>e.height&&(this.y=0)}draw(){t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.fillStyle=this.fill,t.fill()}}m(s,"dots",[]),m(s,"target",0),m(s,"colors",["102, 126, 234","240, 147, 251","118, 75, 162","217, 70, 239"]);let a=null;const o=()=>{a||(a=requestAnimationFrame(()=>{a=null;const i=e.width,r=e.height;e.width=Math.floor(innerWidth*n),e.height=Math.floor(innerHeight*n),e.style.width=`${innerWidth}px`,e.style.height=`${innerHeight}px`,t.setTransform(1,0,0,1,0,0),t.scale(n,n);const o=e.width/(i||e.width),l=e.height/(r||e.height);if(s.dots.forEach(e=>{e.x*=o,e.y*=l}),s.target=Math.floor(innerWidth*innerHeight/7e3),s.target=Math.max(40,Math.min(250,s.target)),s.target>s.dots.length)for(let e=s.dots.length;e<s.target;e++)s.dots.push(new s);else s.target<s.dots.length&&(s.dots.length=s.target)}))};o(),addEventListener("resize",o);const l=160,d=30,c=500;let u=null,p=performance.now();const g=new Array(15).fill(1e3/60),h=()=>{{const n=performance.now(),a=n-p;p=n,g.shift(),g.push(a);const o=[...g].sort((e,t)=>e-t).slice(2,-2),l=1e3/(o.reduce((e,t)=>e+t,0)/o.length);if("adaptive"===r){if(l<d){if(null===u&&(u=n),n-u>=c)return i&&cancelAnimationFrame(i),i=null,void t.clearRect(0,0,e.width,e.height)}else u=null;l<45&&s.dots.length>60&&(s.dots.length=Math.max(60,Math.floor(.9*s.dots.length)),s.target=s.dots.length)}}t.clearRect(0,0,e.width,e.height),s.dots.forEach(e=>{e.update(),e.draw()});const n=Math.ceil(innerWidth/l),a=Math.ceil(innerHeight/l),o=new Array(n*a);for(let e=0;e<o.length;e++)o[e]=[];s.dots.forEach((e,t)=>{const s=Math.max(0,Math.min(n-1,Math.floor(e.x/l))),i=Math.max(0,Math.min(a-1,Math.floor(e.y/l)));o[i*n+s].push(t)});const m=innerWidth/2,v=innerHeight/2,f=(e,n,s,i,a)=>{const r=[0];Math.max(e,s)>innerWidth&&r.push(-innerWidth),Math.min(e,s)<0&&r.push(innerWidth);const o=[0];Math.max(n,i)>innerHeight&&o.push(-innerHeight),Math.min(n,i)<0&&o.push(innerHeight),t.lineWidth=1,t.strokeStyle=a;for(const a of r)for(const r of o)t.beginPath(),t.moveTo(e+a,n+r),t.lineTo(s+a,i+r),t.stroke()};for(let e=0;e<a;e++)for(let t=0;t<n;t++){const i=o[e*n+t];if(0!==i.length)for(let r=-1;r<=1;r++){const l=(e+r+a)%a;for(let e=-1;e<=1;e++){const a=o[l*n+(t+e+n)%n];if(0!==a.length)for(let e=0;e<i.length;e++){const t=s.dots[i[e]];for(let n=0;n<a.length;n++){const r=a[n];if(r<=i[e])continue;const o=s.dots[r];let l=t.x-o.x,d=t.y-o.y;l>m&&(l-=innerWidth),l<-m&&(l+=innerWidth),d>v&&(d-=innerHeight),d<-v&&(d+=innerHeight);const c=l*l+d*d;if(c<22500){const e=.4*(1-Math.sqrt(c)/150),n=t.color.split(","),s=o.color.split(","),i=(parseInt(n[0])+parseInt(s[0]))/2,a=(parseInt(n[1])+parseInt(s[1]))/2,r=(parseInt(n[2])+parseInt(s[2]))/2;f(t.x,t.y,t.x-l,t.y-d,`rgba(${i}, ${a}, ${r}, ${e})`)}}}}}}i=requestAnimationFrame(h)};h()}this.ws.rights.rollback||"LuniZunie"===this.ws.api.username?(document.querySelector("#rollback-needed").classList.add("hidden"),document.querySelector("#start-button").classList.remove("hidden")):(document.querySelector("#rollback-needed").classList.remove("hidden"),document.querySelector("#start-button").classList.add("hidden")),document.querySelector("#start-button").addEventListener("click",()=>{window.removeEventListener("keydown",e.function),t.abort(),this.ws.audio.playSound(["ui","click"]),i&&cancelAnimationFrame(i),this.ws.start()}),window.addEventListener("click",e=>{[...document.querySelectorAll(".tooltip.buttons")].forEach(e=>e.remove());const t=e.target.closest("[href]");if(t){const n=new URL(t.href,location.href);if(n.origin===location.origin&&n.pathname===location.pathname)return;if(t.dataset.multipleHrefs)try{const[e,n=""]=t.dataset.multipleHrefs.split(";"),s=Object.fromEntries(n.split("&").map(e=>{const[t,n]=e.split("=");return[t,decodeURIComponent(n)]}));switch(e){case"page":{const e=s.title,n=+s.id;this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Revision",i.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:Permalink/${n}`),e.altKey),t.remove()}),t.appendChild(i);const a=document.createElement("div");a.classList.add("button"),a.innerText="Diff",a.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:Diff/${n}`),e.altKey),t.remove()}),t.appendChild(a)})}break;case"page-abuse":{const e=s.title,n=+s.id;this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Details",i.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:AbuseLog/${n}`),e.altKey),t.remove()}),t.appendChild(i);const a=document.createElement("div");a.classList.add("button"),a.innerText="Examine",a.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:AbuseFilter/examine/log/${n}`),e.altKey),t.remove()}),t.appendChild(a)})}break;case"log":{const e=s.title,n=JSON.parse(s.log);this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Log",i.addEventListener("click",s=>{const i=this.ws.page(`Special:Log/${encodeURIComponent(n.user)}?page=${encodeURIComponent(e)}&type=${n.type}&wptime=${n.timestamp}&limit=1`,!1,!1),a=this.ws.open(i,s.altKey);t.remove(),a.addEventListener("load",()=>{a.scroll({behavior:"smooth",top:a.document.body.scrollHeight})},{once:!0})}),t.appendChild(i)})}break;case"user":{const e=s.name;this.createTooltip(t,"buttons",null,null,null,t=>{const n=document.createElement("div");n.classList.add("button"),n.innerText="User talk",n.addEventListener("click",n=>{this.ws.open(this.ws.page(`User talk:${e}`),n.altKey),t.remove()}),t.appendChild(n);const s=document.createElement("div");s.classList.add("button"),s.innerText="User contribs",s.addEventListener("click",n=>{this.ws.open(this.ws.page(`Special:Contribs/${e}`),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="User page",i.addEventListener("click",n=>{this.ws.open(this.ws.page(`User:${e}`),n.altKey),t.remove()}),t.appendChild(i)})}break;case"email":this.createTooltip(t,"buttons",null,null,null,e=>{const t=document.createElement("div");t.classList.add("button"),t.innerText="Emergency",t.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Emergency"),t.altKey),e.remove()}),e.appendChild(t);const n=document.createElement("div");n.classList.add("button"),n.innerText="ArbCom",n.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Arbitration Committee"),t.altKey),e.remove()}),e.appendChild(n);const s=document.createElement("div");s.classList.add("button"),s.innerText="Oversight",s.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Oversight"),t.altKey),e.remove()}),e.appendChild(s)})}}catch(n){this.ws.open(t.getAttribute("href"),e.altKey)}finally{e.preventDefault()}else this.ws.open(t.getAttribute("href"),e.altKey);e.preventDefault()}}),document.querySelector("#loading").classList.add("hidden")}async start(){this.intervals.DEFCON=setInterval(this.updateDEFCON.bind(this),6e4),document.querySelector("#DEFCON").addEventListener("click",e=>{this.ws.open("https://en.wikipedia.org/w/index.php?tagfilter=mw-manual-revert%7Cmw-rollback%7Cmw-undo&title=Special%3ARecentChanges&urlversion=2",e.altKey)}),this.settings.start(),document.querySelector("#app").classList.remove("hidden"),document.querySelector("#initial").classList.add("hidden"),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const n=e.closest(".bottom-tool-item"),s=document.querySelector(`#${n.dataset.menu}-menu`),i=s.classList.contains("show");switch(n.dataset.menu){case"revert":s.innerHTML="",this.createWarnMenu("reverts",s,this.ws.queue.current.item);break;case"warn":s.innerHTML="",this.createWarnMenu("warnings",s,this.ws.queue.current.item);break;case"page":{var a;const e=this.ws.queue.current.item,t=!0===(null==e||null===(a=e.page)||void 0===a?void 0:a.watched);document.querySelector("#page-watch").classList.toggle("hidden",t),document.querySelector("#page-unwatch").classList.toggle("hidden",!t)}}this.closeMenus(),i||(s.classList.add("show"),e.classList.add("active"),this.positionBottomMenu(n,s))})}),document.querySelectorAll(".submenu-trigger").forEach(e=>{let t=(0,s.generateRandomUUID)();e.addEventListener("mouseenter",()=>{t=null;const n=e.closest(".bottom-tool-menu");n&&n.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show"));const s=e.querySelector(".submenu");s&&(this.events.submenu(s,s.dataset.eventName),s.classList.add("show"),this.positionSubmenu(s,e))}),e.addEventListener("mouseleave",()=>{const n=(0,s.generateRandomUUID)();t=n,setTimeout(()=>{if(t!==n)return;const s=e.querySelector(".submenu");s&&s.classList.remove("show")},500)})}),document.querySelectorAll(".menu-option:not(.submenu-trigger)").forEach(e=>{e.addEventListener("click",()=>this.closeMenus())}),document.querySelectorAll(".submenu").forEach(e=>{e.addEventListener("click",e=>e.stopPropagation())}),document.querySelectorAll("#queue-tabs > .queue-tab").forEach(e=>this.addTooltipListener(e));{const e=["alert","message"];e.forEach(e=>{const t=document.querySelector(`#${e}s-icon`);this.addTooltipListener(t),t.addEventListener("click",()=>{const t=document.querySelector(`#${e}s-panel`);t.classList.toggle("show"),t.classList.contains("show")&&this.ws.notifications.seen(e)}),document.querySelector(`#mark-all-${e}s-read`).addEventListener("click",t=>{this.ws.notifications.read(e)})}),document.addEventListener("click",t=>{for(const n of e){const e=document.querySelector(`#${n}s-panel`),s=document.querySelector(`#${n}s-icon`);null!=e&&e.contains(t.target)||null!=s&&s.contains(t.target)||null==e||e.classList.remove("show")}t.target.closest(".bottom-tool-menu")||t.target.closest(".confirmation-modal-overlay")||this.closeMenus()})}const e=document.querySelector("#latest-edits-tab");e.addEventListener("click",()=>this.updateDiffDisplay(this.ws.queue.current.item,!1)),this.addTooltipListener(e);const t=document.querySelector("#consecutive-edits-tab");t.addEventListener("click",()=>this.updateDiffDisplay(this.ws.queue.current.item,!0)),this.addTooltipListener(t),document.querySelector("#pending-changes-container > .accept").addEventListener("click",async e=>{await this.ws.gui.settings.waitForClose();const t=await this.dialog.input("Accept Pending Changes","Enter an optional edit summary for accepting this change:","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"next-item",params:{}},{name:"accept-pending-edit",params:{summary:t}}]})}),document.querySelector("#pending-changes-container > .reject").addEventListener("click",async e=>{await this.ws.gui.settings.waitForClose();const t=await this.dialog.input("Reject Pending Changes","Enter an optional edit summary for rejecting this change:","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"next-item",params:{}},{name:"reject-pending-edit",params:{summary:t}}]})}),document.querySelectorAll("#bottom-tools [data-tooltip]").forEach(e=>this.addTooltipListener(e));{const e=document.querySelector("#queue");{const t=this.ws.store.UI.queue.width;t&&(e.style.width=t,document.querySelector("#right-container").style.width=`calc(100% - ${t})`)}const t=document.querySelector("#right-details");{const e=this.ws.store.UI.details.width;e&&(t.style.width=e,document.querySelector("#main-container").style.width=`calc(100% - ${e})`)}const n={active:null,section:null,x:null,width:null,windowWidth:null},s=(e,t,s)=>{s.preventDefault(),n.active=e,n.section=t,n.x=s.clientX,n.width=t.getBoundingClientRect().width,n.windowWidth=innerWidth},i=document.querySelector("#queue-width-adjust");i.addEventListener("pointerdown",t=>s(i,e,t));const a=document.querySelector("#details-width-adjust");a.addEventListener("pointerdown",e=>s(a,t,e)),addEventListener("pointerup",()=>{n.active===i?this.ws.store.UI.queue.width=e.style.width:n.active===a&&(this.ws.store.UI.details.width=t.style.width),n.active=null,n.section=null}),addEventListener("pointermove",e=>{if(!n.active)return;const t=e.clientX-n.x;let s;n.active===i?s=n.width+t:n.active===a&&(s=n.width-t);const r=.1*n.windowWidth,o=.3*n.windowWidth;s=Math.max(r,Math.min(o,s));const l=s/n.windowWidth*100;n.section.style.width=`${l}vw`,n.active===i?document.querySelector("#right-container").style.width=`calc(100% - ${l}vw)`:n.active===a&&(document.querySelector("#main-container").style.width=`calc(100% - ${l}vw)`)})}const n=a.WikiShield.config.changelog.version;var i,r;(n.endsWith("!")||n!==this.ws.store.changelog)&&(this.ws.store.changelog=n.replace(/!$/,""),null===(i=(r=electron).open)||void 0===i||i.call(r,"changelog"));this.addTooltipListener(document.querySelector("#settings-icon")),document.querySelectorAll("#queue-top-right > span").forEach(e=>this.addTooltipListener(e)),this.updateZenMode(),this.reorderQueues(),this.newCurrentItem(null),document.querySelector("#settings-icon").addEventListener("click",()=>{this.settings.open()}),this.events.button(document.querySelector("#clear-queue"),"clear-queue"),this.events.button(document.querySelector("#previous-item-button"),"previous-item"),this.events.button(document.querySelector("#next-item-button"),"next-item"),this.events.button(document.querySelector("#user-open-user-page"),"open-user-page"),this.events.button(document.querySelector("#user-open-user-talk"),"open-user-talk"),this.events.button(document.querySelector("#user-view-contribs"),"open-user-contributions"),this.events.button(document.querySelector("#user-view-filter-log"),"open-filter-log"),this.events.button(document.querySelector("#user-whitelist"),"whitelist-user"),this.events.button(document.querySelector("#user-unwhitelist"),"unwhitelist-user"),this.events.button(document.querySelector("#user-highlight"),"highlight-user"),this.events.button(document.querySelector("#user-unhighlight"),"unhighlight-user"),this.events.submenu(document.querySelector("#user-welcome .submenu"),"welcome-user"),this.events.submenu(document.querySelector("#user-report-aiv .submenu"),"report-user-to-aiv"),this.events.submenu(document.querySelector("#user-report-uaa .submenu"),"report-user-to-uaa"),this.events.submenu(document.querySelector("#user-request-global-block .submenu"),"request-global-block"),this.events.submenu(document.querySelector("#user-request-global-lock .submenu"),"request-global-lock"),this.events.submenu(document.querySelector("#user-new-talk-topic .submenu"),"send-message-to-user-talk"),this.events.button(document.querySelector("#page-open-page"),"open-page"),this.events.button(document.querySelector("#page-open-talk"),"open-page-talk"),this.events.button(document.querySelector("#page-watch"),"watch-page"),this.events.button(document.querySelector("#page-unwatch"),"unwatch-page"),this.events.button(document.querySelector("#page-whitelist"),"whitelist-page"),this.events.button(document.querySelector("#page-unwhitelist"),"unwhitelist-page"),this.events.button(document.querySelector("#page-highlight"),"highlight-page"),this.events.button(document.querySelector("#page-unhighlight"),"unhighlight-page"),this.events.submenu(document.querySelector("#page-request-protection .submenu"),"request-page-protection"),this.events.button(document.querySelector("#page-view-history"),"open-page-history"),this.events.submenu(document.querySelector("#page-new-talk-topic .submenu"),"send-message-to-page-talk"),this.events.button(document.querySelector("#edit-view-revision"),"open-revision"),this.events.button(document.querySelector("#edit-view-diff"),"open-diff"),this.events.button(document.querySelector("#edit-thank-user"),"thank-user"),this.events.submenu(document.querySelector("#edit-rollback .submenu"),"rollback-edit"),this.events.submenu(document.querySelector("#edit-rollback-goodfaith .submenu"),"rollback-goodfaith-edit"),this.events.submenu(document.querySelector("#edit-undo .submenu"),"undo-edit"),this.events.button(document.querySelector("#copy-link"),"copy-link"),this.events.button(document.querySelector("#refresh-user-contributions"),"refresh-user-contributions"),this.events.button(document.querySelector("#user-contributions > .footer"),"open-user-contributions"),this.events.button(document.querySelector("#refresh-page-history"),"refresh-page-history"),this.events.button(document.querySelector("#page-history > .footer"),"open-page-history"),c.Queue.types.forEach(e=>{this.events.button(document.querySelector(`#queue-tab-${e}`),`switch-to-${e}-queue`)}),this.animation(),this.update(),this.renderQueue(),electron.menuEnabler({browser:!0,settings:{preferences:!0},help:{changelog:!0}})}animation(){try{(0,g.AutoScroll)()}catch(e){console.error("Error in animation loop:",e)}requestAnimationFrame(()=>this.animation())}update(){try{const e=new Date;document.querySelectorAll("[data-time]").forEach(t=>{const n=new Date(t.dataset.time);switch(t.dataset.timeFormat){case"notification":t.textContent=this.ws.util.formatNotificationTime(n,"timeNow"in t.dataset?new Date(t.dataset.timeNow):e)+(t.dataset.timePostfix||"");break;case"duration":t.textContent=this.ws.util.formatDuration(n,"timeNow"in t.dataset?new Date(t.dataset.timeNow):e)+(t.dataset.timePostfix||"")}})}catch(e){console.error("Error updating time elements:",e)}setTimeout(()=>this.update(),1e3)}async updateDEFCON(){var e;const t=await this.ws.getDEFCON(),n=document.querySelector("#DEFCON");n.title=`DEFCON-${null!==t.level?t.level:"N/A"} (${t.info?`${t.info} revert${1===+t.info?"":"s"} per minute`:"No data"})`;const s=n.querySelector(".dot");s.className="dot",null!==t.level&&s.classList.add(`DEFCON-${t.level}`),document.querySelector(".DEFCON-RPM").textContent=null!==(e=t.info)&&void 0!==e?e:"N/A"}generateItemHTML(e,t=!1){const n=this.getORESColor(e.ores),s="sizediff"in e?this.ws.util.getChangeColor(e.sizediff):void 0,a=(0,i.CreateDOMElement)("div");{const t=(0,i.CreateDOMElement)("div",{class:"item-color",style:{"--ores-color":n},dataset:{ores:e.ores}});a.appendChild(t)}{var r,o,l;const t=(0,i.CreateDOMElement)("div",{class:"item-body",style:{"--ores-color":n,"--diff-color":s},datset:{ores:e.ores}});a.appendChild(t);{const n=(0,i.CreateDOMElement)("div",{class:"header"});t.appendChild(n);{const t=this.ws.store.highlight.pages.has(e.page.title),s=(0,i.CreateDOMElement)("span",{class:"page-title"+(t?" highlighted":""),content:e.page.title,dataset:t?{tooltip:"Page is highlighted",tooltipDelay:500}:{}});this.addTooltipListener(s),n.appendChild(s);const a=(0,i.CreateDOMElement)("i",{class:"fas fa-file-lines"});s.prepend(a)}{const t=(0,i.CreateDOMElement)("span",{class:"timestamp"});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-clock",style:{"font-size":"11px"}});t.appendChild(s);const a=(0,i.CreateDOMElement)("span",{content:this.ws.util.formatNotificationTime(new Date(e.timestamp)),dataset:{tooltip:new Date(e.timestamp).toLocaleString(),tooltipDelay:500,time:e.timestamp,timeFormat:"notification"}});this.addTooltipListener(a),t.appendChild(a)}}{var d;const n=(0,i.CreateDOMElement)("div",{class:"meta"});t.appendChild(n);const s=null!==(d=e.performer)&&void 0!==d?d:e.user;{const t=s.blocked,a=this.ws.util.expiryToDate(null==t?void 0:t.expiry),r=this.ws.store.highlight.users.has(s.name),o=void 0===s.talk,l=(0,i.CreateDOMElement)("span",{class:"user-chip"+(!1===(null==t?void 0:t.partial)?" blocked":"")+(r?" highlighted":"")+(o?" empty-talk":""),content:e.user.name,dataset:!1===(null==t?void 0:t.partial)?{tooltip:`Blocked ${a===1/0?"indefinitely":`until ${a.toLocaleString()}`} (${t.reason})`,tooltipDelay:500}:r?{tooltip:"User is highlighted",tooltipDelay:500}:o?{tooltip:"User has an empty talk page",tooltipDelay:500}:{}});this.addTooltipListener(l),n.appendChild(l);const d=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(s.anon?"user-secret":"user"),style:{"font-size":"11px"}});l.prepend(d)}{const t=(0,i.CreateDOMElement)("div",{class:"chips"});if(n.appendChild(t),"abuselog"===e.type){const n=["disallow","warn","showcaptcha","tag","none"],s=n.length;let a=s-1;for(let t=0;t<s;t++)if(e.origin.result.has(n[t])){a=t;break}const r=(0,i.CreateDOMElement)("span",{class:"ores-chip",dataset:{tooltip:`Action taken: ${n[a]}`,tooltipDelay:500}});this.addTooltipListener(r),t.appendChild(r);const o=(0,i.CreateDOMElement)("i",{class:`fas fa-${["ban","exclamation-triangle","robot","tag","check"][a]}`,style:{"font-size":"11px"}});r.prepend(o)}else{const n=(0,i.CreateDOMElement)("span",{class:"ores-chip",content:Number.isNaN(e.ores)?"-":Math.round(100*e.ores),dataset:{tooltip:"Score",tooltipDelay:500}});this.addTooltipListener(n),t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-fire",style:{"font-size":"11px"}});n.prepend(s)}{const n=(0,i.CreateDOMElement)("div",{class:"diff-chips"});if(t.appendChild(n),e.minor){const e=(0,i.CreateDOMElement)("span",{class:"minor-chip",dataset:{tooltip:"Minor edit",tooltipDelay:500}});this.addTooltipListener(e),n.appendChild(e);const t=(0,i.CreateDOMElement)("i",{class:"fas fa-m",style:{"font-size":"11px"}});e.appendChild(t)}if("sizediff"in e){const t=(0,i.CreateDOMElement)("span",{class:"diff-chip",content:Math.abs(e.sizediff).toLocaleString(),dataset:{tooltip:"Size difference",tooltipDelay:500}});if(this.addTooltipListener(t),n.appendChild(t),0!==e.sizediff){const n=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.sizediff>0?"plus":"minus"),style:{"font-size":"11px"}});t.prepend(n)}}}}}if(e.has_comment){const n=(0,i.CreateDOMElement)("div",{class:"item-comment"});t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"11px"}});n.appendChild(s);const a=(0,i.CreateDOMElement)("span",{class:"text",html:e.comment,dataset:{tooltip:e.comment,tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(a),n.appendChild(a)}const c=null!==(r=null!==(o=e.tags)&&void 0!==o?o:null===(l=e.filters)||void 0===l?void 0:l.map(e=>`${e.filter} (${"-1"===e.id?"private":e.id})`))&&void 0!==r?r:[];if(c.length>0){const e=(0,i.CreateDOMElement)("div",{class:"item-tags"});t.appendChild(e),c.forEach(t=>{const n=(0,i.CreateDOMElement)("span",{class:"tag",content:t});e.appendChild(n)})}}if(t){const e=(0,i.CreateDOMElement)("div",{class:"remove-button"});a.appendChild(e);const t=(0,i.CreateDOMElement)("i",{class:"fas fa-xmark"});e.appendChild(t)}return a.innerHTML}generateEditDetails(e,t=!1){if(!e)return void(document.querySelector("#edit-details").innerHTML="<div class='central'>Nothing selected</div>");const n="edit"===c.Queue.groups[e.type]?this.ws.queue.pending.get(e.id):null,s=document.querySelector("#edit-details");s.style.setProperty("--diff-color","sizediff"in e?this.ws.util.getChangeColor(e.sizediff):void 0),s.innerHTML="";{const t=(0,i.CreateDOMElement)("div",{class:"header"});s.appendChild(t);{const n=this.ws.store.highlight.pages.has(e.page.title),s=(0,i.CreateDOMElement)("span",{class:"page-title"+(n?" highlighted":""),dataset:n?{tooltip:"Page is highlighted",tooltipDelay:500}:{}});this.addTooltipListener(s),t.appendChild(s);const a=(0,i.CreateDOMElement)("i",{class:"fas fa-file-lines"});let r;switch(s.appendChild(a),c.Queue.groups[e.type]){case"edit":r="page";break;case"logevent":r="log";break;case"abuselog":r="page-abuse"}const o=(0,i.CreateDOMElement)("a",{content:e.page.title,dataset:{multipleHrefs:`${r};title=${encodeURIComponent(e.page.title)}&${"log"===r?`log=${JSON.stringify(e)}`:`id=${e.id}`}`,tooltip:e.page.title,tooltipDelay:500},attributes:{href:null}});this.addTooltipListener(o),s.appendChild(o)}{var a;const s=(0,i.CreateDOMElement)("div",{class:"meta"});t.appendChild(s);const l=null!==(a=e.performer)&&void 0!==a?a:e.user;{var o;const e=Object.keys(null!==(o=null==n?void 0:n.users)&&void 0!==o?o:{}).filter(e=>e!==l.name),t=l.blocked,a=this.ws.util.expiryToDate(null==t?void 0:t.expiry),d=this.ws.store.highlight.users.has(l.name),c=void 0===l.talk,u=(0,i.CreateDOMElement)("span",{class:"user-chip"+(!1===(null==t?void 0:t.partial)?" blocked":"")+(d?" highlighted":"")+(c?" empty-talk":""),dataset:!1===(null==t?void 0:t.partial)?{tooltip:`Blocked ${a===1/0?"indefinitely":`until ${a.toLocaleString()}`} (${t.reason})`,tooltipDelay:500}:d?{tooltip:"User is highlighted",tooltipDelay:500}:c?{tooltip:"User has an empty talk page",tooltipDelay:500}:{}});this.addTooltipListener(u),s.appendChild(u);const p=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.length>0?"users":l.anon?"user-secret":"user")});u.appendChild(p);const g=(0,i.CreateDOMElement)("a",{content:l.name,dataset:{multipleHrefs:`user;name=${encodeURIComponent(l.name)}`,tooltip:l.name,tooltipDelay:500},attributes:{href:null}});if(this.addTooltipListener(g),u.appendChild(g),e.length>0){const t=(0,i.CreateDOMElement)("span",{class:"other-users",content:` and ${e.length} ${r.Text.pluralize("other",e.length)}`,dataset:{tooltip:e.join(", "),tooltipDelay:500}});this.addTooltipListener(t),u.appendChild(t)}}}}{var l;const a=(0,i.CreateDOMElement)("div",{class:"subheader"});if(s.appendChild(a),(null==n?void 0:n.count)>1||t&&(null===(l=e.consecutive)||void 0===l?void 0:l.count)>1){const t=(0,i.CreateDOMElement)("div",{class:"item-comment"});a.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comments",style:{"font-size":"11px"}});t.appendChild(s);const o=null!=n?n:e.consecutive,l=(0,i.CreateDOMElement)("span",{class:"text",content:`${o.count} ${r.Text.pluralize("edit",o.count)} over the course of `,dataset:{tooltip:o.edits.map(e=>{const t=(0,i.CreateDOMElement)("div",{style:{display:"flex","flex-direction":"column",gap:"6px"}});{const n=(0,i.CreateDOMElement)("div",{style:{display:"flex","align-items":"center",gap:"6px",width:"100%","justify-content":"space-between","font-size":"13px"}});t.appendChild(n);{const t=(0,i.CreateDOMElement)("span",{style:{display:"flex","align-items":"center",gap:"4px","font-weight":"500"},content:e.user});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.anon?"user-secret":"user"),style:{"font-size":"11px",opacity:"0.7"}});t.prepend(s)}{const t=(0,i.CreateDOMElement)("span",{style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",opacity:"0.75"},content:this.ws.util.formatNotificationTime(new Date(e.timestamp)),dataset:{time:e.timestamp,timeFormat:"notification"}});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-clock",style:{"font-size":"10px",opacity:"0.7"}});t.prepend(s)}}{const n=(0,i.CreateDOMElement)("div",{style:{display:"flex","align-items":"flex-start",gap:"4px","font-size":"12px",opacity:"0.85",padding:"2px 0"},content:e.comment||"No edit summary"});t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"10px",opacity:"0.7","flex-shrink":"0","margin-top":"2px"}});n.prepend(s)}return t.outerHTML}).join("<br>"),tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(l),t.appendChild(l);const d=(0,i.CreateDOMElement)("span",{class:"time",content:this.ws.util.formatDuration(new Date(o.timestamp.old),new Date(o.timestamp.new)),dataset:{tooltip:`${new Date(o.timestamp.old).toLocaleString()}&mdash;${new Date(o.timestamp.new).toLocaleString()}`,tooltipHtml:!0,tooltipDelay:500,time:o.timestamp.old,timeNow:o.timestamp.new,timeFormat:"duration"}});this.addTooltipListener(d),t.appendChild(d)}else if(e.has_comment){const t=(0,i.CreateDOMElement)("div",{class:"item-comment"});a.appendChild(t);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"11px"}});t.appendChild(n);const s=(0,i.CreateDOMElement)("span",{class:"text",html:e.comment,dataset:{tooltip:e.comment,tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(s),t.appendChild(s)}else{const e=(0,i.CreateDOMElement)("div",{class:"item-comment none",content:"No edit summary"});a.appendChild(e)}{const t=(0,i.CreateDOMElement)("div",{class:"meta"});if(a.appendChild(t),e.minor){const e=(0,i.CreateDOMElement)("span",{class:"minor-chip",dataset:{tooltip:"Minor edit",tooltipDelay:500}});this.addTooltipListener(e),t.appendChild(e);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-m",style:{"font-size":"11px"}});e.appendChild(n)}if("sizediff"in e){const n=(0,i.CreateDOMElement)("span",{class:"diff-chip",content:Math.abs(e.sizediff).toLocaleString(),dataset:{tooltip:"Size difference",tooltipDelay:500}});if(this.addTooltipListener(n),t.appendChild(n),0!==e.sizediff){const t=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.sizediff>0?"plus":"minus"),style:{"font-size":"11px"}});n.prepend(t)}}}}}renderQueue(e=null,t=null,n=null){var s,a,r;if(document.querySelector("#previous-item-button").classList.toggle("disabled",!this.ws.queue.canGoPrevious()),document.querySelector("#next-item-button").classList.toggle("disabled",!this.ws.queue.canGoNext()),null!=e||(e=this.ws.queue.current.queue),null!=t||(t=this.ws.queue.current.item),null!=n||(n=this.ws.queue.current.type),this.updateQueueTabs(),n!==this.ws.queue.current.type)return;const o=document.querySelector("#queue-items");if(0===e.length){var l,d;const e=document.createElement("div");return e.classList.add("queue-empty"),e.textContent="No items in queue",o.innerHTML=e.outerHTML,void((null===(l=this.ws.queue.queues[n].previous)||void 0===l?void 0:l.id)!==(null===(d=t)||void 0===d?void 0:d.id)&&(this.ws.queue.queues[n].previous=t,this.newCurrentItem(t)))}o.querySelectorAll(".queue-empty").forEach(e=>e.remove());const c=new Map;for(const e of o.children)c.set(+e.dataset.id,e);let u=null;for(const s of e){var p;let i=c.get(s.id);var g;if(!i)i=document.createElement("div"),i.classList.add("queue-item"),i.dataset.id=s.id,i.dataset.type=n,i.innerHTML=this.generateItemHTML(s,"pending"!==n),null===(g=i.querySelector(".remove-button"))||void 0===g||g.addEventListener("click",i=>{i.stopPropagation();const a=e.findIndex(e=>e.id===s.id);var r;a>=0&&(s.id===(null===(r=t)||void 0===r?void 0:r.id)?this.ws.queue.next():(e.splice(a,1),this.ws.queue.queues[n].history.push({...s,history:performance.now()}),this.removeQueueItem(n,s.id),this.renderQueue()))}),s.mentions.has&&this.ws.store.settings.username_highlighting.enabled&&(i.classList.add("mentions-me"),i.dataset.tooltip="This queue item contains your username",this.addTooltipListener(i)),i.addEventListener("click",()=>{this.ws.queue.queues[n].item=s,this.ws.current=this.ws.queue.queues[n],this.renderQueue()}),o.appendChild(i),c.set(s.id,i),i.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e));null===u?i!==o.firstChild&&o.insertBefore(i,o.firstChild):i.previousSibling!==u&&o.insertBefore(i,u.nextSibling),i.classList.toggle("current",s.id===(null===(p=t)||void 0===p?void 0:p.id)),u=i}for(const[t,n]of c.entries())e.some(e=>e.id===t)||n.remove();let h=null;for(const t of e){if(!1===t.history)break;h=t}if(null===(s=o.querySelector(".historical-bar"))||void 0===s||s.remove(),null!==h){const e=(0,i.CreateDOMElement)("div",{class:"historical-bar"});o.insertBefore(e,c.get(h.id).nextSibling);const t=(0,i.CreateDOMElement)("span",{class:"label"});e.appendChild(t);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-box-archive",attributes:{title:"All items above this line have been viewed"}});t.appendChild(n)}(null===(a=this.ws.queue.queues[n].previous)||void 0===a?void 0:a.id)!==(null===(r=t)||void 0===r?void 0:r.id)&&(this.ws.queue.queues[n].previous=t,this.newCurrentItem(t))}removeQueueItem(e,t){const n=document.querySelector(`.queue-item[data-type="${e}"][data-id="${t}"]`);n&&(n.remove(),this.updateQueueTabs([e]))}clearQueueItems(){document.querySelector("#queue-items").innerHTML="",this.renderQueue()}updateHiddenItems(e){if(void 0===e&&(e=this.ws.queue.current.item),null===e)return this.ws.store.UI.hide_tools,document.querySelectorAll("[data-queue-type]").forEach(e=>e.classList.add("hidden"));let t=e.type;"abuselog"===t&&e.revid&&(t="edit");const n=c.Queue.groups[t];document.querySelectorAll("[data-queue-type]").forEach(e=>{const t=e.dataset.queueType||"*";"*"===t?e.classList.remove("hidden"):e.classList.toggle("hidden",!t.split(",").includes(n))})}async newCurrentItem(e=null,t=!1){var n,s;null===(n=this.controllers.current)||void 0===n||n.abort();const a=new AbortController;this.controllers.current=a,null!==e&&(this.updateDiffDisplay("loading"),await this.ws.queue.propagate(e,!0)),this.stopOutdatedCheck(),this.toggleEditWarNotice((null==e?void 0:e.reverts)>=3,(null==e?void 0:e.reverts)||0),this.toggleOutdatedNotice(!1),this.togglePendingNotice(!1),this.closeMenus(),this.removeTooltips(),document.querySelectorAll("#right-top > div > :not(.hidden)").forEach(e=>e.classList.add("hidden"));const r=document.querySelector("#user-contributions > .queue-list");r.innerHTML="";const o=document.querySelector("#page-history > .queue-list");if(o.innerHTML="",document.querySelector("#user-contributions > .header > .pills").innerHTML="",document.querySelector("#page-history > .header > .pills").innerHTML="",document.querySelector("#pending-changes-container").classList.toggle("hidden",!(this.ws.rights.review&&this.ws.queue.pending.has(null==e?void 0:e.id))),this.updateHiddenItems(e),null===e)return this.generateEditDetails(),document.querySelector("#diff-container").innerHTML="",document.querySelector("#diff-scroll-up").classList.add("hidden"),document.querySelector("#diff-scroll-down").classList.add("hidden"),document.querySelector("#ai-analysis-container").classList.add("hidden"),void([...document.querySelectorAll("#queue-tabs > .queue-tab")].every(e=>"none"===getComputedStyle(e).display)&&(document.querySelector("#diff-container").innerHTML='\n\t\t\t\t\t<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: grey;">\n\t\t\t\t\t\t<div style="font-size: 48px; margin-bottom: 16px;">\n\t\t\t\t\t\t\t<i class="fas fa-shield-alt"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 24px; margin-bottom: 8px; text-align: center;">\n\t\t\t\t\t\t\tNo queues are enabled\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 14px; text-align: center; max-width: 100%; margin-top: 10px;">\n\t\t\t\t\t\t\tI heard there was a WikiShield,<br>\n\t\t\t\t\t\t\tWhich entered an oversaturated field,<br>\n\t\t\t\t\t\t\tBut you don&rsquo;t ever use Huggle, do you?<br>\n\t\t\t\t\t\t\tWell it simplifies any AIV,<br>\n\t\t\t\t\t\t\tBut superintendence matters to me\n\t\t\t\t\t\t\t<span style="display: block; margin-top: 8px;">&mdash; User:WikiMacaroons</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t'));const l=e.type,d=c.Queue.groups[l];if(!t&&"abuselog"===l&&!e.revid){const t=async()=>{a.signal.aborted||this.ws.api.getAbuseLogRevid(e.id).then(n=>{var s,i;n&&(e.revid=n,e.id===(null===(i=this.ws.queue.current.item)||void 0===i?void 0:i.id)&&this.newCurrentItem(this.ws.queue.current.item,!0));e.id===(null===(s=this.ws.queue.current.item)||void 0===s?void 0:s.id)&&setTimeout(()=>t(),1e3)})};t()}const u=null==e||null===(s=e.page)||void 0===s?void 0:s.watched;if(document.querySelector("#page-watch").classList.toggle("hidden",!0===u),document.querySelector("#page-unwatch").classList.toggle("hidden",!0!==u),document.querySelector("#user-report-uaa").classList.toggle("hidden",null==e?void 0:e.user.anon),document.querySelector("#user-request-global-lock").classList.toggle("hidden",null==e?void 0:e.user.anon),this.ws.AI){const t=this.ws.store;null===e.AI.edit&&t.settings.AI.edit_analysis.enabled&&this.ws.AI.analyze.edit(e).then(t=>{e.AI.edit=t}).catch(t=>{e.AI.edit={error:t.message}}).finally(()=>{var t;e.id===(null===(t=this.ws.queue.current.item)||void 0===t?void 0:t.id)&&this.updateAIAnalysisDisplay(e.AI.edit)}),null!==e.AI.username||e.user.anon||t.whitelist.users.has(e.user)||!t.settings.AI.username_analysis.enabled||this.ws.AI.analyze.username(e).then(t=>{e.AI.username=t,t.flag&&this.ws.queue.promptUAA(e,t)}).catch(t=>{e.AI.username={error:t.message}})}if(this.updateAIAnalysisDisplay(e.AI.edit),!e.seen)switch(e.seen=!0,this.ws.store.statistics.edits_reviewed.total++,this.ws.queue.current.type){case"recent":this.ws.store.statistics.recent_changes_reviewed.total++;break;case"pending":this.ws.store.statistics.pending_changes_reviewed.total++;break;case"watchlist":this.ws.store.statistics.watchlist_changes_reviewed.total++;break;case"users":this.ws.store.statistics.users_reviewed.total++}{const t=(0,i.CreateDOMElement)("div",{class:"pill",content:`${e.user.edits.toLocaleString()} edit${1===e.user.edits?"":"s"}`});document.querySelector("#user-contributions > .header > .pills").appendChild(t)}if("0"!==e.user.warning){const t=(0,i.CreateDOMElement)("div",{class:`pill uw-${e.user.warning}`});document.querySelector("#user-contributions > .header > .pills").appendChild(t),t.textContent=`uw-${e.user.warning}`;const n=e.user.warnings;if(n.length>0){const s=document.createElement("div"),i=document.createElement("div");i.classList.add("tooltip-title"),i.textContent=`Warnings for ${e.user.name}`,s.appendChild(i);for(const e of n){const t=document.createElement("div");t.classList.add("tooltip-item","user-warnings"),s.appendChild(t);const n=document.createElement("span");n.classList.add("tooltip-item-level"),n.textContent=`${e.template}${e.level}`,t.appendChild(n);const i=document.createElement("div");i.classList.add("tooltip-item-details"),t.appendChild(i);const a=document.createElement("span");a.classList.add("tooltip-item-user"),a.textContent=e.username?`by User:${e.username}`:"by Unknown",i.appendChild(a),i.appendChild(document.createElement("br"));const r=document.createElement("span");r.classList.add("tooltip-item-date"),i.appendChild(r),e.timestamp?(r.dataset.time=e.timestamp,r.dataset.timeFormat="notification",r.textContent=this.ws.util.formatNotificationTime(new Date(e.timestamp))):r.textContent="Date unknown"}t.dataset.tooltip=s.innerHTML,t.dataset.tooltipHtml=!0}this.addTooltipListener(t)}const p=e.user.blocks;if(p.length>0){const t=(0,i.CreateDOMElement)("div",{class:"pill ub"});document.querySelector("#user-contributions > .header > .pills").appendChild(t);const n=document.createElement("div"),s=document.createElement("div");s.classList.add("tooltip-title"),s.textContent=`Blocks for ${e.user.name}`,n.appendChild(s);for(const e of p){var g;const t=document.createElement("div");t.classList.add("tooltip-item","user-blocks"),n.appendChild(t);const s=document.createElement("span");s.classList.add("tooltip-item-level"),s.innerHTML=e.parsedcomment||"No reason provided",t.appendChild(s);const i=document.createElement("div");i.classList.add("tooltip-item-details"),t.appendChild(i);const a=document.createElement("span");a.classList.add("tooltip-item-user"),a.textContent=e.user?`by User:${e.user}`:"by Unknown",i.appendChild(a),i.appendChild(document.createElement("br"));const r=document.createElement("span");r.classList.add("tooltip-item-time"),i.appendChild(r);const o=document.createElement("span");e.timestamp?(o.dataset.time=e.timestamp,o.dataset.timeFormat="notification",o.textContent=this.ws.util.formatNotificationTime(new Date(e.timestamp))):o.textContent="Date unknown",r.appendChild(o);const l=document.createElement("span");l.textContent=`(for ${(null===(g=e.params)||void 0===g?void 0:g.duration)||"an unknown duration"})`,r.appendChild(l)}t.classList.remove("hidden"),t.textContent=`${p.length} block${1===p.length?"":"s"}`,t.dataset.tooltip=n.innerHTML,t.dataset.tooltipHtml=!0,this.addTooltipListener(t)}{const t=document.querySelector("#user-whitelist"),n=document.querySelector("#user-unwhitelist");if(t&&n){const s=()=>{const s=this.ws.store.whitelist.users.has(e.user.name);t.classList.toggle("hidden",s),n.classList.toggle("hidden",!s)};t.onclick=s,n.onclick=s,s()}const s=document.querySelector("#user-highlight"),i=document.querySelector("#user-unhighlight");if(s&&i){const t=()=>{const t=this.ws.store.highlight.users.has(e.user.name);s.classList.toggle("hidden",t),i.classList.toggle("hidden",!t)};s.onclick=t,i.onclick=t,t()}}{const t=document.querySelector("#page-whitelist"),n=document.querySelector("#page-unwhitelist");if(t&&n){const s=()=>{const s=this.ws.store.whitelist.pages.has(e.page.title);t.classList.toggle("hidden",s),n.classList.toggle("hidden",!s)};t.onclick=s,n.onclick=s,s()}const s=document.querySelector("#page-highlight"),i=document.querySelector("#page-unhighlight");if(s&&i){const t=()=>{const t=this.ws.store.highlight.pages.has(e.page.title);s.classList.toggle("hidden",t),i.classList.toggle("hidden",!t)};s.onclick=t,i.onclick=t,t()}}(async t=>{const n=e.user.contributions;for(const e of n){var s;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(s=this.ws.queue.current.item.revid)&&void 0!==s?s:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML({page:{title:e.title},user:{name:e.user},comment:"Loading...",timestamp:e.timestamp,sizediff:0,ores:NaN,tags:e.tags||[],type:"edit"}),r.appendChild(t),requestAnimationFrame(()=>t.classList.remove("no-transition"))}if(e.page.cached_contributions){const s=await e.page.cached_contributions;if(t.aborted)return;n.some((e,t)=>{var n;return e.id!==(null===(n=s[t])||void 0===n?void 0:n.id)})&&delete e.page.cached_contributions}e.user.cached_contributions||(e.user.cached_contributions=this.ws.queue.generate("edit",n,!0));const i=await e.user.cached_contributions;if(!t.aborted){r.innerHTML="";for(const e of i.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp))){var a;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(a=this.ws.queue.current.item.revid)&&void 0!==a?a:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML(e),r.appendChild(t),t.addEventListener("mouseover",()=>this.ws.queue.propagate(e,!0)),t.addEventListener("click",()=>this.ws.queue.loadFromItem(e)),t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e)),requestAnimationFrame(()=>t.classList.remove("no-transition"))}}})(a.signal).catch(e=>{a.signal.aborted||console.error("Error loading contributions:",e)});switch(d){case"edit":{var h;if(this.startOutdatedCheck(e),!this.ws.queue.pending.has(e.id))(null===(h=e.consecutive)||void 0===h?void 0:h.count)>=2&&(document.querySelector("#latest-edits-tab").classList.remove("hidden"),document.querySelector("#consecutive-edits-tab").classList.remove("hidden"));const t=e.page.protection;if(t.protected||this.ws.queue.pending.has(e.id)){const n=(0,i.CreateDOMElement)("div",{class:"pill"});if(document.querySelector("#page-history > .header > .pills").appendChild(n),t.protected){let e,s;switch(t.level){case"sysop":e="F",s="Requires sysop right to edit";break;case"template":e="T",s="Requires template editor to edit";break;case"extendedconfirmed":e="EC",s="Requires extended confirmed right to edit";break;case"autoconfirmed":e="AC",s="Requires autoconfirmed right to edit";break;default:e="?",s="Uknown protection level"}n.innerHTML=`<i class="fas fa-lock"></i> <span class="protection-icon" data-tooltip="${s}">${e}</span>`,this.addTooltipListener(n.querySelector("[data-tooltip]"))}else if(this.ws.queue.pending.has(e.id)){var m;const t=(null===(m=this.ws.queue.pending.get(e.id).pending.stability)||void 0===m?void 0:m.parsedcomment)||"No comment provided",s=document.createElement("span");s.classList.add("protection-icon"),s.innerHTML="<i class='fas fa-lock'></i> PC",s.dataset.tooltip=t,s.dataset.tooltipHtml=!0,n.appendChild(s),this.addTooltipListener(n.querySelector("[data-tooltip]"))}}for(const t of e.page.metadata){const e=(0,i.CreateDOMElement)("div",{class:"pill",content:t});document.querySelector("#page-history > .header > .pills").appendChild(e)}}break;case"logevent":break;case"abuselog":{e.revid&&this.startOutdatedCheck(e);const t=document.querySelector("#protection-indicator");if(t){const n=e.page.protection;if(n.protected){let e,s;switch(n.level){case"sysop":e="P",s="Requires sysop right to edit";break;case"extendedconfirmed":e="X",s="Requires extended confirmed right to edit";break;case"autoconfirmed":e="A",s="Requires autoconfirmed right to edit";break;default:e="?",s="Uknown protection level"}t.innerHTML=`<span class="protection-icon" data-tooltip="${s}">${e}</span>`,this.addTooltipListener(t.querySelector("[data-tooltip]"))}else if(this.ws.queue.pending.has(e.id)){var v;const n=(null===(v=this.ws.queue.pending.get(e.id).pending.stability)||void 0===v?void 0:v.parsedcomment)||"No comment provided",s=document.createElement("span");s.classList.add("protection-icon"),s.textContent="PC",s.dataset.tooltip=n,s.dataset.tooltipHtml=!0,t.appendChild(s),this.addTooltipListener(t.querySelector("[data-tooltip]"))}else t.innerHTML=""}}}if("edit"===d||"abuselog"===d){(async t=>{const n=e.page.history;for(const e of n){var s;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(s=this.ws.queue.current.item.revid)&&void 0!==s?s:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML({page:{title:e.title},user:{name:e.user},comment:"Loading...",timestamp:e.timestamp,sizediff:0,ores:NaN,tags:e.tags||[],type:"edit"}),o.appendChild(t),requestAnimationFrame(()=>t.classList.remove("no-transition"))}if(e.page.cached_history){const s=await e.page.cached_history;if(t.aborted)return;n.some((e,t)=>{var n;return e.id!==(null===(n=s[t])||void 0===n?void 0:n.id)})&&delete e.page.cached_history}e.page.cached_history||(e.page.cached_history=this.ws.queue.generate("edit",n,!0));const i=await e.page.cached_history;if(!t.aborted){o.innerHTML="";for(const e of i.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp))){var a;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(a=this.ws.queue.current.item.revid)&&void 0!==a?a:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML(e),o.appendChild(t),t.addEventListener("mouseover",()=>this.ws.queue.propagate(e,!0)),t.addEventListener("click",()=>this.ws.queue.loadFromItem(e)),t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e)),requestAnimationFrame(()=>t.classList.remove("no-transition"))}}})(a.signal).catch(e=>{a.signal.aborted||console.error("Error loading history:",e)})}this.updateDiffDisplay(e,!1)}updateDiffDisplay(e,t){var n;const s=document.querySelector("#diff-container");if(!e)return document.querySelector("#diff-scroll-up").classList.add("hidden"),void document.querySelector("#diff-scroll-down").classList.add("hidden");if("loading"===e){const e=document.createElement("div");e.className="loading-container";const t=document.createElement("div");t.className="loading-spinner",e.appendChild(t);const n=document.createElement("i");n.className="fas fa-spinner fa-spin",t.appendChild(n);const i=document.createElement("div");return i.className="loading-text animate-loading-dots",i.textContent="Loading edit",e.appendChild(i),void(s.innerHTML=e.outerHTML)}switch(document.querySelectorAll("#right-top > .tabs > .tab.selected").forEach(e=>e.classList.remove("selected")),this.generateEditDetails(e,t),c.Queue.groups[e.type]){case"edit":var i,a;if(this.ws.queue.pending.get(e.id))s.innerHTML=`<table>${null!==(i=e.diff)&&void 0!==i?i:"<em>No diff available</em>"}</table>`;else if(t&&(null===(a=e.consecutive)||void 0===a?void 0:a.count)>1){var r,o;document.querySelector("#consecutive-edits-tab").classList.add("selected"),null===(r=e.consecutive.diff)||void 0===r||r?s.innerHTML=`<table>${null!==(o=e.consecutive.diff)&&void 0!==o?o:"<em>No diff available</em>"}</table>`:s.innerHTML="<table><em>No difference</em></table>"}else{var l;document.querySelector("#latest-edits-tab").classList.add("selected"),s.innerHTML=`<table>${null!==(l=e.diff)&&void 0!==l?l:"<em>No diff available</em>"}</table>`}if(this.ws.store.settings.username_highlighting.enabled){const t=this.ws.api.username;t&&(e.mentions.diff&&s.querySelectorAll("td").forEach(e=>{e.textContent&&this.ws.util.match(t,e.textContent)&&e.classList.add("ws-username-highlight")}),e.mentions.comment&&e.comment&&this.ws.util.match(t,e.comment)&&document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"))}break;case"logevent":if("users"===e.type){s.innerHTML="";const t=e.user.profanity,n=document.createElement("div");n.classList.add("profanity"),s.appendChild(n);const i=document.createElement("div");{i.classList.add("profanity-header"),n.appendChild(i);const e=document.createElement("div");{e.classList.add("profanity-score"),i.appendChild(e);const n=document.createElement("span");n.classList.add("score-label"),n.textContent="Profanity Score:",e.appendChild(n);const s=document.createElement("span");s.classList.add("score-value"),s.textContent=t.finalScore,e.appendChild(s)}const s=document.createElement("div");{s.classList.add("profanity-risk",`risk-${t.risk.toLowerCase()}`),i.appendChild(s);const e=document.createElement("span");switch(e.classList.add("fa"),t.risk){case"No":e.classList.add("fa-smile");break;case"Low":e.classList.add("fa-thumbs-up");break;case"Medium":e.classList.add("fa-meh");break;case"High":e.classList.add("fa-thumbs-down");break;case"Critical":e.classList.add("fa-skull-crossbones")}s.appendChild(e);const n=document.createElement("span");n.textContent=`${t.risk} risk`,s.appendChild(n)}}const a=t.matches;if(a.length>0){const e=document.createElement("div");e.classList.add("profanity-matches-header"),n.appendChild(e);const t=document.createElement("span");t.classList.add("fa","fa-search"),e.appendChild(t);const s=document.createElement("span");s.textContent=`Matched Terms (${a.length})`,e.appendChild(s);const i=document.createElement("div");i.classList.add("profanity-matches-list"),n.appendChild(i);for(const e of a){const t=document.createElement("div");{t.classList.add("profanity-match"),i.appendChild(t);const n=document.createElement("div");{n.classList.add("match-header"),t.appendChild(n);const s=document.createElement("span");s.classList.add("match-text"),s.textContent=e.match,n.appendChild(s);const i=document.createElement("span");i.classList.add("fa","fa-arrow-right"),n.appendChild(i);const a=document.createElement("span");a.classList.add("match-name"),a.textContent=e.name,n.appendChild(a)}const s=document.createElement("div");{s.classList.add("match-details"),t.appendChild(s);const n=document.createElement("div");{n.classList.add("match-stat"),s.appendChild(n);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Confidence",n.appendChild(t);const i=document.createElement("span");i.classList.add("stat-value"),i.dataset.tooltip="How certain we are this is a match.",i.dataset.tooltipDelay=500,i.textContent=`${Math.round(100*e.confidence)}%`,n.appendChild(i)}const i=document.createElement("div");{i.classList.add("match-stat"),s.appendChild(i);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Obfuscation",i.appendChild(t);const n=document.createElement("span");n.classList.add("stat-value"),n.dataset.tooltip="How much the term was altered from its original form.",n.dataset.tooltipDelay=500,n.textContent=`${Math.round(100*e.obfuscation)}%`,i.appendChild(n)}const a=document.createElement("div");{a.classList.add("match-stat"),s.appendChild(a);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Severity",a.appendChild(t);const n=document.createElement("span");n.classList.add("stat-value",`severity-${e.severity}`),n.dataset.tooltip="How severe this term is considered.",n.dataset.tooltipDelay=500,n.textContent=e.severity,a.appendChild(n)}}if(e.note){const n=document.createElement("div");{n.classList.add("match-note"),t.appendChild(n);const s=document.createElement("span");s.classList.add("fa","fa-info-circle"),n.appendChild(s);const i=document.createElement("span");i.classList.add("note-text"),i.textContent=e.note,n.appendChild(i)}}}t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e))}}else{const e=document.createElement("div");e.classList.add("profanity-no-matches"),n.appendChild(e);const t=document.createElement("span");t.classList.add("fa","fa-check-circle"),e.appendChild(t);const s=document.createElement("span");s.textContent="No profanity detected.",e.appendChild(s)}}break;case"abuselog":var d;if(s.innerHTML=`<table>${null!==(d=e.diff)&&void 0!==d?d:"<em>No diff available</em>"}</table>`,this.ws.store.settings.username_highlighting.enabled){const t=this.ws.api.username;t&&(e.mentions.diff&&s.querySelectorAll("td").forEach(e=>{e.textContent&&this.ws.util.match(t,e.textContent)&&e.classList.add("ws-username-highlight")}),e.mentions.comment&&e.comment&&this.ws.util.match(t,e.comment)&&document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"))}}s.querySelectorAll(":is(.mw-diff-movedpara-left, .mw-diff-movedpara-right)").forEach(e=>{const t=e.href.split("#")[1];delete e.href,e.innerHTML=e.classList.contains("mw-diff-movedpara-left")?">":"<",e.addEventListener("click",e=>{e.preventDefault();const n=s.querySelector(`a[name="${t}"]`);if(n){const e=n.getBoundingClientRect(),t=s.getBoundingClientRect(),i=e.top-t.top+s.scrollTop-(t.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),s.querySelectorAll(".flash-highlight").forEach(e=>e.classList.remove("flash-highlight"));const a=n.parentElement.parentElement;a.classList.add("flash-highlight"),setTimeout(()=>{var e;return null==a||null===(e=a.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)}})});const u=s.querySelectorAll(".diff-addedline, .diff-deletedline"),p=null!==(n=s.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange")[0])&&void 0!==n?n:u[0];p?requestAnimationFrame(()=>{const e=p.getBoundingClientRect(),t=s.getBoundingClientRect(),n=e.top-t.top+s.scrollTop-(t.height-e.height)/2;function i(){const e=s.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange");let t=null,n=null;const i=s.getBoundingClientRect();for(const s of e){let e=!1,a=!1;const r=s.getBoundingClientRect();r.bottom<i.top&&(e=!0),r.top>i.bottom&&(a=!0),e&&a||(e&&(t=s),null===n&&a&&(n=s))}const a=document.querySelector("#diff-scroll-up");a.classList.toggle("hidden",!t),a.onclick=()=>{const e=t.getBoundingClientRect(),n=s.getBoundingClientRect(),i=e.top-n.top+s.scrollTop-(n.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),t.classList.add("flash-highlight"),setTimeout(()=>{var e;return null===(e=t)||void 0===e||null===(e=e.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)};const r=document.querySelector("#diff-scroll-down");r.classList.toggle("hidden",!n),r.onclick=()=>{const e=n.getBoundingClientRect(),t=s.getBoundingClientRect(),i=e.top-t.top+s.scrollTop-(t.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),n.classList.add("flash-highlight"),setTimeout(()=>{var e;return null===(e=n)||void 0===e||null===(e=e.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)}}s.scrollTo({top:Math.max(0,n),behavior:"smooth"}),i(),s.onscroll=()=>requestAnimationFrame(i),window.onresize=()=>requestAnimationFrame(i)}):(document.querySelector("#diff-scroll-up").classList.add("hidden"),document.querySelector("#diff-scroll-down").classList.add("hidden"))}updateAIAnalysisDisplay(e){const t=document.querySelector("#ai-analysis-container");if(!t||!e)return t.classList.add("hidden");if(t.classList.remove("hidden"),e.error){const n=t.querySelector(":scope > .header > .assessment");n.textContent="Error",n.className="assessment error",t.querySelector(":scope > .header > .confidence").textContent="",t.querySelector(":scope > .explanation").textContent=e.error;t.querySelector(":scope > .issues").innerHTML=""}else{const n=t.querySelector(":scope > .header > .assessment");n.textContent=e.assessment,n.className=`assessment ${e.assessment.toLowerCase().replace(/\s+/g,"-")}`,t.querySelector(":scope > .header > .confidence").textContent=`${Math.round(100*(e.confidence||0))}% confidence`;const s=function(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}(v,this,b).call(this,e.explanation||"No explanation provided.");t.querySelector(":scope > .explanation").innerHTML=s;const i=t.querySelector(":scope > .issues");i.innerHTML="";for(const t of e.issues||[]){const e=document.createElement("div");e.classList.add("issue",t.severity.toLowerCase().replace(/\s+/g,"-")),e.textContent=t.policy,i.appendChild(e)}t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e))}}async outdated(e){let t=e.type,n=e.id;if("abuselog"===t&&e.revid&&(t="edit",n=e.revid),"edit"!==c.Queue.groups[t])return this.toggleOutdatedNotice(!1),void this.togglePendingNotice(!1);if("pending"===e.type)return this.togglePendingNotice(!this.ws.queue.pending.has(n),!0);if(!e.pending&&"pending"===this.ws.queue.type)return this.togglePendingNotice(!0,!1);try{var s;const t=(await this.ws.api.getLatestIds([e.page.title]))[e.page.title];(null===(s=this.ws.queue.current.item)||void 0===s?void 0:s.id)===e.id&&this.toggleOutdatedNotice(t>n,t,e.page.title,n)}catch(e){console.error("Error checking if edit is outdated:",e),this.toggleOutdatedNotice(!1)}}startOutdatedCheck(e){this.stopOutdatedCheck(),this.outdated(e),this.intervals.outdated=setInterval(()=>{var t;e.id===(null===(t=this.ws.queue.current.item)||void 0===t?void 0:t.id)?this.outdated(e):this.stopOutdatedCheck()},1e3)}stopOutdatedCheck(){this.intervals.outdated&&(clearInterval(this.intervals.outdated),this.intervals.outdated=null),this.toggleOutdatedNotice(!1),this.togglePendingNotice(!1)}toggleEditWarNotice(e,t){const n=document.querySelector("#edit-war-notice");if(null!=e||(e=!n),e!==Boolean(n))if(e){const e=document.createElement("div");e.id="edit-war-notice",e.classList.add("notice","edit-war");const n=document.createElement("span");n.classList.add("fa","fa-warning"),e.appendChild(n);const s=document.createElement("span");s.classList.add("text"),s.innerHTML=`<b>3RR:</b> You have made ${t} reverts on this page in the last 24 hours.`,e.appendChild(s);const i=document.querySelector("#diff-container");i.parentElement.insertBefore(e,i)}else{const e=document.querySelector("#edit-war-notice");e&&e.remove()}}toggleOutdatedNotice(e,t,n,s){const i=document.querySelector("#outdated-notice");if(null!=e||(e=!i),e!==Boolean(i))if(e){const e=document.createElement("div");e.id="outdated-notice",e.classList.add("notice","outdated"),e.dataset.id=t,e.dataset.page=n;const s=document.createElement("span");s.classList.add("fa","fa-clock-rotate-left"),e.appendChild(s);const i=document.createElement("span");i.classList.add("text"),i.textContent="Newer revision available on this page.",e.appendChild(i);const a=document.createElement("span");a.classList.add("button"),a.innerHTML="<i class='fas fa-redo restore'></i> Restore this revision",a.addEventListener("click",async e=>{e.preventDefault();const t=await this.dialog.input("Restore Edit","Are you sure you want to restore this revision? This will create a new edit that reverts the page to this revision.","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"restore-edit",params:{summary:t}}]})}),e.appendChild(a);const r=document.createElement("span");r.classList.add("button"),r.innerHTML="View latest <i class='fas fa-arrow-right'></i>",r.addEventListener("click",t=>{t.preventDefault();const n=e.dataset.page,s=+e.dataset.id;n&&s&&this.ws.queue.loadFromRevision(n,s)}),e.appendChild(r);const o=document.querySelector("#diff-container");o.parentElement.insertBefore(e,o)}else{const e=document.querySelector("#outdated-notice");e&&e.remove()}else i&&(i.dataset.id=t,i.dataset.page=n)}togglePendingNotice(e,t){const n=document.querySelector("#pending-notice");if(null!=e||(e=!n),e!==Boolean(n))if(e){const e=document.createElement("div");e.id="pending-notice",e.classList.add("notice","outdated","pending");const n=document.createElement("span");n.classList.add("fa","fa-shield-alt"),e.appendChild(n);const s=document.createElement("span");s.classList.add("text"),s.textContent=t?"This revision cannot be reviewed because it is outdated":"This revision cannot be reviewed because it is not pending review",e.appendChild(s);const i=document.querySelector("#diff-container");i.parentElement.insertBefore(e,i)}else{const e=document.querySelector("#pending-notice");e&&e.remove()}}getORESColor(e){if(isNaN(e)||e<0)return"rgba(128, 128, 128, .5)";e=Math.min(Math.max(e||0,0),1);const t=f.palettes[this.ws.store.UI.theme.palette];return t[e*(t.length-1)|0]}updatePalette(){document.querySelectorAll("[data-ores]").forEach(e=>{e.style.setProperty("--ores-color",this.getORESColor(parseFloat(e.dataset.ores)))})}updateZenMode(){this.ws.notifications.count();const e=this.ws.store.settings.zen_mode;e.enabled&&e.music.enabled?this.ws.audio.zengine.start():this.ws.audio.zengine.stop(),document.querySelectorAll("[data-zen-show]").forEach(t=>{const n=t.dataset.zenShow.split(",");e.enabled&&!n.some(t=>{var n;return null===(n=e[t])||void 0===n?void 0:n.enabled})?t.style.display="none":t.style.display=""})}updateAccessibility(){document.body.classList.toggle("colorblind-mode",this.ws.store.settings.accessibility.colorblind),document.body.classList.toggle("dyslexia-font",this.ws.store.settings.accessibility.dyslexia),document.body.classList.toggle("high-contrast",this.ws.store.settings.accessibility.high_contrast),document.body.classList.toggle("reduce-motion",this.ws.store.settings.accessibility.reduce_motion)}reorderQueues(){var e;const t=c.Queue.types.map(e=>({name:e,...this.ws.store.settings.queue[e]}));t.sort((e,t)=>e.order-t.order),t.forEach(e=>{const t=document.querySelector(`#queue-tab-${e.name}`);t&&(t.style.display=e.enabled?"":"none",t.parentElement.appendChild(t))});const n=t.find(e=>e.name===this.ws.queue.current.type)?this.ws.queue.current.type:null===(e=t.find(e=>e.enabled))||void 0===e?void 0:e.name;if(n)this.ws.queue.switch(n);else{const e=document.createElement("div");e.classList.add("queue-empty"),e.textContent="No items in queue",document.querySelector("#queue-items").innerHTML=e.outerHTML,this.newCurrentItem(null),this.ws.queue.switch("void")}}updateQueueTabs(e=c.Queue.types){const t=this.ws.queue.queues;e.forEach(e=>{const n=document.querySelector(`#queue-tab-${e}`);if(!n||!t[e])return;const s=n.querySelector(":scope > span > .icon-count"),i=t[e].queue.length;s.classList.toggle("hidden",0===i),s.textContent=i,n.classList.toggle("mentions-me",this.ws.store.settings.username_highlighting.enabled&&t[e].queue.some(e=>e.mentions.has))})}createTooltip(e,t="",n="",s=!1,i=10,a=null){const r=document.createElement("div");r.className=`tooltip ${t}`,r.style.opacity=0,s?r.innerHTML=n:r.textContent=n,document.body.querySelector("#app").appendChild(r),"function"==typeof a&&a(r),r.offsetHeight;const o=r.getBoundingClientRect(),l=o.width,d=o.height,c=e.getBoundingClientRect(),u=innerWidth,p=innerHeight,g=[["bottom",(c.left+c.right)/2-l/2,c.bottom+10,!0],["top",(c.left+c.right)/2-l/2,c.top-d-10,!0],["right",c.right+10,(c.top+c.bottom)/2-d/2,!0],["left",c.left-l-10,(c.top+c.bottom)/2-d/2,!0]];let h=null,m=-1/0;for(const[e,t,n,s]of g){let e=t,i=n;if(e>=0&&e+l<=u&&i>=0&&i+d<=p){m=100,h=[e,i];break}if(s){const s=Math.max(0,Math.min(e,u-l)),a=Math.max(0,Math.min(i,p-d)),r=!(s+l<=c.left||s>=c.right||a+d<=c.top||a>=c.bottom),o=Math.abs(s-t)+Math.abs(a-n),g=r?-50-o:50-o/10;g>m&&(m=g,h=[s,a])}}return h?(r.style.left=`${h[0]}px`,r.style.top=`${h[1]}px`):(r.style.left=`${Math.max(0,Math.min((c.left+c.right)/2-l/2,u-l))}px`,r.style.top=`${Math.max(0,Math.min((c.top+c.bottom)/2-d/2,p-d))}px`),e.addEventListener("mousewheel",e=>r.scrollBy({left:e.deltaX,top:e.deltaY,behavior:"smooth"})),setTimeout(()=>r.style.opacity=1,i),r}removeTooltips(){document.querySelectorAll(".tooltip").forEach(e=>e.remove())}addTooltipListener(e){if(!e.dataset.tooltip)return;let t;e.addEventListener("mouseenter",()=>{e.dataset.tooltip&&(t&&t.remove(),t=this.createTooltip(e,"",e.dataset.tooltip,"true"===e.dataset.tooltipHtml,+e.dataset.tooltipDelay||100))}),e.addEventListener("mouseleave",()=>{t&&(t.remove(),t=null)})}positionBottomMenu(e,t){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="";const n=()=>{if(!t.classList.contains("show"))return;const s=t.getBoundingClientRect(),i=e.getBoundingClientRect(),a=innerWidth,r=innerHeight;i.left+s.width<=a?(t.style.left=`${i.left}px`,t.style.right="auto"):(t.style.right=a-i.right+"px",t.style.left="auto");i.top>=s.height?(t.style.bottom=r-i.top+"px",t.style.top="auto"):(t.style.top=`${i.bottom}px`,t.style.bottom="auto"),requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionSubmenu(e,t){e.style.left="",e.style.right="",e.style.top="",e.style.bottom="";const n=()=>{if(!e.classList.contains("show"))return;const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left;o<s.width+20&&l>o&&(e.style.left="auto",e.style.right="calc(100% + 4px)");const d=r-i.bottom,c=i.top;s.bottom>r&&c>d&&(e.style.top="auto",e.style.bottom="0"),requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionLevelsMenu(e,t){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="";const n=()=>{if(!t.classList.contains("show"))return;const s=t.getBoundingClientRect(),i=e.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left,d=o>=s.width+8,c=l>=s.width+8;d?(t.style.left=`${i.right+8}px`,t.style.right="auto"):c?(t.style.right=a-i.left+8+"px",t.style.left="auto"):o>l?(t.style.left=`${i.right+8}px`,t.style.right="auto"):(t.style.right=a-i.left+8+"px",t.style.left="auto");const u=Math.max(Math.min(i.top+(i.height-s.height)/2,r-s.height-8),8);t.style.top=`${u}px`,t.style.bottom="auto",requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionWarningSubmenu(e,t){e.style.left="",e.style.right="",e.style.top="",e.style.bottom="";const n=()=>{if(!e.classList.contains("show"))return;const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left,d=o>=s.width+8,c=l>=s.width+8;d?(e.style.left=`${i.right+8}px`,e.style.right="auto"):c?(e.style.right=a-i.left+8+"px",e.style.left="auto"):o>l?(e.style.left=`${i.right+8}px`,e.style.right="auto"):(e.style.right=a-i.left+8+"px",e.style.left="auto");const u=Math.max(Math.min(i.top+(i.height-s.height)/2,r-s.height-8),8);e.style.top=`${u}px`,e.style.bottom="auto",requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}createWarningItem(e,t,n,s,i=!1){const a=this.ws.store.favorite[s],r=document.createElement("div");r.classList.add("warning-menu-item"),i?(r.draggable=!0,r.classList.add("favorite-item")):r.classList.add("submenu-option"),r.dataset.warning=e.title;const o=document.createElement("span");o.classList.add("favorite-star"),a.includes(e.title)?(o.classList.add("favorited"),o.innerHTML="<i class='fas fa-star'></i>"):o.innerHTML="<i class='fa-regular fa-star'></i>",r.appendChild(o),o.addEventListener("click",t=>{t.stopPropagation();const n=a.indexOf(e.title),l="reverts"===s?document.querySelector("#revert-menu > .warning-menu"):document.querySelector("#warn-menu > .warning-menu");if(-1===n){a.push(e.title),o.classList.add("favorited","spin"),o.innerHTML="<i class='fas fa-star'></i>";let t=l.querySelector(".favorites-section");if(!t){t=document.createElement("div"),t.className="favorites-section";const e=document.createElement("div");e.className="favorites-header",e.innerHTML='<span class="icon fas fa-star"></span><span>Favorites</span>',t.appendChild(e);const n=document.createElement("div");n.className="favorites-container",t.appendChild(n),l.insertBefore(t,l.firstChild);const s=document.createElement("div");s.className="favorites-separator",l.insertBefore(s,t.nextSibling)}const n=l.__executeCallbacks__;n&&t.querySelector(".favorites-container").appendChild(this.createWarningItem(e,n.executeWithWarn,n.executeNoWarn,s,!0))}else if(a.splice(n,1),o.classList.remove("favorited"),o.classList.add("spin"),o.innerHTML="<i class='fa-regular fa-star'></i>",i){r.remove();const t=l.querySelector(".favorites-section");var d;if(0===(null==t?void 0:t.querySelector(".favorites-container").children.length))t.remove(),null===(d=l.querySelector(".favorites-separator"))||void 0===d||d.remove();const n=document.body.querySelector(`.warning-menu-item:not(.favorite-item)[data-warning="${e.title}"]`);if(n){const e=n.querySelector(".favorite-star");e.classList.remove("favorited"),e.innerHTML="<i class='fa-regular fa-star'></i>",e.classList.add("spin"),setTimeout(()=>e.classList.remove("spin"),500)}}else{const t=l.querySelector(".favorites-section");if(t){const n=t.querySelector(`[data-warning="${e.title}"]`);var c;if(n)if(n.remove(),0===t.querySelector(".favorites-container").children.length)t.remove(),null===(c=l.querySelector(".favorites-separator"))||void 0===c||c.remove()}}setTimeout(()=>o.classList.remove("spin"),500)});const l=document.createElement("span");l.className=`icon ${e.icon}`,r.appendChild(l);const d=document.createElement("span");d.className="warning-menu-title",d.textContent=e.title,r.appendChild(d);const c=document.createElement("span");if(c.className="fas fa-circle-question",c.dataset.tooltip=`${e.description} (click for template preview)`,r.appendChild(c),this.addTooltipListener(c),c.addEventListener("click",async t=>{t.preventDefault(),t.stopPropagation();const n=this.ws;this.dialog.show(e.title,async function(){return(await Promise.allSettled(e.templates.map(e=>{const t=n.queue.current.item;return n.api.parse(`{{${e.template}|${t.page.title}}}`,`User:${t.user.name}`,!0)}))).map(e=>{let t="";t="fulfilled"===e.status?e.value:`<em>Error loading template preview: ${e.reason}</em>`;const s=(new DOMParser).parseFromString(t,"text/html").body;return s.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${n.server}`).href)}),s.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${n.server}`).href)}),s.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,s]=e.trim().split(/\s+/,2),i=new URL(t,`https://${n.server}`).href;return s?`${i} ${s}`:i}).join(", ");e.setAttribute("srcset",t)}),s.innerHTML}).join("<div style='height: 1px; background: #0004; margin: 8px 0;'></div>")}())}),!i){const i=document.createElement("div");if(i.classList.add("warning-menu-buttons"),"reverts"===s){const t=document.createElement("span");t.className="warning-menu-button warning-menu-no-warn-button",t.textContent="no warn",i.appendChild(t),t.addEventListener("click",async t=>{t.stopPropagation(),await n(e.title)})}const a=document.createElement("span");a.className="warning-menu-button warning-menu-levels-button",a.textContent="advanced",i.appendChild(a),r.appendChild(i);const o=document.createElement("div");o.className="levels-menu";for(const n of e.templates){if(n.generic)continue;const s=document.createElement("span");s.className=`levels-menu-item colorize-level colorize-level-${n.name}`,s.textContent=n.name,o.appendChild(s),s.addEventListener("click",async()=>await t(e.title,n.name))}document.body.querySelector("#app").appendChild(o),a.addEventListener("click",e=>{e.stopPropagation();const t=o.classList.contains("show");document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show")),t||(o.classList.add("show"),this.positionLevelsMenu(a,o))})}return r.addEventListener("click",async n=>{n.target.closest(".warning-menu-button")||n.target.closest(".favorite-star")||await t(e.title,"auto")}),i&&(r.addEventListener("dragstart",t=>{t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e.title),r.classList.add("dragging")}),r.addEventListener("dragend",()=>{r.classList.remove("dragging")}),r.addEventListener("dragover",e=>{e.preventDefault(),e.dataTransfer.dropEffect="move";const t=document.querySelector(".dragging");if(t&&t!==r){const n=r.getBoundingClientRect(),s=n.top+n.height/2;e.clientY<s?r.parentNode.insertBefore(t,r):r.parentNode.insertBefore(t,r.nextSibling)}}),r.addEventListener("drop",e=>{e.preventDefault();const t=Array.from(r.closest(".favorites-section").querySelectorAll(".favorite-item"));this.ws.store.favorite[s]=t.map(e=>e.dataset.warning)})),r}createWarnMenu(e,t,n){var s,i,a;removeEventListener("keydown",this.warningMenuKeyListener),document.querySelectorAll(".levels-menu").forEach(e=>e.remove()),document.querySelectorAll(".warning-submenu").forEach(e=>e.remove());const r=document.createElement("div");r.className="warning-menu",t.appendChild(r),r.addEventListener("click",e=>{e.target.closest(".warning-submenu")||document.body.querySelectorAll(".warning-submenu.show").forEach(e=>e.classList.remove("show")),e.target.closest(".levels-menu")||document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show"))});const o=async(t,n)=>{const s=(0,u.getWarningFromLookup)(t),i=this.ws.store.settings.auto_report;await this.ws.execute({actions:[{name:"next-item",params:{}},"reverts"===e?{name:"rollback-edit",params:{summary:s.summary}}:{},{name:"warn-user",params:{warning:t,level:n}},{name:"highlight-user",params:{}}].concat(i.enabled&&s.reportable&&i.for.has(t)?[{name:"if",condition:{name:"user-final-warning"},actions:[{name:"report-user-to-aiv",params:{reportMessage:"Vandalism past final warning"}}]}]:[])})},l=async e=>{const t=(0,u.getWarningFromLookup)(e);await this.ws.execute({actions:[{name:"next-item",params:{}},{name:"rollback-edit",params:{summary:t.summary}}]})},d=null!==(s=null===(i=this.ws.queue.current.item)||void 0===i?void 0:i.type)&&void 0!==s?s:this.ws.queue.current.type;let p=c.Queue.groups[d];if("abuselog"===d&&null!==(a=this.ws.queue.current.item)&&void 0!==a&&a.revid&&(p="edit"),r.__executeCallbacks__={executeWithWarn:o,executeNoWarn:l},this.ws.store.favorite.reverts.length>0){const t=document.createElement("div");t.className="favorites-section";const s=document.createElement("div");s.className="favorites-header",s.innerHTML='<span class="icon fas fa-star"></span><span>Favorites</span>',t.appendChild(s);const i=document.createElement("div");i.className="favorites-container",t.appendChild(i);const a=Object.values(u.warningsLookup).filter(e=>e.queueType.includes(p)&&(!n||"function"!=typeof e.show||e.show(n)));for(const t of this.ws.store.favorite[e]){const n=a.find(e=>e.title===t);if(n){const t=this.createWarningItem(n,o,l,e,!0);i.appendChild(t)}}r.appendChild(t);const d=document.createElement("div");d.className="favorites-separator",r.appendChild(d)}let g=0;for(const[,t]of Object.entries(u.warnings)){let s=0;const i=[];for(const e of t.warnings)("function"!=typeof e.show||e.show(n))&&e.queueType.includes(p)&&(i.push(e),s++,g++);if(0===s)continue;const a=document.createElement("div");a.className="menu-option submenu-trigger";const d=document.createElement("span");d.className=`icon ${t.icon}`,a.appendChild(d);const c=document.createElement("span");c.textContent=t.title,a.appendChild(c);const u=document.createElement("span");u.className="submenu-arrow fas fa-chevron-right",a.appendChild(u),r.appendChild(a);const h=document.createElement("div");h.className="warning-submenu submenu",document.body.querySelector("#app").appendChild(h);for(const t of i){const n=this.createWarningItem(t,o,l,e,!1);h.appendChild(n)}a.addEventListener("click",e=>{e.stopPropagation();const t=h.classList.contains("show");document.body.querySelectorAll(".warning-submenu.show").forEach(e=>{e!==h&&(e.classList.remove("show"),document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show")))}),t?(a.classList.remove("focus-opened"),h.classList.remove("show"),document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show"))):(a.classList.add("focus-opened"),h.classList.add("show"),this.positionWarningSubmenu(h,a))})}if(0===g){const e=document.createElement("div");e.className="warning-menu-no-items",e.textContent="No warnings available for this edit.",r.appendChild(e)}addEventListener("keydown",this.warningMenuKeyListener)}warningMenuKeyListener(e){if("Tab"===e.key){const t=document.querySelector("#warn-menu.show, #revert-menu.show");if(t){if(t.querySelector(":scope > div > .menu-option.focus-opened")){const t=document.body.querySelector(".submenu.show");if(t){const n=t.querySelectorAll(":scope > .warning-menu-item");if(n.length>0){const s=(Array.from(n).indexOf(t.querySelector(".focus-visible"))+(e.shiftKey?-1:1)+n.length)%n.length;document.querySelectorAll(".focus-visible").forEach(e=>e.classList.remove("focus-visible")),n[s].classList.add("focus-visible"),e.preventDefault()}}}else{const n=t.querySelectorAll(":scope > div > .favorites-section > .favorites-container > .warning-menu-item,\n\t\t\t\t\t\t :scope > div > .menu-option");if(n.length>0){const s=(Array.from(n).indexOf(t.querySelector(".focus-visible"))+(e.shiftKey?-1:1)+n.length)%n.length;document.querySelectorAll(".focus-visible").forEach(e=>e.classList.remove("focus-visible")),n[s].classList.add("focus-visible"),e.preventDefault()}}}}else if("Enter"===e.key){if(document.querySelector("#warn-menu.show, #revert-menu.show")){const t=document.querySelector(".focus-visible");t&&(t.click(),e.preventDefault())}}else if("Escape"===e.key){if(document.querySelector("#warn-menu.show, #revert-menu.show")){const t=document.querySelector(".focus-opened");t?(t.classList.remove("focus-opened"),t.classList.add("focus-visible"),t.click()):(document.querySelectorAll(".bottom-tool-menu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".levels-menu").forEach(e=>e.classList.remove("show"))),e.preventDefault()}}}closeMenus(){document.querySelectorAll(".bottom-tool-menu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".levels-menu").forEach(e=>e.classList.remove("show"))}}function b(e){const t=new Set(["B","I","EM","STRONG","CODE","SPAN","BR"]),n=document.createElement("div");n.innerHTML=e;const s=e=>{const n=[...e.childNodes];for(const e of n)if(e.nodeType===Node.ELEMENT_NODE)if(t.has(e.tagName)){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name);s(e)}else e.replaceWith(...e.childNodes)};return s(n),n.innerHTML}t.GUI=f,m(f,"palettes",{traffic:(0,p.BuildPalette)(1e3,"#78c675","#fdff7a","#fcff54","#fbff12","#ffc619","#ff8812","#f56214","#f73214","#fc0303","#fc0303"),magma:(0,p.BuildPalette)(1e3,"#000004","#1b0c41","#4a0c6b","#781c6d","#a52c60","#cf4446","#ed6925","#fb9b06","#f7d13d","#fcffa4"),plasma:(0,p.BuildPalette)(1e3,"#0d0887","#46039f","#7201a8","#9c179e","#bd3786","#d8576b","#ed7953","#fb9f3a","#fdca26","#f0f921"),viridis:(0,p.BuildPalette)(1e3,"#440154","#3b528b","#21918c","#5ec962","#fde725"),natural:(0,p.BuildPalette)(1e3,"#ffffff","#18ff18"),cool:(0,p.BuildPalette)(1e3,"#ffffff","#1818ff"),heat:(0,p.BuildPalette)(1e3,"#ffffff","#ff1818"),grey:(0,p.BuildPalette)(1e3,"#000000","#ffffff")})},4674(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Notifications=void 0;t.Notifications=class{constructor(e){this.ws=e,this.first={},["alert","message"].forEach(e=>{this[e]=[],this.update(e),this.first[e]=!0,this.load(e)})}find(e,t){if(!1===(null!=e&&e)){let e=this.alert.find(e=>e.id===t);return e?{type:"alert",notification:e}:(e=this.message.find(e=>e.id===t),e?{type:"message",notification:e}:void 0)}return this[e].find(e=>e.id===t)}async load(e){try{const t=(await this.ws.api.continuous({action:"query",meta:"notifications",notlimit:"max",notprop:"list",notfilter:"!read",notsections:e,notformat:"model"})).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.notifications)||void 0===t?void 0:t.list)||[]});await Promise.all(t.map(async e=>this.ws.api.parse(e["*"].body).then(t=>{var n;return null!==(n=void(e["*"].parsed=t))&&void 0!==n?n:e})));let n=!1;for(const s of t)this[e].some(e=>e.id===s.id&&e.read===s.read)||(this[e].unshift(s),n=!0);if(n){const t=this.ws.store.settings.zen_mode;t.enabled&&!t[`${e}s`].enabled||this.ws.audio.playSound(["notification",e]),this.update(e)}}finally{setTimeout(()=>this.load(e),1e4)}}update(e){this.count();const t=this[e],n=t.filter(e=>!e.read),s=this.ws.store.settings.zen_mode;s.enabled&&!s[`${e}s`].enabled||n.filter(e=>!e.seen&&!e.notified).forEach(t=>{t.notified=!0,this.first[e]||electron.sendNotification({title:this.ws.util.textify(t["*"].header),body:this.ws.util.textify(t["*"].body)},t["*"].links.primary.url)}),this.first[e]=!1;const i=document.querySelector(`#${e}s-count`),a=document.querySelector(`#${e}s-list`);i.textContent=n.length,i.classList.toggle("hidden",0===n.length),0===t.length?a.innerHTML=`<div class="notifications-empty">No new ${e}s</div>`:(a.innerHTML="",t.forEach(t=>{const n=t["*"];{const s=document.createElement("div");s.classList.add("notification"),s.classList.add(t.read?"read":"unread"),s.addEventListener("click",()=>{this.read(e,t),this.ws.open(n.links.primary.url)});{const e=document.createElement("div");e.classList.add("notification-icon"),e.innerHTML=`<img src="${new URL(n.iconUrl,`https://${this.ws.server}/`).toString()}" alt="icon">`,s.appendChild(e)}{const e=document.createElement("div");e.classList.add("notification-content"),s.appendChild(e);{const t=document.createElement("div");t.classList.add("notification-header"),t.innerHTML=this.ws.util.truncate(n.header,100),e.appendChild(t)}{const t=document.createElement("div");t.classList.add("notification-body"),t.innerHTML=n.parsed,e.appendChild(t),t.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,n]=e.trim().split(/\s+/,2),s=new URL(t,`https://${this.ws.server}`).href;return n?`${s} ${n}`:s}).join(", ");e.setAttribute("srcset",t)}),t.querySelectorAll("a").forEach(e=>{e.target="_blank"})}{const t=document.createElement("div");t.classList.add("notification-links"),n.links.secondary.forEach(e=>{const n=document.createElement("a");n.href=e.url,n.target="_blank",n.textContent=e.label,t.appendChild(n)}),e.appendChild(t)}}{const n=document.createElement("div");if(n.classList.add("notification-right"),s.appendChild(n),!t.read){const s=document.createElement("div");s.classList.add("notification-unread-indicator"),s.addEventListener("click",n=>{n.stopPropagation(),this.read(e,t)}),n.appendChild(s)}{const e=document.createElement("div");e.classList.add("notification-timestamp"),e.dataset.time=t.timestamp.utciso8601,e.dataset.timeFormat="notification",e.textContent=this.ws.util.formatNotificationTime(new Date(t.timestamp.utciso8601)),n.appendChild(e)}}a.appendChild(s)}}))}seen(e){this.ws.api.postWithToken({action:"echomarkseen",type:e}),this[e].forEach(e=>e.seen=!0)}read(e,t){t?(t.read=!0,this.update(e),this.ws.api.postWithToken({action:"echomarkread",sections:e,list:t.id})):(this[e].forEach(e=>e.read=!0),this.update(e),this.ws.api.postWithToken({action:"echomarkread",sections:e,all:!0}))}count(){var e,t;const n=this.ws.store.settings.zen_mode;let s=0;n.enabled&&!n.alerts.enabled||(s+=(null===(e=this.alert)||void 0===e?void 0:e.filter(e=>!e.read).length)||0),n.enabled&&!n.messages.enabled||(s+=(null===(t=this.message)||void 0===t?void 0:t.filter(e=>!e.read).length)||0),electron.setBadgeCount(s),document.title=s>0?`(${s}) WikiShield`:"WikiShield"}}},6151(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ProgressBar=void 0;t.ProgressBar=class{constructor(){this.$bar=document.createElement("div"),this.$bar.classList.add("progress-bar"),this.$bar.style.opacity=1,document.querySelector("#progress-bar-container").appendChild(this.$bar),this.$overlay=document.createElement("div"),this.$overlay.classList.add("progress-bar-overlay"),this.$overlay.style.width="0%",this.$bar.appendChild(this.$overlay),this.$text=document.createElement("div"),this.$text.classList.add("progress-bar-text"),this.$bar.appendChild(this.$text)}set(e,t,n){this.$text.textContent=e,this.$overlay.style.width=100*Math.min(Math.max(t,0),1)+"%",this.$bar.classList.toggle("error",n),t>=1&&setTimeout(()=>{this.$bar.style.opacity=0,setTimeout(()=>this.$bar.remove(),300)},1700)}}},9117(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Settings=void 0;var s=n(8678),i=n(870),a=n(9808),r=n(985),o=n(372),l=n(7054),d=n(4018),c=(n(9501),n(955)),u=n(5564),p=n(2069),g=n(8469);function h(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function m(e,t,n){return e.set(f(e,t),n),n}function v(e,t){return e.get(f(e,t))}function f(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var b=new WeakMap,w=new WeakMap,y=new WeakMap;t.Settings=class{constructor(e){h(this,b,void 0),h(this,w,void 0),h(this,y,void 0),this.ws=e,this.ws.api.getTags().then(e=>{this.wikipediaTags=e})}get active(){return document.querySelector("#settings-container > .settings > .settings-right > div:not(.hidden)")}controller(e){const t=e.key.toLowerCase();if(v(b,this)){if("escape"===t)return v(b,this).call(this,"escape",!0);if("control"===t||"shift"===t||"alt"===t||a.controls.has(t))switch(e.preventDefault(),e.type){case"keydown":v(b,this).call(this,(0,a.buildShortcut)(e),!1);break;case"keyup":v(b,this).call(this,(0,a.buildShortcut)(e),!0)}}else"escape"===t&&"keydown"===e.type&&this.close()}collapsible(e,t,n,s=!0){const i=document.createElement("div");i.className="settings-section collapsible",e.appendChild(i);const a=document.createElement("div");a.className="settings-section-header collapse-title",a.textContent=t(s),i.appendChild(a);const r=document.createElement("div");r.className="collapse-content collapsible",i.appendChild(r);const o=document.createElement("div");o.className="settings-section-desc",o.textContent=n,r.appendChild(o),s?(r.style.height="0px",r.style.opacity=0,r.style.overflow="hidden",i.classList.add("collapsed")):(r.style.height="auto",r.style.opacity=1,r.style.overflow="visible",i.classList.remove("collapsed"));let l,d,c,u,p,g,h=!1;const m=e=>{d||(d=e);const t=e-d,n=Math.min(t/300,1),i=(a=n)<.5?2*a*a:(4-2*a)*a-1;var a;const o=c+(p-c)*i,v=u+(g-u)*i;r.style.height=`${o}px`,r.style.opacity=v,n<1?l=requestAnimationFrame(m):(s?r.style.overflow="hidden":(r.style.height="auto",r.style.overflow="visible"),h=!1,l=null,d=null)};return a.addEventListener("click",()=>{if(h){cancelAnimationFrame(l);const e=r.getBoundingClientRect().height;c=e,u=parseFloat(getComputedStyle(r).opacity)}else c=s?0:r.scrollHeight,u=s?0:1;s=!s,a.textContent=t(s),i.classList.toggle("collapsed",s),r.style.overflow="hidden",s?(p=0,g=0):(p=r.scrollHeight,g=1),h=!0,d=null,l=requestAnimationFrame(m)}),r}start(){electron.onOpenChangelog(()=>{var e;return null!==(e=void this.open())&&void 0!==e?e:this.changelog()});let e=0;document.querySelector("#settings-container").addEventListener("click",t=>{"settings-container"!==t.target.id||(e=Math.max(0,e))||this.close()}),document.querySelector("#settings-general-button").addEventListener("click",this.general.bind(this)),document.querySelector("#settings-audio-button").addEventListener("click",this.audio.bind(this)),document.querySelector("#settings-controls-button").addEventListener("click",this.controls.bind(this)),document.querySelector("#settings-zen-button").addEventListener("click",this.zen.bind(this)),document.querySelector("#settings-app-button").addEventListener("click",this.app.bind(this)),document.querySelector("#settings-queue-button").addEventListener("click",this.queue.bind(this)),document.querySelector("#settings-accessibility-button").addEventListener("click",this.accessibility.bind(this)),document.querySelector("#settings-AI-button").addEventListener("click",this.AI.bind(this)),document.querySelector("#settings-auto-reporting-button").addEventListener("click",this.autoReporting.bind(this)),document.querySelector("#settings-gadgets-button").addEventListener("click",this.gadgets.bind(this)),document.querySelector("#settings-whitelist-users-button").addEventListener("click",this.whitelist.bind(this,"user")),document.querySelector("#settings-whitelist-pages-button").addEventListener("click",this.whitelist.bind(this,"page")),document.querySelector("#settings-whitelist-tags-button").addEventListener("click",this.whitelist.bind(this,"tag")),document.querySelector("#settings-highlight-users-button").addEventListener("click",this.highlight.bind(this,"user")),document.querySelector("#settings-highlight-pages-button").addEventListener("click",this.highlight.bind(this,"page")),document.querySelector("#settings-highlight-tags-button").addEventListener("click",this.highlight.bind(this,"tag")),document.querySelector("#settings-statistics-button").addEventListener("click",this.statistics.bind(this)),document.querySelector("#settings-save-button").addEventListener("click",this.save.bind(this)),document.querySelector("#settings-changelog-button").addEventListener("click",this.changelog.bind(this)),document.querySelector("#settings-about-button").addEventListener("click",this.about.bind(this));{const t=document.querySelector("#settings-ores-bias"),n=t.querySelector(".settings-slider-track"),s=t.querySelector(".settings-slider-thumb"),i=t.querySelector(".settings-slider-label-left"),a=i.querySelector(".percent"),r=t.querySelector(".settings-slider-label-right"),o=r.querySelector(".percent"),l=e=>{this.ws.store.settings.queue.ores_bias=+e.toFixed(2),e=Math.max(0,Math.min(100,Math.round(100*e))),s.style.left=`${e}%`,n.style.setProperty("--fill",`${e}%`);const t=100-e;a.textContent=`${t}%`,i.classList.toggle("active",t>0);const l=e;o.textContent=`${l}%`,r.classList.toggle("active",l>0)},d=e=>{const t=n.getBoundingClientRect();return(e.clientX-t.left)/t.width};n.addEventListener("click",e=>l(d(e)));let c=!1;s.addEventListener("mousedown",t=>{t.preventDefault(),c=!0,e++,s.classList.add("dragging")}),window.addEventListener("mousemove",e=>{c&&l(d(e))}),window.addEventListener("mouseup",()=>{c&&(c=!1,e--,s.classList.remove("dragging"))}),l(this.ws.store.settings.queue.ores_bias)}{const e=document.querySelector("#settings-maximum-edit-count");e.value=this.ws.store.settings.queue.max_edits,e.addEventListener("change",e=>{const t=+e.target.value;this.ws.store.settings.queue.max_edits=t;for(const[e,n]of this.ws.queue.bypass.entries())n<=t&&this.ws.queue.bypass.delete(e)});const t=document.querySelector("#settings-maximum-queue-size");t.value=this.ws.store.settings.queue.max_size,t.addEventListener("change",e=>this.ws.store.settings.queue.max_size=+e.target.value);const n=document.querySelector("#settings-minimum-ores-score");n.value=this.ws.store.settings.queue.min_ores,n.addEventListener("change",e=>this.ws.store.settings.queue.min_ores=+e.target.value);const s=document.querySelector("#settings-watchlist-expiry");s.value=this.ws.store.settings.expiry.watchlist,s.addEventListener("change",e=>this.ws.store.settings.expiry.watchlist=e.target.value);const i=document.querySelector("#settings-namespaces-container");i.innerHTML="",d.namespaces.forEach(e=>{const t=document.createElement("div");t.className="namespace-item",t.dataset.namespaceId=e.id,t.innerHTML=`\n\t\t\t\t\t<label class="checkbox-box">\n\t\t\t\t\t\t<input type="checkbox" autoComplete="off">\n\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t</label>\n\t\t\t\t\t<span class="namespace-name">${e.name}</span>\n\t\t\t\t`;const n=t.querySelector("input[type=checkbox]");n.checked=this.ws.store.settings.namespaces.includes(e.id),n.addEventListener("change",t=>{if(t.target.checked)this.ws.store.settings.namespaces.includes(e.id)||this.ws.store.settings.namespaces.push(e.id);else{const t=this.ws.store.settings.namespaces.indexOf(e.id);-1!==t&&this.ws.store.settings.namespaces.splice(t,1)}}),i.appendChild(t)})}{const e=document.querySelector("#settings-ORES-alert-toggle");e.value=this.ws.store.settings.audio.ores_alert.enabled,e.addEventListener("change",t=>{this.ws.store.settings.audio.ores_alert.enabled=e.value});const t=document.querySelector("#settings-ORES-alert-threshold");t.value=this.ws.store.settings.audio.ores_alert.threshold,t.addEventListener("change",e=>{this.ws.store.settings.audio.ores_alert.threshold=+t.value});const n=document.querySelector("#settings-master-volume");n.value=this.ws.store.settings.audio.volume.master,n.addEventListener("change",e=>{this.ws.store.settings.audio.volume.master=+n.value});const s={sound:(e,t,n,s,i)=>{const a=["master",...t].join("."),r=document.createElement("volume-control");r.setAttribute("title",n),r.setAttribute("description",s),i&&r.setPreview(this.ws.audio,t),r.value=this.ws.store.settings.audio.volume[a],r.addEventListener("change",()=>{const e=this.ws.store.settings.audio.volume[a];this.ws.store.settings.audio.volume[a]=r.value,e!==r.value&&this.ws.audio.onvolumechanged()}),e.appendChild(r)},category:(e,t,n,s)=>{const i=["master",...t].join("."),a=this.collapsible(e,e=>n,s,!0),r=document.createElement("volume-control");r.setAttribute("title","Category Volume"),r.value=this.ws.store.settings.audio.volume[i],r.addEventListener("change",()=>{const e=this.ws.store.settings.audio.volume[i];this.ws.store.settings.audio.volume[i]=r.value,e!==r.value&&this.ws.audio.onvolumechanged()}),a.appendChild(r);const o=document.createElement("div");return o.className="settings-content",a.appendChild(o),o}},i=(e,t,n)=>{for(const[r,o]of Object.entries(e))switch(o.type){case"sound":var a;s.sound(n,[...t,r],o.title,o.description,null===(a=o.preview)||void 0===a||a);break;case"category":i(o.properties,[...t,r],s.category(n,[...t,r],o.title,o.description))}};i(this.ws.audio.audio,[],document.querySelector("#settings-sounds-container"))}{const e=document.querySelector("#repeat-control-scripts-toggle");e.value=this.ws.store.settings.repeat_control_scripts,e.addEventListener("change",t=>this.ws.store.settings.repeat_control_scripts=e.value),document.querySelector("#settings-new-control-script").addEventListener("click",async()=>{this.ws.store.control_scripts.unshift({keys:[],actions:[]}),this.controls()})}{const e=document.querySelector("#settings-zen-mode");e.value=this.ws.store.settings.zen_mode.enabled,e.addEventListener("change",t=>{this.ws.store.settings.zen_mode.enabled=e.value,this.ws.gui.updateZenMode()});const t=document.querySelector("#settings-zen-mode-sound");t.value=this.ws.store.settings.zen_mode.sound.enabled,t.addEventListener("change",e=>{this.ws.store.settings.zen_mode.sound.enabled=t.value,this.ws.gui.updateZenMode()});const n=document.querySelector("#settings-zen-mode-music");n.value=this.ws.store.settings.zen_mode.music.enabled,n.addEventListener("change",e=>{this.ws.store.settings.zen_mode.music.enabled=n.value,this.ws.gui.updateZenMode()});const s=document.querySelector("#settings-zen-mode-alerts");s.value=this.ws.store.settings.zen_mode.alerts.enabled,s.addEventListener("change",e=>{this.ws.store.settings.zen_mode.alerts.enabled=s.value,this.ws.gui.updateZenMode()});const i=document.querySelector("#settings-zen-mode-messages");i.value=this.ws.store.settings.zen_mode.messages.enabled,i.addEventListener("change",e=>{this.ws.store.settings.zen_mode.messages.enabled=i.value,this.ws.gui.updateZenMode()});const a=document.querySelector("#settings-zen-mode-toasts");a.value=this.ws.store.settings.zen_mode.toasts.enabled,a.addEventListener("change",e=>{this.ws.store.settings.zen_mode.toasts.enabled=a.value,this.ws.gui.updateZenMode()});const r=document.querySelector("#settings-zen-mode-badges");r.value=this.ws.store.settings.zen_mode.badges.enabled,r.addEventListener("change",e=>{this.ws.store.settings.zen_mode.badges.enabled=r.value,this.ws.gui.updateZenMode()})}if(!window.isElectron){const e=document.querySelector("#settings-launch-behavior");document.querySelectorAll("#settings-launch-behavior .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-launch-behavior [data-value=${electron.localStorage.get("WikiShield:OpenExternally")?"new_tab":"current_tab"}]`).classList.add("selected");const t=e.querySelector("[data-value=current_tab]");t.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),t.classList.add("selected"),electron.localStorage.set("WikiShield:OpenExternally",!1)});const n=e.querySelector("[data-value=new_tab]");n.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"),electron.localStorage.set("WikiShield:OpenExternally",!0)})}{const e=document.querySelector("#settings-startup-performance");document.querySelectorAll("#settings-startup-performance .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected");const t=e.querySelector("[data-value=always_off]");t.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),t.classList.add("selected"),this.ws.store.settings.performance.startup="always_off"});const n=e.querySelector("[data-value=adaptive]");n.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"),this.ws.store.settings.performance.startup="adaptive"});const s=e.querySelector("[data-value=always_on]");s.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),s.classList.add("selected"),this.ws.store.settings.performance.startup="always_on"})}{const e=document.querySelector("#settings-queues");o.Queue.types.map(e=>({type:e,data:this.ws.store.settings.queue[e]})).sort((e,t)=>e.data.order-t.data.order).forEach(t=>{var n;const s=document.createElement("draggable-order-item");s.setAttribute("key",t.type),s.setAttribute("name",null!==(n={recent:"Recent changes",pending:"Pending changes",users:"User creations",watchlist:"Watchlist",abuselog:"Abuse log"}[t.type])&&void 0!==n?n:t.type),s.enabled=t.data.enabled,e.addItem(s,t.type)}),e.addEventListener("toggle",e=>{var t;const n=null===(t=e.target.closest("draggable-order-item"))||void 0===t?void 0:t.getAttribute("key");n&&(this.ws.store.settings.queue[n].enabled=e.detail.enabled,this.ws.gui.reorderQueues())}),e.addEventListener("reorder",e=>{e.detail.keys.forEach((e,t)=>{this.ws.store.settings.queue[e].order=t,this.ws.gui.reorderQueues()})});const t=document.querySelector("#settings-palette-selector");Object.entries(g.GUI.palettes).forEach(([e,n])=>{const s=document.createElement("div");s.className="palette-option",s.classList.toggle("selected",this.ws.store.UI.theme.palette===e),s.dataset.palette=e,s.addEventListener("click",()=>{document.querySelectorAll(".palette-option.selected").forEach(e=>e.classList.remove("selected")),s.classList.add("selected"),this.ws.store.UI.theme.palette=e,this.ws.gui.updatePalette()}),t.appendChild(s);const i=document.createElement("div");i.className="palette-name",i.textContent=new p.Text(e).case(p.Text.Case.Title).get(),s.appendChild(i);const a=document.createElement("div");a.className="palette-preview",s.appendChild(a);const r=n.length,o=document.createElement("canvas");o.width=r,o.height=1;const l=o.getContext("2d"),d=l.createImageData(r,1);n.forEach((e,t)=>{const n=e.match(/\d+/g).map(e=>parseInt(e,10)),s=4*t;d.data[s]=n[0],d.data[s+1]=n[1],d.data[s+2]=n[2],d.data[s+3]=255}),l.putImageData(d,0,0),a.appendChild(o)})}{const e=document.querySelector("#settings-dyslexia-font");e.value=this.ws.store.settings.accessibility.dyslexia,e.addEventListener("change",t=>{this.ws.store.settings.accessibility.dyslexia=e.value,this.ws.gui.updateAccessibility()});const t=document.querySelector("#settings-reduce-motion");t.value=this.ws.store.settings.accessibility.reduce_motion,t.addEventListener("change",e=>{this.ws.store.settings.accessibility.reduce_motion=t.value,this.ws.gui.updateAccessibility()})}{const e=document.querySelector("#settings-AI-toggle");e.value=this.ws.store.settings.AI.enabled,e.addEventListener("change",t=>{var n;if(null===(n=this.ws.AI)||void 0===n||n.cancel.all(!0),this.ws.store.settings.AI.enabled=e.value,this.ws.store.settings.AI.enabled)if("Ollama"===this.ws.store.settings.AI.provider)this.ws.AI=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);else this.ws.AI=null;else this.ws.AI=null});const t=document.querySelector("#settings-AI-edit-analysis-toggle");t.value=this.ws.store.settings.AI.edit_analysis.enabled,t.addEventListener("change",e=>this.ws.store.settings.AI.edit_analysis.enabled=e.target.value);const n=document.querySelector("#settings-AI-username-analysis-toggle");n.value=this.ws.store.settings.AI.username_analysis.enabled,n.addEventListener("change",e=>this.ws.store.settings.AI.username_analysis.enabled=e.target.value);const i=document.querySelector("#ollama-url-input");i.value=this.ws.store.settings.AI.Ollama.server,i.addEventListener("change",e=>{this.ws.store.settings.AI.Ollama.server=i.value.trim(),"Ollama"===this.ws.store.settings.AI.provider&&this.ws.AI&&this.ws.AI.cancel.all(!0)});const a=document.querySelector("#settings-ollama-test-connection");a.addEventListener("click",async()=>{var e;if(a.disabled)return;a.disabled=!0;const t=document.querySelector("#settings-ollama-connection-status"),n=t.parentElement;let i;if(n.classList.add("testing"),n.classList.remove("connected","failed"),t.classList.add("animate-loading-dots"),t.textContent="Testing connection","Ollama"===this.ws.store.settings.AI.provider)i=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);null===(e=this.ws.AI)||void 0===e||e.cancel.all(!0),i instanceof s.AI&&await i.test()?(n.classList.add("connected"),n.classList.remove("testing","failed"),t.innerHTML="<span class='fa fa-check-circle'></span> Connected!"):(n.classList.add("failed"),n.classList.remove("testing","connected"),t.innerHTML="<span class='fa fa-times-circle'></span> Failed to connect.<br><small>Make sure you have followed the setup instructions (see below)</small>"),t.classList.remove("animate-loading-dots"),a.disabled=!1});const r=document.querySelector("#settings-ollama-refresh-models");r.addEventListener("click",async()=>{var e;if(r.disabled)return;r.disabled=!0;const t=document.querySelector("#settings-ollama-models"),n=document.querySelector("#settings-ollama-models-status"),i=n.parentElement;n.textContent="Searching",i.classList.add("searching","animate-loading-dots"),i.classList.remove("none","error"),null===(e=this.ws.AI)||void 0===e||e.cancel.all(!0);try{let e;if("Ollama"===this.ws.store.settings.AI.provider)e=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);const a=e instanceof s.AI&&await e.models()||[];a.length>0?(i.classList.remove("searching","none","error","animate-loading-dots"),n.innerHTML=`<span class="fa fa-check-circle"></span> Found ${a.length} ${new p.Text("model").get(a.length)}.`,t.innerHTML="",a.forEach(e=>{const n=e.name===this.ws.store.settings.AI.Ollama.model,s=document.createElement("div");s.className="model",s.classList.toggle("selected",n),s.dataset.model=e.name,t.appendChild(s);const i=document.createElement("div");i.className="model-top",s.appendChild(i);const a=document.createElement("span");a.className="indicator fa",a.classList.add(n?"fa-check-circle":"fa-circle"),i.appendChild(a);const r=document.createElement("span");r.className="model-name",r.textContent=e.name,i.appendChild(r);const o=document.createElement("span");o.className="psuedo-indicator fa fa-circle",i.appendChild(o);const l=document.createElement("div");l.className="model-bottom",s.appendChild(l);const d=document.createElement("span");d.className="model-size",d.textContent=this.ws.util.formatBytes(e.size),l.appendChild(d);const c=document.createElement("span");c.className="model-modified",c.textContent=new Date(e.modified_at).toLocaleDateString(),l.appendChild(c),s.addEventListener("click",()=>{var n;if(null===(n=this.ws.AI)||void 0===n||n.cancel.all(!0),"Ollama"===this.ws.store.settings.AI.provider)this.ws.store.settings.AI.Ollama.model=e.name;t.querySelectorAll(".model.selected").forEach(e=>{e.classList.remove("selected");const t=e.querySelector(".indicator");t.classList.remove("fa-circle"),t.classList.add("fa-check-circle")}),s.classList.add("selected");const i=s.querySelector(".indicator");i.classList.remove("fa-circle"),i.classList.add("fa-check-circle")})})):(i.classList.add("none"),i.classList.remove("searching","error","animate-loading-dots"),n.textContent="No models found.")}catch(e){i.classList.add("error"),i.classList.remove("searching","none","animate-loading-dots"),n.innerHTML="<span class='fa fa-times-circle'></span> Error fetching models."}r.disabled=!1})}{const e=document.querySelector("#settings-auto-reporting-toggle");e.value=this.ws.store.settings.auto_report.enabled,e.addEventListener("change",t=>{this.ws.store.settings.auto_report.enabled=e.value});const t=document.querySelector("#settings-auto-reporting-warnings-container");Object.entries(c.warningsLookup).filter(([e,t])=>t.reportable).sort((e,t)=>e[1].title.localeCompare(t[1].title)).forEach(([e,n])=>{const s=document.createElement("div");s.className="auto-reportable-warning-item",s.innerHTML=`\n\t\t\t\t\t\t<label class="checkbox-box" data-warning-key="${e}">\n\t\t\t\t\t\t\t<input type="checkbox" autoComplete="off" ${this.ws.store.settings.auto_report.for.has(e)?"checked":""}>\n\t\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<span class="checkbox-name">${n.title}</span>\n\t\t\t\t\t`,s.querySelector("input[type=checkbox]").addEventListener("change",t=>{t.target.checked?this.ws.store.settings.auto_report.for.has(e)||this.ws.store.settings.auto_report.for.add(e):this.ws.store.settings.auto_report.for.delete(e)}),t.appendChild(s)})}{const e=document.querySelector("#settings-auto-welcome-toggle");e.value=this.ws.store.settings.auto_welcome.enabled,e.addEventListener("change",t=>{this.ws.store.settings.auto_welcome.enabled=e.value});const t=document.querySelector("#settings-wikipedia-popups-toggle");t.value=this.ws.store.settings.wikipedia_popups.enabled,t.addEventListener("change",e=>{this.ws.store.settings.wikipedia_popups.enabled=t.value});const n=document.querySelector("#talk-page-thanks-for-temporary-users-toggle");n.value=this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled,n.addEventListener("change",e=>{this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled=n.value});const s=document.querySelector("#settings-username-highlighting-toggle");s.value=this.ws.store.settings.username_highlighting.enabled,s.addEventListener("change",e=>{this.ws.store.settings.username_highlighting.enabled=s.value});const i=document.querySelector("#settings-username-highlighting-fuzzy-toggle");i.value=this.ws.store.settings.username_highlighting.fuzzy,i.addEventListener("change",e=>{this.ws.store.settings.username_highlighting.fuzzy=i.value})}{const e=document.querySelector("#settings-save-status");document.querySelector("#settings-export-button").addEventListener("click",async t=>{try{const t=this.ws.export();await electron.copyToClipboard(t),e.classList.remove("hidden","error","info"),e.classList.add("success"),e.innerHTML='\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings exported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">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'}catch(t){e.classList.remove("hidden","success","info"),e.classList.add("error"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Export failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${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`}});document.querySelector("#settings-import-button").addEventListener("click",async t=>{try{const t=await this.ws.gui.dialog.input("Import Settings","Please paste the base64 string of your exported settings below:");if(!t)throw new Error("No input provided.");const n=await this.ws.noinit(t),[s,i]=n.reduce((e,t)=>(t.expected?e[0].push(t):e[1].push(t),e),[[],[]]);e.classList.remove("hidden","error","info"),e.classList.add("success"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings imported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">\n\t\t\t\t\t\t\t\t\t${i.length>0?`<br><br><strong>Encountered ${new p.Text("%n issue").get(i.length)}:</strong><br>${i.map(e=>`- ${e.message}`).join("<br>")}`:""}\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`}catch(t){e.classList.remove("hidden","success","info"),e.classList.add("error"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Import failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${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`}});document.querySelector("#settings-reset-button").addEventListener("click",async t=>{await this.ws.gui.dialog.confirm("Reset Settings","Are you sure you want to reset all settings to their default values? This action cannot be undone.","Reset Settings",!0)&&(this.ws.noinit("e30="),e.classList.remove("hidden","error","success"),e.classList.add("info"),e.innerHTML='\n\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t<i class="fa fa-info-circle status-icon"></i>\n\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t<div class="status-title">Settings reset successfully.</div>\n\t\t\t\t\t\t\t<div class="status-desc">All settings have been restored to their default values.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t')})}document.querySelectorAll("#settings-container > .settings > .settings-right > .about [data-link]").forEach(e=>{e.addEventListener("click",t=>this.ws.open(e.dataset.link,t.altKey))})}update(){document.querySelector("#settings-maximum-edit-count").value=this.ws.store.settings.queue.max_edits,document.querySelector("#settings-maximum-queue-size").value=this.ws.store.settings.queue.max_size,document.querySelector("#settings-minimum-ores-score").value=this.ws.store.settings.queue.min_ores,document.querySelector("#settings-watchlist-expiry").value=this.ws.store.settings.expiry.watchlist,document.querySelectorAll("#settings-namespaces-container .namespace-item").forEach(e=>{const t=parseInt(e.dataset.namespaceId,10);e.querySelector("input[type=checkbox]").checked=this.ws.store.settings.namespaces.includes(t)}),document.querySelector("#settings-zen-mode").value=this.ws.store.settings.zen_mode.enabled,document.querySelector("#settings-zen-mode-sound").value=this.ws.store.settings.zen_mode.sound.enabled,document.querySelector("#settings-zen-mode-music").value=this.ws.store.settings.zen_mode.music.enabled,document.querySelector("#settings-zen-mode-alerts").value=this.ws.store.settings.zen_mode.alerts.enabled,document.querySelector("#settings-zen-mode-messages").value=this.ws.store.settings.zen_mode.messages.enabled,document.querySelector("#settings-zen-mode-toasts").value=this.ws.store.settings.zen_mode.toasts.enabled,document.querySelector("#settings-zen-mode-badges").value=this.ws.store.settings.zen_mode.badges.enabled,document.querySelectorAll("#settings-startup-performance .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected");{const e=document.querySelector("#settings-queues");e.clearItems(),o.Queue.types.map(e=>({type:e,data:this.ws.store.settings.queue[e]})).sort((e,t)=>e.data.order-t.data.order).forEach(t=>{var n;const s=document.createElement("draggable-order-item");s.setAttribute("key",t.type),s.setAttribute("name",null!==(n={recent:"Recent changes",pending:"Pending changes",users:"User creations",watchlist:"Watchlist"}[t.type])&&void 0!==n?n:t.type),s.enabled=t.data.enabled,e.addItem(s,t.type)}),document.querySelectorAll(".palette-option").forEach(e=>{e.classList.toggle("selected",e.dataset.palette===this.ws.store.UI.theme.palette)})}document.querySelector("#settings-AI-toggle").value=this.ws.store.settings.AI.enabled,document.querySelector("#settings-AI-edit-analysis-toggle").value=this.ws.store.settings.AI.edit_analysis.enabled,document.querySelector("#settings-AI-username-analysis-toggle").value=this.ws.store.settings.AI.username_analysis.enabled,document.querySelector("#ollama-url-input").value=this.ws.store.settings.AI.Ollama.server;{const e=document.querySelector("#settings-ollama-connection-status"),t=e.parentElement;e.innerHTML="",t.classList.remove("testing","connected","failed")}{document.querySelector("#settings-ollama-models").querySelectorAll(".model").forEach(e=>e.remove());const e=document.querySelector("#settings-ollama-models-status"),t=e.parentElement;e.innerHTML="",t.classList.remove("searching","none","error")}document.querySelector("#settings-auto-reporting-toggle").value=this.ws.store.settings.auto_report.enabled,document.querySelectorAll("#settings-auto-reporting-warnings-container .auto-reportable-warning-item").forEach(e=>{const t=e.querySelector("label").dataset.warningKey;e.querySelector("input[type=checkbox]").checked=this.ws.store.settings.auto_report.for.has(t)}),document.querySelector("#settings-auto-welcome-toggle").value=this.ws.store.settings.auto_welcome.enabled,document.querySelector("#settings-wikipedia-popups-toggle").value=this.ws.store.settings.wikipedia_popups.enabled,document.querySelector("#settings-username-highlighting-toggle").value=this.ws.store.settings.username_highlighting.enabled,document.querySelector("#settings-username-highlighting-fuzzy-toggle").value=this.ws.store.settings.username_highlighting.fuzzy}open(){document.querySelector("#settings-container").classList.add("show"),this.general(),m(y,this,new Promise(e=>{m(w,this,e)}))}close(){this.deselect(),this.ws.audio.stopPreviews(),document.querySelector("#settings-container").classList.remove("show"),v(w,this)&&(v(w,this).call(this),m(w,this,null))}waitForClose(){return v(y,this)}deselect(){document.querySelectorAll("#settings-container > .settings > .settings-left .settings-left-menu-item.selected").forEach(e=>e.classList.remove("selected")),document.querySelectorAll("#settings-container > .settings > .settings-right > :not(.hidden)").forEach(e=>e.classList.add("hidden"))}general(){this.deselect(),document.querySelector("#settings-general-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .general").classList.remove("hidden")}performance(){this.deselect(),document.querySelector("#settings-performance-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .performance").classList.remove("hidden")}audio(){this.deselect(),document.querySelector("#settings-audio-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .audio").classList.remove("hidden")}controls(){this.deselect(),document.querySelector("#settings-controls-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .controls").classList.remove("hidden");{const e=(t,n)=>{if(n.actions.includes(t))return n;for(const s of n.actions)if("if"===s.name||"if not"===s.name){const n=e(t,s);if(n)return n}return null},t=(n,s,a,o)=>{const l=document.createElement("div");if(l.className="control-action",n.appendChild(l),"if"===s.name||"if not"===s.name){var d,c,p;l.innerHTML=`\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t\t\t${"if"===s.name?"If":"If not"} <select></select> <span class="params"></span> then:\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;const e=l.querySelector("select");Object.entries(i.conditions).forEach(([t,n])=>{e.innerHTML+="title"in n?`<option value="${t}">${n.title}</option>`:`<option value="${t}">${t}</option>`});const n=null!==(d=s.condition)&&void 0!==d?d:{name:Object.keys(i.conditions)[0],params:{}};null!==(c=n.name)&&void 0!==c||(n.name=Object.keys(i.conditions)[0]),null!==(p=n.params)&&void 0!==p||(n.params={}),e.value=n.name,e.addEventListener("change",t=>{n.name=e.value,o()});const r=new Map;for(const e of(0,u.sortDependencies)((null===(g=(h=i.conditions[n.name]).parameters)||void 0===g?void 0:g.call(h))||[])){var g,h;const t=document.createElement("div");t.className="condition-parameter",l.querySelector(".params").appendChild(t);const s={};for(const t of null!==(m=e.dependencies)&&void 0!==m?m:[]){var m;s[t]=n.params[t]}const i="function"==typeof e.default?e.default(s):e.default;let a=null;switch(e.type){case"choice":{const o=document.createElement("select");o.dataset.paramid=e.id,t.appendChild(o);const l="function"==typeof e.options?e.options(s):e.options;for(const e of null!=l?l:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(void 0!==n.params[e.id]){o.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(o.value=i,n.params[e.id]=i);a=()=>{const t={};for(const i of null!==(s=e.dependencies)&&void 0!==s?s:[]){var s;t[i]=n.params[i]}const i=o.value,a="function"==typeof e.options?e.options(t):e.options;o.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(a.includes(i))o.value=i;else{const s="function"==typeof e.default?e.default(t):e.default;o.value=s,n.params[e.id]=s}},o.addEventListener("change",()=>{n.params[e.id]=o.value;for(const t of r.get(e.id)||[])t()})}break;case"text":{const s=document.createElement("input");if(s.type="text",s.dataset.paramid=e.id,t.appendChild(s),void 0!==n.params[e.id]){s.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.value=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=s.value;for(const t of r.get(e.id)||[])t()})}break;case"boolean":{const s=document.createElement("input");if(s.type="checkbox",s.dataset.paramid=e.id,t.appendChild(s),void 0!==n.params[e.id]){s.checked=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.checked=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=s.checked;for(const t of r.get(e.id)||[])t()})}break;case"number":{const s=document.createElement("input");if(s.type="number",s.dataset.paramid=e.id,"min"in e&&(s.min=e.min),"max"in e&&(s.max=e.max),t.appendChild(s),void 0!==n.params[e.id]){s.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.value=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=parseFloat(s.value);for(const t of r.get(e.id)||[])t()})}}if("function"==typeof a)for(const t of null!==(v=e.dependencies)&&void 0!==v?v:[]){var v;r.has(t)||r.set(t,[]),r.get(t).push(a)}}for(const e of s.actions)t(l,e,a,o)}else{const e=r.events[s.name];l.innerHTML=`\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="${"icon"in e?e.icon:"fas fa-bolt"}"></span>\n\t\t\t\t\t\t\t\t${"title"in e?e.title:s.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;const t=new Map;for(const n of(0,u.sortDependencies)((null===(f=e.parameters)||void 0===f?void 0:f.call(e))||[])){var f;const e=document.createElement("div");e.className="action-parameter",e.innerHTML=`<div class="parameter-title">${n.title}</div>`,l.appendChild(e);const i={};for(const e of null!==(b=n.dependencies)&&void 0!==b?b:[]){var b;i[e]=s.params[e]}const a="function"==typeof n.default?n.default(i):n.default;let r=null;switch(n.type){case"choice":{const o=document.createElement("select");o.dataset.paramid=n.id,e.appendChild(o);const l="function"==typeof n.options?n.options(i):n.options;for(const e of null!=l?l:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(void 0!==s.params[n.id]){o.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(o.value=a,s.params[n.id]=a);r=()=>{const e={};for(const i of null!==(t=n.dependencies)&&void 0!==t?t:[]){var t;e[i]=s.params[i]}const i=o.value,a="function"==typeof n.options?n.options(e):n.options;o.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(a.includes(i))o.value=i;else{const t="function"==typeof n.default?n.default(e):n.default;o.value=t,s.params[n.id]=t}},o.addEventListener("change",()=>{s.params[n.id]=o.value;for(const e of t.get(n.id)||[])e()})}break;case"text":{const i=document.createElement("input");if(i.type="text",i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.value=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.value;for(const e of t.get(n.id)||[])e()})}break;case"boolean":{const i=document.createElement("input");if(i.type="checkbox",i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.checked=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.checked=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.checked;for(const e of t.get(n.id)||[])e()})}break;case"duration":{const i=document.createElement("duration-input");if(i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.value=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.value;for(const e of t.get(n.id)||[])e()})}}if("function"==typeof r)for(const e of null!==(w=n.dependencies)&&void 0!==w?w:[]){var w;t.has(e)||t.set(e,[]),t.get(e).push(r)}}}l.querySelector(".move-action-up").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]);const t=e(s,a),n=t.actions.indexOf(s);if(0===t.actions.indexOf(s)){if("if"!==t.name&&"if not"!==t.name)return;const i=e(t,a);i.actions.splice(i.actions.indexOf(t),0,s),t.actions.splice(n,1)}else{const e=t.actions[n-1];"if"===e.name||"if not"===e.name?(e.actions.push(s),t.actions.splice(n,1)):(t.actions.splice(n,1),t.actions.splice(n-1,0,s))}o()}),l.querySelector(".move-action-down").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]);const t=e(s,a),n=t.actions.indexOf(s);if(t.actions.indexOf(s)===t.actions.length-1){if("if"!==t.name&&"if not"!==t.name)return;const i=e(t,a);i.actions.splice(i.actions.indexOf(t)+1,0,s),t.actions.splice(n,1)}else{const e=t.actions[n+1];"if"===e.name||"if not"===e.name?(e.actions.unshift(s),t.actions.splice(n,1)):(t.actions.splice(n,1),t.actions.splice(n+1,0,s))}o()}),l.querySelector(".delete-action").addEventListener("click",async t=>{if(this.ws.audio.playSound(["ui","click"]),t.shiftKey||await this.ws.gui.dialog.confirm("Delete Action","Are you sure you want to delete this action?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>",null,!0)){const t=e(s,a);t.actions.splice(t.actions.indexOf(s),1),o()}})},n=()=>{const e=new Set,t=new Set;this.ws.store.control_scripts.forEach(n=>{n.keys.forEach(n=>{e.has(n)?t.add(n):e.add(n)})}),document.querySelectorAll(".control-keys div[data-key]").forEach(e=>{e.classList.toggle("duplicate",t.has(e.dataset.key))})},s=(e,o)=>{e.innerHTML='\n\t\t\t\t\t<div class="control-container">\n\t\t\t\t\t\t<div class="control-container-title">When these keys are pressed</div>\n\t\t\t\t\t\t<div class="control-keys"></div>\n\t\t\t\t\t\t<div class="control-container-title margin-top">Complete these actions</div>\n\t\t\t\t\t\t<div class="control-actions"></div>\n\t\t\t\t\t</div>\n\t\t\t\t';const l=e.querySelector(".control-keys");for(const t of o.keys){const i=document.createElement("div");i.dataset.key=t,i.innerHTML=`\n\t\t\t\t\t\t<span class="key-elem-title">${" "===t?"space":t}</span>\n\t\t\t\t\t\t<span class="fas fa-trash-can remove"></span>\n\t\t\t\t\t`,l.appendChild(i),i.querySelector(".remove").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),o.keys.splice(o.keys.indexOf(t),1),s(e,o),n()})}const d=document.createElement("div");d.className="add",d.innerHTML='<span class="fas fa-plus"></span>',l.appendChild(d),d.addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),document.querySelectorAll(".key-select").forEach(e=>e.remove());const t=document.createElement("div");t.className="key-select animate-loading-dots",t.textContent="Press a key",l.insertBefore(t,d);const i=()=>{t.remove(),m(b,this,null)};t.addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),i()}),m(b,this,(r,l,d)=>{if("escape"===r)i();else if(l){if(!(0,a.validateShortcut)(r))return i(),void this.ws.gui.dialog.toast("Invalid Key","The key you pressed is not a valid shortcut key.","error");o.keys.includes(r)||o.keys.push(r),i(),s(e,o),n()}else t.textContent=r||"Press a key"})});const c=e.querySelector(".control-actions");for(const e of o.actions)t(c,e,o,()=>{this.controls()});const u=document.createElement("div");u.className="control-bottom-container",u.innerHTML='\n\t\t\t\t\t<div class="add-action-button"></div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<button class="add-action-button control-delete" style="--background: 211, 51, 51;">Delete</button>\n\t\t\t\t\t</div>\n\t\t\t\t',c.appendChild(u),u.querySelector(".control-delete").addEventListener("click",async e=>{this.ws.audio.playSound(["ui","click"]),(e.shiftKey||await this.ws.gui.dialog.confirm("Delete Control Script","Are you sure you want to delete this control script? This action cannot be undone?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>",null,!0))&&(this.ws.store.control_scripts.splice(this.ws.store.control_scripts.indexOf(o),1),this.controls())});const p=()=>{const t=u.querySelector(".add-action-button");t.innerHTML='<button class="add-action-button new-button"><span class="fa fa-plus"></span> Add Action</button>',t.querySelector(".new-button").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),t.innerHTML='\n\t\t\t\t\t\t\t<select style="height: 35px;"></select>\n\t\t\t\t\t\t\t<button class="add-action-button cancel-button" style="margin-left: 10px;">Cancel</button>\n\t\t\t\t\t\t\t<button class="add-action-button create-button" style="margin-left: 10px;">Create</button>\n\t\t\t\t\t\t';const n=t.querySelector("select");n.innerHTML+='<option value="if">If Condition</option>',n.innerHTML+='<option value="if not">If Not Condition</option>',Object.entries(r.events).forEach(([e,t])=>{n.innerHTML+="title"in t?`<option value="${e}">${t.title}</option>`:`<option value="${e}">${e}</option>`}),t.querySelector(".cancel-button").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),p()}),t.querySelector(".create-button").addEventListener("click",()=>{if(this.ws.audio.playSound(["ui","click"]),"if"===n.value||"if not"===n.value||n.value in r.events){const t={name:n.value,params:{}};"if"!==n.value&&"if not"!==n.value||(t.condition={name:Object.keys(i.conditions)[0]},t.actions=[]),o.actions.push(t),s(e,o)}})})};p()},o=document.querySelector("#settings-container > .settings > .settings-right > .controls");o.querySelectorAll(".control-script-item").forEach(e=>e.remove());for(const e of this.ws.store.control_scripts){const t=document.createElement("div");t.className="settings-section control-script-item",o.appendChild(t),s(t,e)}n()}}zen(){this.deselect(),document.querySelector("#settings-zen-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .zen").classList.remove("hidden")}app(){this.deselect(),document.querySelector("#settings-app-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .app").classList.remove("hidden")}queue(){this.deselect(),document.querySelector("#settings-queue-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .queue").classList.remove("hidden")}accessibility(){this.deselect(),document.querySelector("#settings-accessibility-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .accessibility").classList.remove("hidden")}AI(){this.deselect(),document.querySelector("#settings-AI-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .AI").classList.remove("hidden")}autoReporting(){this.deselect(),document.querySelector("#settings-auto-reporting-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .auto-reporting").classList.remove("hidden")}gadgets(){this.deselect(),document.querySelector("#settings-gadgets-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .gadgets").classList.remove("hidden")}whitelist(e){this.deselect(),document.querySelector(`#settings-whitelist-${e}s-button`).classList.add("selected"),document.querySelector(`#settings-container > .settings > .settings-right > .whitelist.${e}s`).classList.remove("hidden");{const t=document.querySelector(`#settings-whitelist-${e}s-expiry`);t.value=this.ws.store.settings.expiry.whitelist[`${e}s`],t.addEventListener("change",t=>this.ws.store.settings.expiry.whitelist[`${e}s`]=t.target.value);const n=document.querySelector(`#settings-whitelist-${e}s-input`),s=()=>{const t=n.value.trim();t&&(n.value="",this.ws.store.whitelist[`${e}s`].set(t,[Date.now(),this.ws.util.expiryToDate(this.ws.store.settings.expiry.whitelist[`${e}s`]).valueOf()]),this.ws.store.statistics.items_whitelisted.total++,this.ws.store.statistics.items_whitelisted[`${e}s`]++,this.ws.gui.renderQueue(),this.whitelist(e))};if("tag"===e&&this.wikipediaTags){const e=this.wikipediaTags.map(e=>e.name).sort();for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.appendChild(e)}n.setAttribute("list",n.id+"-datalist");const t=document.createElement("datalist");t.id=n.id+"-datalist",n.parentElement.appendChild(t);for(const n of e){const e=document.createElement("option");e.value=n,t.appendChild(e)}}document.querySelector(`#settings-whitelist-${e}s-add-button`).addEventListener("click",s),n.addEventListener("keydown",e=>{"Enter"===e.key&&(s(),e.preventDefault())})}{const t=document.querySelector(`#settings-whitelist-${e}s-list`);t.innerHTML="";const n=t=>{switch(e){case"user":return this.ws.page(`Special:Contributions/${t}`);case"page":return this.ws.page(t);case"tag":return this.ws.page(`Special:Tags/${t}`)}},s=[...this.ws.store.whitelist[`${e}s`]].sort((e,t)=>t[1][1]-e[1][1]);for(const[i,a]of s){const s=document.createElement("div"),r=new Date(a[0]),o=a[1]===1/0?"Never":`${new Date(a[1]).toLocaleDateString()} ${new Date(a[1]).toLocaleTimeString()}`;s.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${n(i)}">${i}</a>\n\t\t\t\t\t\t<span>Added: ${r.toLocaleDateString()} ${r.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now()>a[1]?"expired":""}">\n\t\t\t\t\t\t\t${Date.now()>a[1]?"Expired":"Expires"}: ${o}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from whitelisted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`,s.querySelector(".remove-button").addEventListener("click",()=>{this.ws.store.whitelist[`${e}s`].delete(i),this.ws.gui.renderQueue(),this.whitelist(e)}),t.appendChild(s)}0===s.length&&(t.innerHTML=`<div class="empty">No whitelisted ${e}s.</div>`)}}highlight(e){this.deselect(),document.querySelector(`#settings-highlight-${e}s-button`).classList.add("selected"),document.querySelector(`#settings-container > .settings > .settings-right > .highlight.${e}s`).classList.remove("hidden");{const t=document.querySelector(`#settings-highlight-${e}s-expiry`);t.value=this.ws.store.settings.expiry.highlight[`${e}s`],t.addEventListener("change",t=>this.ws.store.settings.expiry.highlight[`${e}s`]=t.target.value);const n=document.querySelector(`#settings-highlight-${e}s-input`),s=()=>{const t=n.value.trim();t&&(n.value="",this.ws.store.highlight[`${e}s`].set(t,[Date.now(),this.ws.util.expiryToDate(this.ws.store.settings.expiry.highlight[`${e}s`]).valueOf()]),this.ws.store.statistics.items_highlighted.total++,this.ws.store.statistics.items_highlighted[`${e}s`]++,this.ws.gui.renderQueue(),this.highlight(e))};if("tag"===e&&this.wikipediaTags){const e=this.wikipediaTags.map(e=>e.name).sort();for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.appendChild(e)}n.setAttribute("list",n.id+"-datalist");const t=document.createElement("datalist");t.id=n.id+"-datalist",n.parentElement.appendChild(t);for(const n of e){const e=document.createElement("option");e.value=n,t.appendChild(e)}}document.querySelector(`#settings-highlight-${e}s-add-button`).addEventListener("click",s),n.addEventListener("keydown",e=>{"Enter"===e.key&&(s(),e.preventDefault())})}{const t=document.querySelector(`#settings-highlight-${e}s-list`);t.innerHTML="";const n=t=>{switch(e){case"user":return this.ws.page(`Special:Contributions/${t}`);case"page":return this.ws.page(t);case"tag":return this.ws.page(`Special:Tags/${t}`)}},s=[...this.ws.store.highlight[`${e}s`]].sort((e,t)=>t[1][1]-e[1][1]);for(const[i,a]of s){const s=document.createElement("div"),r=new Date(a[0]),o=a[1]===1/0?"Never":`${new Date(a[1]).toLocaleDateString()} ${new Date(a[1]).toLocaleTimeString()}`;s.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${n(i)}">${i}</a>\n\t\t\t\t\t\t<span>Added: ${r.toLocaleDateString()} ${r.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now()>a[1]?"expired":""}">\n\t\t\t\t\t\t\t${Date.now()>a[1]?"Expired":"Expires"}: ${o}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from highlighted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`,s.querySelector(".remove-button").addEventListener("click",()=>{this.ws.store.highlight[`${e}s`].delete(i),this.ws.gui.renderQueue(),this.highlight(e)}),t.appendChild(s)}0===s.length&&(t.innerHTML=`<div class="empty">No highlighted ${e}s.</div>`)}}statistics(){this.deselect(),document.querySelector("#settings-statistics-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .statistics").classList.remove("hidden");document.querySelector("#reset-statistics-button").addEventListener("click",async()=>{await this.ws.gui.dialog.confirm("Reset statistics","Are you sure you want to reset all statistics? This action cannot be undone.",void 0,!0)&&(this.ws.store.statistics={},this.ws.storage.load(this.ws.store),this.ws.time.load=performance.now(),this.statistics())});const e=this.ws.store.statistics;document.querySelector("#stats-total-reviewed").textContent=(e.edits_reviewed.total||0).toLocaleString();document.querySelector("#stats-thanks-percentage").textContent=(e.edits_reviewed.thanked/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-recent-changes-reviewed").textContent=(e.recent_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-recent-changes-percentage").textContent=(e.recent_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-reviewed").textContent=(e.pending_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-pending-changes-accepted").textContent=(e.pending_changes_reviewed.accepted||0).toLocaleString();document.querySelector("#stats-pending-changes-accepted-percentage").textContent=(e.pending_changes_reviewed.accepted/e.pending_changes_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-rejected").textContent=(e.pending_changes_reviewed.rejected||0).toLocaleString();document.querySelector("#stats-pending-changes-rejected-percentage").textContent=(e.pending_changes_reviewed.rejected/e.pending_changes_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-percentage").textContent=(e.pending_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-user-creations-reviewed").textContent=(e.users_reviewed.total||0).toLocaleString();document.querySelector("#stats-user-creations-percentage").textContent=(e.users_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-watchlist-changes-reviewed").textContent=(e.watchlist_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-watchlist-changes-percentage").textContent=(e.watchlist_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-abuselog-changes-reviewed").textContent=(e.abuselogs_reviewed.total||0).toLocaleString();document.querySelector("#stats-abuselog-changes-percentage").textContent=(e.abuselogs_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-reverts-made").textContent=(e.reverts_made.total||0).toLocaleString();document.querySelector("#stats-reverts-percentage").textContent=(e.reverts_made.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-goodfaith-reverts-percentage").textContent=(e.reverts_made.good_faith/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-recent-reverts-percentage").textContent=(e.reverts_made.from_recent_changes/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-pending-reverts-percentage").textContent=(e.reverts_made.from_pending_changes/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-watchlist-reverts-percentage").textContent=(e.reverts_made.from_watchlist/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-abuselog-reverts-percentage").textContent=(e.reverts_made.from_abuselogs/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-other-reverts-percentage").textContent=(e.reverts_made.from_loaded_edits/e.reverts_made.total*100||0).toFixed(2);{document.querySelector("#stats-users-welcomed").textContent=(e.users_welcomed.total||0).toLocaleString();const t=document.querySelector("#stats-users-welcomed-message");e.edits_reviewed.total===e.users_welcomed.total?t.textContent=`You welcome every user whose edit you review! (${e.users_welcomed.total.toLocaleString()})`:0===e.users_welcomed.total?t.innerHTML="For every Infinity edits you review, you still won&rsquo;t welcome a new user.":t.textContent=`For every ${(e.edits_reviewed.total/e.users_welcomed.total||0).toFixed(3)} edits you review, you welcome a new user.`}document.querySelector("#stats-warnings").textContent=(e.warnings_issued.total||0).toLocaleString();document.querySelector("#stats-warning-1-percentage").textContent=(e.warnings_issued.level_1/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-2-percentage").textContent=(e.warnings_issued.level_2/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-3-percentage").textContent=(e.warnings_issued.level_3/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-4-percentage").textContent=(e.warnings_issued.level_4/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-4im-percentage").textContent=(e.warnings_issued.level_4im/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-reports").textContent=(e.reports_filed.total||0).toLocaleString();document.querySelector("#stats-AIV-reports-percentage").textContent=(e.reports_filed.AIV/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-UAA-reports-percentage").textContent=(e.reports_filed.UAA/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-global-block-reports-percentage").textContent=(e.reports_filed.global_block/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-global-lock-reports-percentage").textContent=(e.reports_filed.global_lock/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-RFPP-reports-percentage").textContent=(e.reports_filed.RFPP/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-pages-watched").textContent=(e.watchlist.watched||0).toLocaleString();document.querySelector("#stats-pages-unwatched").textContent=(e.watchlist.unwatched||0).toLocaleString();document.querySelector("#stats-items-whitelisted").textContent=(e.items_whitelisted.total||0).toLocaleString();document.querySelector("#stats-users-whitelisted").textContent=(e.items_whitelisted.users||0).toLocaleString();document.querySelector("#stats-users-whitelisted-percentage").textContent=(e.items_whitelisted.users/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-pages-whitelisted").textContent=(e.items_whitelisted.pages||0).toLocaleString();document.querySelector("#stats-pages-whitelisted-percentage").textContent=(e.items_whitelisted.pages/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-tags-whitelisted").textContent=(e.items_whitelisted.tags||0).toLocaleString();document.querySelector("#stats-tags-whitelisted-percentage").textContent=(e.items_whitelisted.tags/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-items-highlighted").textContent=(e.items_highlighted.total||0).toLocaleString();document.querySelector("#stats-users-highlighted").textContent=(e.items_highlighted.users||0).toLocaleString();document.querySelector("#stats-users-highlighted-percentage").textContent=(e.items_highlighted.users/e.items_highlighted.total*100||0).toFixed(2);document.querySelector("#stats-pages-highlighted").textContent=(e.items_highlighted.pages||0).toLocaleString();document.querySelector("#stats-pages-highlighted-percentage").textContent=(e.items_highlighted.pages/e.items_highlighted.total*100||0).toFixed(2);document.querySelector("#stats-tags-highlighted").textContent=(e.items_highlighted.tags||0).toLocaleString();document.querySelector("#stats-tags-highlighted-percentage").textContent=(e.items_highlighted.tags/e.items_highlighted.total*100||0).toFixed(2);{const t=e.session_time+(performance.now()-this.ws.time.load);document.querySelector("#stats-session-time").textContent=(e=>{const t=Math.floor(e/1e3),n=Math.floor(t/86400),s=Math.floor(t%86400/3600),i=Math.floor(t%3600/60);let a="";return n>0&&(a+=`${n}d `),s>0&&(a+=`${s}h `),i>0&&(a+=`${i}m `),a+=t%60+"s",a.trim()})(t);document.querySelector("#stats-reports-per-day").textContent=(e.reports_filed.total/(t/864e5||1)||0).toFixed(2);document.querySelector("#stats-reverts-per-hour").textContent=(e.reverts_made.total/(t/36e5||1)||0).toFixed(2);document.querySelector("#stats-reviews-per-minute").textContent=(e.edits_reviewed.total/(t/6e4||1)||0).toFixed(2)}}save(){this.deselect(),document.querySelector("#settings-save-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .save").classList.remove("hidden"),document.querySelector("#settings-save-status").classList.add("hidden")}changelog(){this.deselect(),document.querySelector("#settings-changelog-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .changelog").classList.remove("hidden");const e=document.querySelector("#settings-container > .settings > .settings-right > .changelog > div > .changelog-content");e.innerHTML="<em class='animate-loading-dots'>Loading changelog</em>",l.WikiShield.config.changelog.HTML.then(t=>e.innerHTML=t)}about(){this.deselect(),document.querySelector("#settings-about-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .about").classList.remove("hidden"),document.querySelector("#settings-about-version").textContent=l.WikiShield.config.version,document.querySelectorAll("#settings-container > .settings > .settings-right > .about > .randomize").forEach(e=>{for(let t=e.children.length;t>=0;t--)e.appendChild(e.children[Math.random()*t|0])})}}},7698(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.BuildPalette=function(e,...t){const n=document.createElement("canvas");n.width=e,n.height=1;const s=n.getContext("2d"),i=s.createLinearGradient(0,0,n.width,0),a=1/(t.length-1);t.forEach((e,t)=>{i.addColorStop(a*t,e)}),s.fillStyle=i,s.fillRect(0,0,n.width,n.height);const r=s.getImageData(0,0,n.width,1).data;return Array.from({length:e},(e,t)=>{const n=4*t;return`rgb(${r[n]}, ${r[n+1]}, ${r[n+2]})`})}},3241(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.expiryRegex=t.Utility=void 0;var s=n(4551);function i(){i=function(e,t){return new n(e,void 0,t)};var e=RegExp.prototype,t=new WeakMap;function n(e,s,i){var r=RegExp(e,s);return t.set(r,i||t.get(e)),a(r,n.prototype)}function s(e,n){var s=t.get(n);return Object.keys(s).reduce(function(t,n){var i=s[n];if("number"==typeof i)t[n]=e[i];else{for(var a=0;void 0===e[i[a]]&&a+1<i.length;)a++;t[n]=e[i[a]]}return t},Object.create(null))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&a(e,t)}(n,RegExp),n.prototype.exec=function(t){var n=e.exec.call(this,t);if(n){n.groups=s(n,this);var i=n.indices;i&&(i.groups=s(i,this))}return n},n.prototype[Symbol.replace]=function(n,i){if("string"==typeof i){var a=t.get(this);return e[Symbol.replace].call(this,n,i.replace(/\$<([^>]+)(>|$)/g,function(e,t,n){if(""===n)return e;var s=a[t];return Array.isArray(s)?"$"+s.join("$"):"number"==typeof s?"$"+s:""}))}if("function"==typeof i){var r=this;return e[Symbol.replace].call(this,n,function(){var e=arguments;return"object"!=typeof e[e.length-1]&&(e=[].slice.call(e)).push(s(e,r)),i.apply(this,e)})}return e[Symbol.replace].call(this,n,i)},i.apply(this,arguments)}function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}const r=t.expiryRegex=i(/(infinity|^(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)W)?(([0-9]+)D)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?)$/,{years:3,months:5,weeks:7,days:9,hours:11,minutes:13,seconds:15});t.Utility=class{constructor(e){this.ws=e}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}escape(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}utcString(e){if(e===1/0)return"indefinite";const t=this.padString;return`${e.getUTCFullYear()}-${t(e.getUTCMonth()+1,2)}-${t(e.getUTCDate(),2)}T${t(e.getUTCHours(),2)}:${t(e.getUTCMinutes(),2)}:${t(e.getUTCSeconds(),2)}`}padString(e,t){for(e=e.toString();e.length<t;)e=`0${e}`;return e}getMonth(e){return["January","February","March","April","May","June","July","August","September","October","November","December"][e]}monthSectionName(){return`${this.getMonth((new Date).getUTCMonth())} ${(new Date).getUTCFullYear()}`}escape(e){return(e||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}textify(e){const t=document.createElement("div");return t.innerHTML=e,t.textContent||t.innerText||""}pageLink(e,t=!1,n=!0){return t?`https://${this.ws.server}/w/index.php${e}`:`https://${this.ws.server}/wiki/${n?encodeURIComponent(e):e}`}truncate(e,t){return(0,s.truncate)(e,t)}formatBytes(e){if(0===e)return"0 B";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB","RiB","QiB"][t]}getChangeColor(e){if(0===e)return"#888";if(e>0)return e>=1e3?"#00b894":e>=500?"#00d4a1":e>=100?"#26de81":"#55efc4";{const t=Math.abs(e);return t>=1e3?"#d63031":t>=500?"#e74c3c":t>=100?"#ff6b6b":"#ff8787"}}getChangeString(e){return e>0?"+"+e:0===e?"0":`&ndash;${Math.abs(e).toString()}`}formatNotificationTime(e,t=new Date){const n=Math.floor((t-e)/1e3);return n<=0?"Now":n<60?`${n}s ago`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:n<2592e3?`${Math.floor(n/86400)}d ago`:n<31536e3?`${Math.floor(n/2592e3)}mo ago`:`${Math.floor(n/31536e3)}y ago`}formatDuration(e,t=new Date){const n=Math.floor((t-e)/1e3);return n<=0?"0s":n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m`:n<86400?`${Math.floor(n/3600)}h`:n<2592e3?`${Math.floor(n/86400)}d`:n<31536e3?`${Math.floor(n/2592e3)}mo`:`${Math.floor(n/31536e3)}y`}match(e,t){return this.ws.store.settings.username_highlighting.fuzzy?function(e,t,n){const s=e.length,i=t.length;if(0===s)return!0;if(0===i)return s<=n;let a=new Array(i+1).fill(0),r=new Array(i+1).fill(0);for(let e=0;e<=i;e++)a[e]=0;for(let o=1;o<=s;o++){r[0]=o;let l=r[0];for(let d=1;d<=i;d++){const i=e[o-1]===t[d-1]?0:1,c=a[d]+1,u=r[d-1]+1,p=a[d-1]+i,g=Math.min(c,u,p);if(r[d]=g,g<l&&(l=g),o===s&&g<=n)return!0}if(l>n)return!1;[a,r]=[r,a]}return!1}(e,t,2):t.toLowerCase().includes(e.toLowerCase())}isIPv4Address(e){const t="(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|0?[0-9]{1,2})";return new RegExp(`^(${t}\\.){3}${t}$`).test(e)}isIPv6Address(e){return!!new RegExp("^(?::(?::|(?::[0-9A-Fa-f]{1,4}){1,7})|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,6}::|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){7})$").test(e)||new RegExp("^[0-9A-Fa-f]{1,4}(?:::?[0-9A-Fa-f]{1,4}){1,6}$").test(e)&&/::/.test(e)&&!/::.*::/.test(e)}isIPAddress(e){return this.isIPv4Address(e)||this.isIPv6Address(e)}isTempAccount(e){return/^~[0-9]{4,}(-[0-9A-Fa-f]{5})*(-[0-9A-Fa-f]{1,5})$/.test(e)}expiryToDate(e){if("infinity"===e)return 1/0;const t=new Date,n=r.exec(e);return n?new Date(t.getFullYear()+(parseInt(n.groups.years)||0),t.getMonth()+(parseInt(n.groups.months)||0),t.getDate()+7*(parseInt(n.groups.weeks)||0)+(parseInt(n.groups.days)||0),t.getHours()+(parseInt(n.groups.hours)||0),t.getMinutes()+(parseInt(n.groups.minutes)||0),t.getSeconds()+(parseInt(n.groups.seconds)||0)):t}getPageSections(e){const t=e.split("\n"),n=[];let s={title:"",heading:"",level:0,content:""};for(const e of t){const t=/^(=+)\s*(.*?)\s*\1\s*$/.exec(e);t?(""!==s.title&&n.push(s),s={title:t[2],heading:t[0],level:t[1].length,content:""}):(""!==s.content&&(s.content+="\n"),s.content+=e)}return""===s.content&&""===s.title||n.push(s),n}}},5564(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.sortDependencies=function(e){const t=new Map(e.map(e=>[e.id,e])),n=new Set,s=new Set,i=[],a=(e,r)=>{if(n.has(e))return;if(s.has(e)){const t=r.indexOf(e),n=r.slice(t).concat(e).join(" -> ");throw new Error(`Cyclic dependency detected: ${n}`)}const o=t.get(e);if(!o)throw new Error(`Unknown dependency: ${e}`);s.add(e),r.push(e);const l=o.dependencies||[];for(const e of l)a(e,r);r.pop(),n.add(e),s.delete(e),i.push(o)};for(const t of e)n.has(t.id)||a(t.id,[]);return i}},2069(e,t){var n;function s(e,t,n){i(e,t),t.set(e,n)}function i(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function a(e,t){return e.get(o(e,t))}function r(e,t,n){return e.set(o(e,t),n),n}function o(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function l(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.Text=void 0;class d{}l(d,"Lower",Symbol("lower case")),l(d,"Upper",Symbol("UPPER CASE")),l(d,"Title",Symbol("Title Case")),l(d,"Sentence",Symbol("Sentence case")),l(d,"Camel",Symbol("camelCase")),l(d,"Pascal",Symbol("PascalCase")),l(d,"Snake",Symbol("snake_Case")),l(d,"Split",Symbol("split,case"));var c=new WeakMap,u=new WeakMap,p=new WeakMap,g=new WeakSet;class h{static pluralize(e,t,n){return new h(e).plural(n).get(t)}constructor(e,t=d.Sentence){var n,a;i(n=this,a=g),a.add(n),s(this,c,!1),s(this,u,void 0),s(this,p,void 0);const l=m.call(h,e,t);r(c,this,l.inSentenceCase),r(u,this,l.words),r(p,this,o(g,this,v).call(this))}plural(){return r(p,this,o(g,this,v).apply(this,arguments)),this}case(e=d.Sentence){const t=t=>{switch(e){case d.Lower:return t.map(e=>e.toLowerCase()).join(" ");case d.Upper:return t.map(e=>e.toUpperCase()).join(" ");case d.Title:return t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");case d.Sentence:if(a(c,this))return t.join(" ");let e=!0;return t.map(t=>{let n=e?t.charAt(0).toUpperCase()+t.slice(1).toLowerCase():t.toLowerCase();return e=/[.!?]$/.test(t),n}).join(" ");case d.Camel:return t.map((e,t)=>0===t?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("");case d.Pascal:return t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("");case d.Snake:return t.map(e=>e.toLowerCase()).join("_");case d.Split:return t;default:throw new TypeError("Invalid case type, must be a Case value")}},[n,s]=[t(a(u,this)),t(a(p,this))];return Object.freeze({get:(e=1)=>(Number.isNaN(Number(e))||1===e||1n===e||"1"===e?n:s).replace(/(?<!\\)%n/g,e)})}get(e=1){return this.case().get(e)}}function m(e,t){const n=(e=>{switch(t){case d.Lower:case d.Upper:case d.Title:case d.Sentence:return e.split(/\s+/);case d.Camel:case d.Pascal:return e.split(/(?=[A-Z])/);case d.Snake:return e.split(/_/g);case d.Split:throw new TypeError("Split case is only used for output, not input");default:throw new TypeError("Invalid case type, must be a Case value")}})(e.toString().trim());return t===d.Sentence?{inSentenceCase:!0,words:n.map(e=>e.trim()).filter(e=>e.length>0)}:{inSentenceCase:!1,words:n.map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}}function v(e){if(null==e||e){const e=[...a(u,this)],t=e.length-1;return e[t]=(e=>{let t;return t=e.replace(/(?<=sh?|ch|x|z|[^aeiou]o)$/i,"es"),t!==e?t:(t=e.replace(/(?<=[^aeiou])y$/i,"ies"),t!==e?t:(t=e.replace(/fe?$/i,"ves"),t!==e?t:`${e}s`))})(a(u,this)[t]),e}if(!1===e)return[...a(u,this)];if(e instanceof n)return e.case(d.Split).get();throw new TypeError("Invalid plural argument, must be boolean or Text instance")}t.Text=h,n=h,l(h,"Case",d)},8878(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.MediaWikiAPI=void 0;var s=n(1289),i=n(4551),a=n(2852),r=n(6873),o=n(505),l=n(8582);const d=console,c=new Set(l.__servers__.filter(e=>e.tag).map(e=>e.host)),u=new Set(l.__servers__.filter(e=>e.pending_changes).map(e=>e.host));class p{static get pendingChangesServers(){return Array.from(u)}static hasPendingChanges(e){return u.has(e)}static chunk(e,t=50){const n=[],s=e.length;for(let i=0;i<s;i+=t)n.push(e.slice(i,i+t));return n}static paramify(e){return Array.isArray(e)||(e=[e]),[...new Set(e)]}static join(e){return e.join("|").replace(/\|\|+/g,"|")}static getUsername(e,t){return e.fetch(`https://${t}/w/api.php`,{action:"query",meta:"userinfo",uiprop:"name",format:"json",formatversion:2},void 0,"POST",!0).then(e=>{var t;return(null==e||null===(t=e.query)||void 0===t||null===(t=t.userinfo)||void 0===t?void 0:t.name)||null})}constructor(e,t,n,s){var i,o;this.glob=e,this.oauth=t,this.server=n,this.username=s,this.tokens={},null!==(o=(i=p.cache)[n])&&void 0!==o||(i[n]={parse:new r.Trie({size:1e3}),pending:new a.Memory({size:2500,timeout:36e5}),abuse:new a.Memory({size:2500,timeout:9e5}),ores:new a.Memory({size:1e4,timeout:9e5}),diff:new a.Memory({size:500,timeout:3e5})})}close(){this.stream.disconnect()}get cache(){return p.cache[this.server]}build(e={},t=null){return{tags:c.has(null!=t?t:this.server)?"WikiShield script":"",assertuser:this.username,discussiontoolsautosubscribe:"no",...e}}user(e){return`[[Special:Contribs/${e}|${e}]] ([[User talk:${e}|talk]])`}revision(e){return`[[Special:Diff/${e}|${e}]]`}centralAuthUser(e){return`[[Special:CentralAuth/${e}|${e}]]`}summary(e,t){const n=" ([[:en:WP:WikiShield|WS]])",s=`${e}${t?`: ${t}`:""}`;return`${(0,i.truncate)(s,473)}${n}`}async post(e,t=!1,n=null){try{const s=await this.oauth.fetch(`https://${n||this.server}/w/api.php`,this.build({...e,format:"json",formatversion:2},n),void 0,"POST",t,n);if(s.error){if("alreadyrolled"===s.error.code||"editconflict"===s.error.code)return"editconflict";if("missingcontent"===s.error.code&&"compare"===e.action)return{compare:{body:""}};throw new Error(`API Error: ${s.error.code} - ${s.error.info}`)}return s}catch(t){throw d.error("Error in API POST request:",t,JSON.stringify(e)),t}}async continuous(e,t,n,s){try{let i=null;const a=[];do{const r=await this.post({...e,...i||{}},n,s);a.push(r),i=r.continue||null,"function"==typeof t&&!0===await t(r,a)&&(i=!1)}while(i);return{stopped:null!==i,responses:a}}catch(t){return d.error("Error in API continuous request:",t,JSON.stringify(e)),{stopped:!0,responses:[]}}}async getToken(e="csrf",t,n){const s=`${null!=n?n:this.server}:${e}`;if(void 0!==this.tokens[s])return this.tokens[s];try{return this.tokens[s]=this.post({action:"query",meta:"tokens",type:e},t,n).then(t=>{var n;return(null==t||null===(n=t.query)||void 0===n||null===(n=n.tokens)||void 0===n?void 0:n[`${e}token`])||null})}catch(e){throw d.error("Error fetching token:",e),e}}async postWithToken(e,t="csrf",n,s){try{return await this.post({...e,token:await this.getToken(t,n,s)},n,s)}catch(e){throw d.error("Post with token error:",e),e}}async account(e,t){try{var n;return(null===(n=await this.post({action:"query",meta:"userinfo",uiprop:"*"},e,t))||void 0===n||null===(n=n.query)||void 0===n?void 0:n.userinfo)||{}}catch(e){var s;return null!==(s=void d.error("Error fetching account info:",e))&&void 0!==s?s:{}}}async getGlobalUserInfo(e,t,n){try{var s;return(null===(s=(await this.post({action:"query",meta:"globaluserinfo",guiuser:e,guiprop:"groups|rights"},t,n)).query)||void 0===s?void 0:s.globaluserinfo)||{}}catch(e){var i;return null!==(i=void d.error("Error fetching global user info:",e))&&void 0!==i?i:{}}}async markWatchlistSeen(e,t,n,s){try{await this.postWithToken({action:"setnotificationtimestamp",titles:e,newerthanrevid:t},"csrf",n,s)}catch(e){var i;return null!==(i=void d.error("Error marking watchlist item as seen:",e))&&void 0!==i?i:{valid:!1,reason:e.message}}}async append(e,t,n,s,i=null,a,r){try{if(null!==i){return{needsCheck:!0,text:(await this.getPagesContent([e],a,r))[e]||""}}return"editconflict"===await this.postWithToken({action:"edit",title:e,...null===(null!=t?t:null)?{}:{section:t},appendtext:`\n${n}`,summary:s},"csrf",a,r)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var o;return null!==(o=void d.error("Error appending to section:",e))&&void 0!==o?o:{valid:!1,reason:e.message}}}async editSection(e,t,n,s,i,a=null,r,o){try{if(null!==a){return{needsCheck:!0,text:(await this.getPagesContent([e],r,o))[e]||""}}return"editconflict"===await this.postWithToken({action:"edit",title:e,section:t,sectiontitle:n,text:s,summary:i},"csrf",r,o)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var l;return null!==(l=void d.error("Error editing section:",e))&&void 0!==l?l:{valid:!1,reason:e.message}}}async acceptPendingEdit(e,t,n,s){try{return await this.postWithToken({action:"review",revid:e,comment:t},"csrf",n,s),{valid:!0}}catch(e){return{valid:!1,reason:"Edit could not be accepted."}}}async rejectPendingEdit(e,t,n,s,i,a){try{const r=(await this.getRevisionsContent([t],i,a))[t]||"";return"editconflict"===await this.postWithToken({action:"edit",title:n,text:r,summary:s,baserevid:e},"csrf",i,a)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){return{valid:!1,reason:"Edit could not be rejected."}}}async rollbackEdit(e,t,n,s,i){try{var a;const r=await this.postWithToken({action:"rollback",title:e,user:t,summary:n},"rollback",s,i);if("editconflict"===r)return{valid:!1,reason:"Edit conflict."};if("onlyauthor"===r)return{valid:!1,reason:"Cannot rollback edits as the no other user has edited the page."};if(null===(a=r.rollback)||void 0===a||!a.revid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,r.rollback.revid,s,i)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var r;return null!==(r=void d.error("Error rolling back edit:",e))&&void 0!==r?r:{valid:!1,reason:e.message}}}async undoEdit(e,t,n,s,i){try{var a;const r=await this.postWithToken({action:"edit",title:e,undo:t,summary:n},"csrf",s,i);if("editconflict"===r)return{valid:!1,reason:"Edit conflict."};if(null===(a=r.edit)||void 0===a||!a.newrevid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,r.edit.newrevid,s,i)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var r;return null!==(r=void d.error("Error undoing edit:",e))&&void 0!==r?r:{valid:!1,reason:e.message}}}async restoreEdit(e,t,n,i,a){try{var r;const o=(0,s.convertToUTCString)(new Date),l=(await this.getRevisionsContent([t],i,a))[t]||"",d=await this.postWithToken({action:"edit",title:e,text:l,summary:n,starttimestamp:o},"csrf",i,a);if("editconflict"===d)return{valid:!1,reason:"Edit conflict."};if(null===(r=d.edit)||void 0===r||!r.newrevid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,d.edit.newrevid,i,a)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var o;return null!==(o=void d.error("Error restoring edit:",e))&&void 0!==o?o:{valid:!1,reason:e.message}}}async thankRevision(e,t,n){try{return await this.postWithToken({action:"thank",rev:e},"csrf",t,n),{valid:!0}}catch(e){var s;return null!==(s=void d.error("Error thanking revision:",e))&&void 0!==s?s:{valid:!1,reason:e.message}}}async watchPage(e,t,n,s){try{return await this.postWithToken({action:"watch",title:e,expiry:t},"watch",n,s),{valid:!0}}catch(e){var i;return null!==(i=void d.error("Error watching page:",e))&&void 0!==i?i:{valid:!1,reason:e.message}}}async unwatchPage(e,t,n){try{return await this.postWithToken({action:"watch",title:e,unwatch:!0},"watch",t,n),{valid:!0}}catch(e){var s;return null!==(s=void d.error("Error unwatching page:",e))&&void 0!==s?s:{valid:!1,reason:e.message}}}async parse(e,t,n=!1,s,i){null!=t||(t=void 0);const a=[t,e].filter(e=>void 0!==e);if(this.cache.parse.has(...a))return this.cache.parse.get(...a);try{var r;const o=(null===(r=await this.post({action:"parse",prop:"text",preview:n,text:e,title:t,contentmodel:"wikitext"},s,i))||void 0===r||null===(r=r.parse)||void 0===r?void 0:r.text)||"";return this.cache.parse.set(...a,o),o}catch(e){var o;return null!==(o=void d.error("Error parsing wikitext:",e))&&void 0!==o?o:""}}async getTags(e,t){try{return(await this.continuous({action:"query",list:"tags",tglimit:"max"},void 0,e,t)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.tags)||[]})}catch(e){var n;return null!==(n=void d.error("Error fetching revisions between IDs:",e))&&void 0!==n?n:[]}}async getPagesContent(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"content",rvslots:"*",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=(null===(i=t.revisions)||void 0===i||null===(i=i[0])||void 0===i||null===(i=i.slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content)||""}return r}catch(e){var a;return null!==(a=void d.error("Error fetching pages content:",e))&&void 0!==a?a:{}}}async getRevisionsContent(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|content",rvslots:"*",revids:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s;for(const e of t.revisions||[]){var i;r[e.revid]=(null===(i=e.slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content)||""}}return r}catch(e){var a;return null!==(a=void d.error("Error fetching revisions content:",e))&&void 0!==a?a:{}}}async getLatestIds(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=(null===(i=t.revisions)||void 0===i||null===(i=i[0])||void 0===i?void 0:i.revid)||null}return r}catch(e){var a;return null!==(a=void d.error("Error fetching latest IDs:",e))&&void 0!==a?a:{}}}async getRevisionsBetween(e,t,n,s,i){try{return(await this.continuous({action:"query",prop:"revisions",titles:e,rvstartid:n,rvendid:t,rvprop:"title|ids|flags|user|timestamp|comment|parsedcomment|size|tags",rvlimit:"max"},void 0,s,i)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions)||[]})}catch(e){var a;return null!==(a=void d.error("Error fetching revisions between IDs:",e))&&void 0!==a?a:[]}}async getEditCounts(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",list:"users",usprop:"editcount",ususers:p.join(e)},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.users)||[]){var s;a[t.name]=t.editcount}return a}catch(e){var i;return null!==(i=void d.error("Error fetching edit counts:",e))&&void 0!==i?i:{}}}async areUsersBlocked(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",list:"blocks",bkusers:p.join(e),bkprop:"id|user|by|reason|expiry|flags"},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.blocks)||[]){var s;a[t.user]=t}return a}catch(e){var i;return null!==(i=void d.error("Error fetching blocked users:",e))&&void 0!==i?i:{}}}async isUserGloballyLocked(e,t,n){try{var s;return!0===(null===(s=(await this.post({action:"query",meta:"globaluserinfo",guiuser:e},t,n)).query)||void 0===s||null===(s=s.globaluserinfo)||void 0===s?void 0:s.locked)}catch(e){var i;return null!==(i=void d.error("Error checking if user is globally locked:",e))&&void 0!==i&&i}}async getContributions(e,t=10,n,s){try{var i;return(null===(i=(await this.post({action:"query",list:"usercontribs",ucuser:e,uclimit:t,ucprop:"ids|title|timestamp|comment|parsedcomment|flags|tags|sizediff|flags"},n,s)).query)||void 0===i?void 0:i.usercontribs)||[]}catch(e){var a;return null!==(a=void d.error("Error fetching contributions:",e))&&void 0!==a?a:[]}}async getBlocks(e,t,n){try{return(await this.continuous({action:"query",list:"logevents",letype:"block",letitle:`User:${e}`,leaction:"block/block",lelimit:"max",leprop:"id|timestamp|details|user|comment|parsedcomment"},void 0,t,n)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.logevents)||[]})}catch(e){var s;return null!==(s=void d.error("Error fetching blocks:",e))&&void 0!==s?s:[]}}async pagesExist(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"content",rvslots:"*",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=t.missing||null===(i=t.revisions)||void 0===i||null===(i=i[0].slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content}return r}catch(e){var a;return null!==(a=void d.error("Error checking page existence:",e))&&void 0!==a?a:[]}}async getPagesDetails(e,t,n){e=p.paramify(e);try{const o=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.continuous({action:"query",prop:"info|categories|templates",titles:p.join(e),inprop:"protection|watched",cllimit:"max",tllimit:"max",tlnamespace:"10"},void 0,t,n))),l={};for(const e of o)if("fulfilled"===e.status)for(const t of e.value.responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.pages)||[]})){var s,i,a,r;null!==(i=l[s=t.title])&&void 0!==i||(l[s]={protection:null,watched:!1,categories:[],metadata:[]});let e=(null===(a=l[t.title])||void 0===a||null===(a=a.protection)||void 0===a?void 0:a.level)||null;for(const n of t.protection||[])"edit"===n.type&&("sysop"===n.level||"sysop"===e?e="sysop":"autoconfirmed"===n.level||"autoconfirmed"===e?e="autoconfirmed":"extendedconfirmed"!==n.level&&"extendedconfirmed"!==e||(e="extendedconfirmed"));const n=[];for(const e of t.templates||[]){const t=e.title.replace(/^Template:/i,"");t.match(/^use\s/i)&&n.push(t)}l[t.title]={protection:null===e?{protected:!1}:{protected:!0,level:e},watched:!0===t.watched||l[t.title].watched,categories:l[t.title].categories.concat((null===(r=t.categories)||void 0===r?void 0:r.map(e=>e.title))||[]),metadata:l[t.title].metadata.concat(n)}}return l}catch(e){var o;return null!==(o=void d.error("Error fetching page details:",e))&&void 0!==o?o:{}}}async getHistory(e,t=10,n,s){try{var i;const a=null===(i=(await this.post({action:"query",prop:"revisions",titles:e,rvlimit:t+1,rvprop:"ids|user|timestamp|comment|parsedcomment|flags|tags|size|flags"},n,s)).query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];if(null==a||!a.revisions)return[];const r=a.revisions.length,o=Math.min(t,r||0);for(let e=0;e<o;e++){const t=a.revisions[e];t.ns=a.ns,t.pageid=a.pageid,t.title=a.title,t.sizediff=e+1<r?t.size-a.revisions[e+1].size:t.size}return a.revisions.slice(0,o)}catch(e){var a;return null!==(a=void d.error("Error fetching page history:",e))&&void 0!==a?a:[]}}async countPageReverts(e,t,n,i){const a=e=>"mw-undo"===e||"mw-rollback"===e||"mw-manual-revert"===e;try{const o=await this.continuous({action:"query",prop:"revisions",titles:e,rvdir:"newer",rvstart:(0,s.convertToUTCString)(new Date(Date.now()-864e5)),rvprop:"tags",rvuser:t,rvlimit:"max"},void 0,n,i);let l=0;for(const e of o.responses){var r;l+=(null===(r=e.query)||void 0===r||null===(r=r.pages)||void 0===r||null===(r=r[0])||void 0===r||null===(r=r.revisions)||void 0===r?void 0:r.filter(e=>e.tags.some(a)).length)||0}return l}catch(e){var o;return null!==(o=void d.error("Error counting page reverts:",e))&&void 0!==o?o:0}}async getORES(e,t,n,s){e=p.paramify(e);try{const a={};e=e.filter(e=>{var t;const n=this.cache.ores.get(e);return!n||null!==(t=void(a[e]=n))&&void 0!==t&&t});const r=p.chunk(e,50),l=await Promise.allSettled(r.map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|oresscores",rvslots:"*",revids:p.join(e)},n,s)));for(const e of l)if("fulfilled"===e.status)for(const t of(null===(i=e.value.query)||void 0===i?void 0:i.pages)||[]){var i;for(const e of t.revisions||[])a[e.revid]=e.oresscores||{}}return o.ORES.extract(a,t)}catch(e){var a;return null!==(a=void d.error("Error fetching ORES scores:",e))&&void 0!==a?a:{}}}async extractORES(e,t=.5){return o.ORES.extract(e,t)}async getDiff(e,t,n="table",s,i){null!=e||(e=!1);const a=`${n}@${e}-${t}`;if(this.cache.diff.has(a))return this.cache.diff.get(a);try{var r;const o={action:"compare",prop:"diff",difftype:n,torev:t};0==e?(o.fromslots="main",o["fromtext-main"]=""):o.fromrev=e;const l=(null===(r=(await this.post(o,s,i)).compare)||void 0===r?void 0:r.body)||"";return this.cache.diff.set(a,l),l}catch(e){var o;return null!==(o=void d.error("Error fetching diff:",e))&&void 0!==o?o:""}}async getWikitextDiff(e,t,n="table",s,i){null!=e||(e=!1);try{var a;return(null===(a=(await this.post({action:"compare",prop:"diff",difftype:n,fromslots:"main","fromtext-main":!1===e?"":e,toslots:"main","totext-main":t},s,i)).compare)||void 0===a?void 0:a.body)||""}catch(e){var r;return null!==(r=void d.error("Error fetching wikitext diff:",e))&&void 0!==r?r:""}}async getSizeDiff(e,t,n,s){try{var i;const a=await(null===(i=this.post({action:"query",prop:"revisions",rvprop:"size",revids:`${e}|${t}`},n,s).query)||void 0===i||null===(i=i.pages)||void 0===i||null===(i=i[0])||void 0===i?void 0:i.revisions)||[];return 0===a.length?0:1===a.length?a[0].size:a[1].size-a[0].size}catch(e){var a;return null!==(a=void d.error("Error fetching size diff:",e))&&void 0!==a?a:0}}async getRevision(e,t,n,s){try{var i,a,r;const o=null===(i=(await this.post({action:"query",prop:"revisions",titles:e,rvprop:"ids|user|comment|parsedcomment|timestamp|size|tags|flags",rvslots:"*",rvstartid:t,rvlimit:2},n,s)).query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];if(null==o||null===(a=o.revisions)||void 0===a||!a.length)return{};const l=o.revisions[0];return{revid:l.revid,parentid:l.parentid,user:l.user,parsedcomment:l.parsedcomment,comment:l.comment,timestamp:l.timestamp,size:l.size,oldlen:(null===(r=o.revisions[1])||void 0===r?void 0:r.size)||0,minor:l.minor||!1,tags:l.tags||[]}}catch(e){var o;return null!==(o=void d.error("Error fetching revision:",e))&&void 0!==o?o:{}}}async getRevisions(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|user|comment|parsedcomment|timestamp|size|tags|flags|oresscores",rvslots:"*",revids:p.join(e)},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s;for(const e of t.revisions||[])a[e.revid]=e}return a}catch(e){var i;return null!==(i=void d.error("Error fetching revisions:",e))&&void 0!==i?i:{}}}async getConsecutiveEdits(e,t,n,s,i){try{var a,r;const o=await this.continuous({action:"query",prop:"revisions",titles:e,rvprop:"ids|timestamp|user|size|parsedcomment",rvlimit:"max",rvstartid:t},e=>{var t;return null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions.some(e=>e.user!==n)},s,i),l=o.responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions)||[]});let d,c;const u=l[0];if((null==u?void 0:u.user)!==n)return{count:0,sizediff:0,timestamp:{new:null,old:null},diff:null,edits:[]};const p={count:0,sizediff:0,timestamp:{new:null,old:null},diff:null,edits:[]},g=l.length;for(let e=0;e<g;e++){const t=l[e];if(c=t,t.user!==n)break;p.edits.push(t),d=t,p.count++,p.sizediff+=e+1<g?t.size-l[e+1].size||0:t.size||0}return p.timestamp.new=(null==u?void 0:u.timestamp)||null,p.timestamp.old=(null===(a=d)||void 0===a?void 0:a.timestamp)||null,o.stopped?p.diff=await this.getDiff((null===(r=c)||void 0===r?void 0:r.revid)||null,u.revid,"table",s,i):p.diff=await this.getDiff(null,u.revid,"table",s,i),p}catch(e){return d.error("Get consecutive edits error:",e),{count:0,sizediff:0,timestamp:{new:null,old:null},diff:null}}}async parseUsers(e,t,n,s){e=p.paramify(e);const i=Array.from({length:e.length},()=>({user:{}}));try{const a=[];return a.push(this.getEditCounts(e,n,s).then(t=>{e.forEach((e,n)=>i[n].user.edits=t[e]||0)}),this.areUsersBlocked(e,n,s).then(t=>{e.forEach((e,n)=>i[n].user.blocked=t[e]||null)}),this.pagesExist(e.map(e=>`User talk:${e}`),n,s).then(t=>{e.forEach((e,n)=>i[n].user.talk=t[`User talk:${e}`])})),t||a.push((async()=>{await Promise.all(e.map(async(e,t)=>{[i[t].user.contributions,i[t].user.blocks]=await Promise.all([this.getContributions(e,void 0,n,s),this.getBlocks(e,n,s)])}))})()),await Promise.all(a),i}catch(e){var a;return null!==(a=void d.error("Parse user error:",e))&&void 0!==a?a:i}}async parseEdits(e,t,n,s,i){e=p.paramify(e);const a=p.paramify(e.map(e=>e.item.user)),r=p.paramify(e.map(e=>e.item.revid)),o=p.paramify(e.map(e=>e.item.title)),l=e.map(({item:e,prior:t})=>({item:e,prior:t,data:{user:{},page:{},edit:{}}}));try{const d=[];return d.push(this.parseUsers(a,t,s,i).then(t=>{e.forEach((e,n)=>{const s=a.indexOf(e.item.user);l[n].data.user=t[s].user})}),this.getPagesDetails(o,s,i).then(t=>{e.forEach((e,n)=>{var s,i,a,r;l[n].data.page.protection=(null===(s=t[e.item.title])||void 0===s?void 0:s.protection)||{protected:!1},l[n].data.page.watched=(null===(i=t[e.item.title])||void 0===i?void 0:i.watched)||!1,l[n].data.page.categories=(null===(a=t[e.item.title])||void 0===a?void 0:a.categories)||[],l[n].data.page.metadata=(null===(r=t[e.item.title])||void 0===r?void 0:r.metadata)||[]})}),this.getORES(r,n,s,i).then(t=>{e.forEach((e,n)=>{l[n].data.edit.ores=t[e.item.revid]||0})})),t||d.push((async()=>{await Promise.all(e.map(async(e,t)=>{[l[t].data.page.consecutive,l[t].data.page.reverts,l[t].data.page.history,l[t].data.edit.diff]=await Promise.all([this.getConsecutiveEdits(e.item.title,e.item.revid,e.item.user,s,i),this.countPageReverts(e.item.title,this.username,s,i),this.getHistory(e.item.title,void 0,s,i),this.getDiff(e.prior||null,e.item.revid,"table",s,i)])}))})()),await Promise.all(d),l}catch(e){var c;return null!==(c=void d.error("Parse edit error:",e))&&void 0!==c?c:l}}async parseAbuselogs(e,t,n,s){e=p.paramify(e);const i=p.paramify(e.map(e=>e.user)),a=p.paramify(e.map(e=>e.title)),r=e.map(e=>({item:e,data:{user:{},page:{},edit:{}}}));try{const o=[];return o.push((async()=>{await Promise.all(e.map(async(e,t)=>{[r[t].data.parsedcomment]=await Promise.all([this.parse(e.comment,void 0,!1,n,s)])}))})(),this.parseUsers(i,t,n,s).then(t=>{e.forEach((e,n)=>{const s=i.indexOf(e.user);r[n].data.user=t[s].user})}),this.getPagesDetails(a,n,s).then(t=>{e.forEach((e,n)=>{var s,i,a,o;r[n].data.page.protection=(null===(s=t[e.title])||void 0===s?void 0:s.protection)||{protected:!1},r[n].data.page.watched=(null===(i=t[e.title])||void 0===i?void 0:i.watched)||!1,r[n].data.page.categories=(null===(a=t[e.title])||void 0===a?void 0:a.categories)||[],r[n].data.page.metadata=(null===(o=t[e.title])||void 0===o?void 0:o.metadata)||[]})})),t||o.push((async()=>{await Promise.all(e.map(async(e,t)=>{[r[t].data.page.reverts,r[t].data.page.history,r[t].data.edit.diff]=await Promise.all([this.countPageReverts(e.title,this.username,n,s),this.getHistory(e.title,void 0,n,s),e.diff?this.getWikitextDiff(e.diff.old,e.diff.new,"table",n,s):Promise.resolve(null)])}))})()),await Promise.all(o),r}catch(e){var o;return null!==(o=void d.error("Parse abuselog error:",e))&&void 0!==o?o:r}}async getAbuseLogRevid(e,t,n){try{var s,i;return(null===(i=((null===(s=(await this.post({action:"query",list:"abuselog",afllogids:e,aflprop:"ids|revid"},t,n)).query)||void 0===s?void 0:s.abuselog)||[]).find(t=>t.id===e))||void 0===i?void 0:i.revid)||null}catch(e){var a;return null!==(a=void d.error("Error fetching abuse log revids:",e))&&void 0!==a?a:{}}}async feeds(e=null,t=null,n=null,s=null,i=null){[e,t,n,s,i]=[e,t,n,s,i].map(e=>"object"==typeof e?e:{});try{const a={action:"query",list:[]};null!==e&&(a.list.push("recentchanges"),a.rctype="edit",a.rcprop="title|ids|sizes|flags|user|timestamp|comment|parsedcomment|tags|oresscores",a.rcshow="!bot",a.rcnamespace=e.ns||"*",e.since&&(a.rcstart=e.since),a.rcdir=e.since?"newer":"older",a.rclimit="max"),null!==t&&u.has(this.server)&&(a.list.push("oldreviewedpages"),a.ornamespace=t.ns||"*",a.orlimit="max"),null!==n&&(a.list.push("logevents"),a.letype="newusers",a.wlprop="ids|title|type|user|timestamp|comment|details|parsedcomment",n.since&&(a.lestart=n.since),a.ledir=n.since?"newer":"older",a.lelimit="max"),null!==s&&(a.list.push("watchlist"),a.wltype="edit",a.wlprop="title|ids|sizes|flags|user|timestamp|comment|tags|oresscores|parsedcomment",a.wlexcludeuser=this.username,a.wlnamespace=s.ns||"*",s.since&&(a.wlstart=s.since),a.wldir=s.since?"newer":"older",a.wllimit="max"),null!==i&&(a.list.push("abuselog"),a.aflnamespace=i.ns||"*",i.since&&(a.aflstart=i.since),a.afldir=i.since?"newer":"older",a.aflprop="ids|user|title|action|result|timestamp|hidden|revid|filter|details",a.afllimit="max"),a.list=p.join(a.list);const r={recent:[],pending:[],users:[],watchlist:[],abuselog:[]};if((await this.continuous(a)).responses.forEach(e=>{const t=e.query||{};t.recentchanges&&(r.recent=r.recent.concat(t.recentchanges)),t.oldreviewedpages&&(r.pending=r.pending.concat(t.oldreviewedpages).slice(0,100)),t.logevents&&(r.users=r.users.concat(t.logevents.filter(e=>!e.temp))),t.watchlist&&(r.watchlist=r.watchlist.concat(t.watchlist)),t.abuselog&&(r.abuselog=r.abuselog.concat(t.abuselog))}),r.pending.length>0){const e=new Map,n={};if(await Promise.allSettled(r.pending.map(async t=>{var s,i,a;this.cache.pending.has(t.revid)||this.cache.pending.set(t.revid,await this.post({action:"query",prop:"revisions",titles:t.title,rvstartid:t.revid,rvlimit:1,rvprop:"ids|flags|user|timestamp|comment|parsedcomment|size|tags"}));const r=this.cache.pending.get(t.revid);e.has(t.title)||e.set(t.title,this.post({action:"query",list:"logevents",letype:"stable",leprop:"ids|title|type|user|timestamp|comment|details|parsedcomment",letitle:t.title,lelimit:1})),t.stability=(null===(s=await e.get(t.title))||void 0===s||null===(s=s.query)||void 0===s||null===(s=s.logevents)||void 0===s?void 0:s[0])||{};const o=null===(i=r.query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];n[t.title]={title:t.title,sizediff:t.diff_size,...null===(a=o.revisions)||void 0===a?void 0:a[0],pending:t}})),r.pending=Object.values(n),!0===t.full){const e={};await Promise.allSettled(r.pending.map(async t=>{const n=await this.getRevisionsBetween(t.title,t.pending.stable_revid,t.revid);if(n.length<2)return;const s=n.pop();e[t.title]={count:n.length,users:n.reduce((e,t)=>(t.user in e?e[t.user]++:e[t.user]=1,e),{}),edits:n,revid:t.revid,prior:s.revid,sizediff:t.size-s.size,timestamp:{new:t.timestamp,old:n[n.length-1].timestamp},pending:t.pending}})),r.pending=e}}if(r.abuselog.length>0){const e={};r.abuselog.forEach(t=>{if("edit"!==t.action)return;const n=`${t.user}|${t.title}|${t.timestamp}`;n in e?e[n].push(t):e[n]=[t]});const t=[];await Promise.allSettled(Object.entries(e).map(async([,e])=>{var n,s,i,a,r;const o=e[e.length-1],l=new Set(e.flatMap(e=>e.result.split(","))),d=e.find(e=>""!==e.revid&&void 0!==e.revid),c=e.find(e=>Object.keys(e.details).length);t.push({id:o.id,revision:void 0!==d,private:!c,result:l,action:o.action,revid:null!==(n=null==d?void 0:d.revid)&&void 0!==n?n:null,diff:c.details?{new:c.details.new_wikitext,old:c.details.old_wikitext,size:c.details.edit_delta}:null,timestamp:o.timestamp,comment:null!==(s=null==c||null===(i=c.details)||void 0===i?void 0:i.summary)&&void 0!==s?s:null,user:o.user,editcount:null!==(a=null==c||null===(r=c.details)||void 0===r?void 0:r.user_editcount)&&void 0!==a?a:null,ns:o.ns,title:o.title,entries:e})})),r.abuselog=t}return r}catch(e){return d.error("Feeds error:",e),{recent:[],pending:t.full?{}:[],users:[],watchlist:[],abuselog:[]}}}}var g,h,m;t.MediaWikiAPI=p,g=p,m={},(h=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(h="cache"))in g?Object.defineProperty(g,h,{value:m,enumerable:!0,configurable:!0,writable:!0}):g[h]=m},2486(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.build=async function(){document.head.querySelectorAll("link[rel=stylesheet]").forEach(e=>e.remove());const e=(new DOMParser).parseFromString(s.default,"text/html");document.title=e.title,e.head.querySelectorAll("link[rel=stylesheet]").forEach(e=>{document.head.appendChild(Object.assign(document.createElement("link"),{rel:"stylesheet",href:e.href}))});[i.default,a.default].filter(Boolean).forEach(e=>{const t=document.createElement("style");t.textContent=e,document.head.appendChild(t)});document.body.innerHTML=e.body.innerHTML,await new Promise(requestAnimationFrame)};var s=r(n(5540)),i=r(n(4279)),a=r(n(2459));function r(e){return e&&e.__esModule?e:{default:e}}},4112(e,t){function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function s(e,t){return e.get(a(e,t))}function i(e,t,n){return e.set(a(e,t),n),n}function a(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.MediaWikiOAuth2=void 0;var r=new WeakMap,o=new WeakMap;class l{constructor(e){n(this,r,void 0),n(this,o,0),i(r,this,Date.now()),this.delay=e,this.last=0}get count(){return s(o,this)}per(e=1){return Math.floor(s(o,this)/((Date.now()-s(r,this))/e))||0}call(e,t=!1){var n;i(o,this,(n=s(o,this),n++,n));const a=Date.now(),r=Math.max(0,this.last+this.delay-a);return this.last=a+r,t||0===r?e():new Promise(t=>setTimeout(async()=>t(await e()),r))}}t.MediaWikiOAuth2=class{constructor(e){this.userAgent=e,this.throttle=new l(0),this.api=new mw.Api}getOrigin(e){const t=`${location.protocol}//${location.host}`;try{const n=new URL(e);if(`${n.protocol}//${n.host}`===t)return}catch(e){}return t}async fetch(e,t={},n=null,s="POST",i){return await this.throttle.call(async()=>{const n=this.getOrigin(e);return n&&(e+=(e.includes("?")?"&":"?")+`origin=${encodeURIComponent(n)}`),await this.api.ajax({...t,origin:n},{url:e,method:s,...n?{xhrFields:{withCredentials:!0}}:{}}).catch(e=>{throw console.error(`[WikiSHield] Failed to parse OAuth2 response (rpm: ${this.throttle.per(6e4)}):`,e),e})},i)}}},505(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ORES=void 0;t.ORES=class{static extract(e,t=.5){const n=[{key:"goodfaith",field:"false",bias:t},{key:"damaging",field:"true",bias:1-t}],s={};for(const[t,r]of Object.entries(e)){const e=[];for(const t of n){var i,a;const n=r[t.key];if(!n)continue;let s=null!==(i=null===(a=n.probability)||void 0===a?void 0:a[t.field])&&void 0!==i?i:n[t.field];void 0===s&&void 0!==n.prediction&&(s=+n.prediction),void 0===s||isNaN(s)||e.push(s*(t.bias||0))}s[t]=0===e.length?NaN:e.reduce((e,t)=>e+t,0)/e.length}return s}}},8582(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.__servers__=void 0;t.__servers__=[{name:"English",host:"en.wikipedia.org",language_code:"en",tag:!0,pending_changes:!0},{name:"seperator"},{name:"Test",host:"test2.wikipedia.org",language_code:"en",tag:!1,pending_changes:!0}]},2535(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.API=void 0;var s=n(4551),i=n(8878),a=n(4112);function r(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function o(e,t,n){return e.set(d(e,t),n),n}function l(e,t){return e.get(d(e,t))}function d(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}const c=new Set([]);let u=t.API=void 0;var p,g,h,m;window.isElectron?t.API=(p=new WeakMap,g=new WeakMap,h=new WeakMap,u=class{static chunk(e,t=50){const n=[],s=e.length;for(let i=0;i<s;i+=t)n.push(e.slice(i,i+t));return n}static paramify(e){return Array.isArray(e)||(e=[e]),[...new Set(e)].filter(e=>"string"==typeof e&&e.trim())}get username(){return l(h,this)}get hasPendingChanges(){return c.has(l(g,this))}constructor(e,t,n,s){r(this,p,null),r(this,g,null),r(this,h,null),o(p,this,e),o(g,this,t),o(h,this,n);for(const e of s)c.add(e)}build(e={}){return{assertuser:l(h,this),discussiontoolsautosubscribe:"no",...e}}summary(e,t){const n=" ([[:en:WP:WikiShield|WS]])",i=`${e}${t?`: ${t}`:""}`;return`${(0,s.truncate)(i,473)}${n}`}user(e){return`[[Special:Contribs/${e}|${e}]] ([[User talk:${e}|talk]])`}revision(e){return`[[Special:Diff/${e}|${e}]]`}centralAuthUser(e){return`[[Special:CentralAuth/${e}|${e}]]`}async post(e,t,n){try{return await electron.mwapi("post",e,t,n)}catch(e){var s;if("assertnameduserfailed"===e||null!==(s=e.message)&&void 0!==s&&s.includes("assertnameduserfailed"))return l(p,this).disable("Invalid account","Your account was logged out or changed.");throw e}}async continuous(e,t,n,s){try{let i=null;const a=[];do{const r=await this.post({...e,...i||{}},n,s);if(a.push(r),i=r.continue||null,"function"==typeof t&&!0===await t(r,a)){i=!0;break}}while(i);return{stopped:null!==i,responses:a}}catch(e){return console.error("Continuous error:",e),{stopped:!0,responses:[]}}}async getToken(e="csrf",t,n){return await electron.mwapi("getToken",e,t,n)}async postWithToken(e,t="csrf",n,s){return await electron.mwapi("postWithToken",e,t,n,s)}async account(e,t){return await electron.mwapi("account",e,t)}async getGlobalUserInfo(e,t,n){return await electron.mwapi("getGlobalUserInfo",e,t,n)}async markWatchlistSeen(e,t,n,s){return await electron.mwapi("markWatchlistSeen",e,t,n,s)}async append(e,t,n,s,i,a,r){if("function"==typeof i){const o=await electron.mwapi("append",e,t,n,s,!0,a,r);if(o.needsCheck){const l=await i(o.text);return l.valid?await electron.mwapi("append",e,t,n,s,void 0,a,r):{valid:!1,reason:l.reason||"Append check failed."}}return o}return await electron.mwapi("append",e,t,n,s,void 0,a,r)}async editSection(e,t,n,s,i,a,r,o){if("function"==typeof a){const l=await electron.mwapi("editSection",e,t,n,s,i,!0,r,o);if(l.needsCheck){const d=await a(l.text);return d.valid?await electron.mwapi("editSection",e,t,n,s,i,void 0,r,o):{valid:!1,reason:d.reason||"Edit section check failed."}}return l}return await electron.mwapi("editSection",e,t,n,s,i,void 0,r,o)}async acceptPendingEdit(e,t,n,s){return await electron.mwapi("acceptPendingEdit",e,t,n,s)}async rejectPendingEdit(e,t,n,s,i,a){return await electron.mwapi("rejectPendingEdit",e,t,n,s,i,a)}async rollbackEdit(e,t,n,s,i){return await electron.mwapi("rollbackEdit",e,t,n,s,i)}async undoEdit(e,t,n,s,i){return await electron.mwapi("undoEdit",e,t,n,s,i)}async restoreEdit(e,t,n,s,i){return await electron.mwapi("restoreEdit",e,t,n,s,i)}async thankRevision(e,t,n){return await electron.mwapi("thankRevision",e,t,n)}async watchPage(e,t,n,s){return await electron.mwapi("watchPage",e,t,n,s)}async unwatchPage(e,t,n){return await electron.mwapi("unwatchPage",e,t,n)}async parse(e,t,n=!1,s,i){return await electron.mwapi("parse",e,t,n,s,i)}async getTags(e,t){return await electron.mwapi("getTags",e,t)}async getPagesContent(e,t,n){return await electron.mwapi("getPagesContent",e,t,n)}async getRevisionContent(e,t,n){return await electron.mwapi("getRevisionContent",e,t,n)}async getLatestIds(e,t,n){return await electron.mwapi("getLatestIds",e,t,n)}async getEditCounts(e,t,n){return await electron.mwapi("getEditCounts",e,t,n)}async areUsersBlocked(e,t,n){return await electron.mwapi("areUsersBlocked",e,t,n)}async isUserGloballyLocked(e,t,n){return await electron.mwapi("isUserGloballyLocked",e,t,n)}async getContributions(e,t,n,s){return await electron.mwapi("getContributions",e,t,n,s)}async getBlocks(e,t,n){return await electron.mwapi("getBlocks",e,t,n)}async pagesExist(e,t,n){return await electron.mwapi("pagesExist",e,t,n)}async getPagesDetails(e,t,n){return await electron.mwapi("getPagesDetails",e,t,n)}async countPageReverts(e,t,n,s){return await electron.mwapi("countPageReverts",e,t,n,s)}async getHistory(e,t,n,s){return await electron.mwapi("getHistory",e,t,n,s)}async getORES(e,t,n,s){return await electron.mwapi("getORES",e,t,n,s)}async extractORES(e,t){return await electron.mwapi("extractORES",e,t)}async getDiff(e,t,n,s,i){return await electron.mwapi("getDiff",e,t,n,s,i)}async getRevision(e,t,n,s){return await electron.mwapi("getRevision",e,t,n,s)}async getRevisionsBetween(e,t,n,s,i){return await electron.mwapi("getRevisionsBetween",e,t,n,s,i)}async parseUsers(e,t,n,s){return await electron.mwapi("parseUsers",e,t,n,s)}async parseEdits(e,t,n,s,i){return await electron.mwapi("parseEdits",e,t,n,s,i)}async parseAbuselogs(e,t,n,s){return await electron.mwapi("parseAbuselogs",e,t,n,s)}async getConsecutiveEdits(e,t,n,s,i){return await electron.mwapi("getConsecutiveEdits",e,t,n,s,i)}async getAbuseLogRevid(e,t,n){return await electron.mwapi("getAbuseLogRevid",e,t,n)}async feeds(e,t,n,s,i){return await electron.mwapi("feeds",e,t,n,s,i)}}):t.API=(m=new WeakMap,u=class extends i.MediaWikiAPI{get hasPendingChanges(){return c.has(this.server)}constructor(e,t,n,s){super(e,new a.MediaWikiOAuth2(`WikiShield (${t}; ${n})`),t,n),r(this,m,null),o(m,this,e),this.server=t,this.username=n;for(const e of s)c.add(e)}})},691(e,t){function n(e,t,n){s(e,t),t.set(e,n)}function s(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function i(e,t){return e.get(r(e,t))}function a(e,t,n){return e.set(r(e,t),n),n}function r(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Killswitch=void 0;var o=new WeakMap,l=new WeakMap,d=new WeakMap,c=new WeakSet;function u(e){if(i(d,this)[e])for(const n of i(d,this)[e])try{n.callback()}catch(e){}finally{var t;!0===(null===(t=n.options)||void 0===t?void 0:t.once)&&(i(d,this)[e]=i(d,this)[e].filter(e=>e!==n))}return this}t.Killswitch=class{constructor(e){var t,i;s(t=this,i=c),i.add(t),n(this,o,null),n(this,l,null),n(this,d,{okay:[],unsafe:[],update:[],"force-update":[],kill:[]}),a(o,this,e.api)}on(e,t,n={}){return i(d,this)[e]&&i(d,this)[e].push({callback:t,options:n}),this}async check(){try{var e,t,n,s,a,l,d;const m=null!==(e=null===(t=await i(o,this).getPagesContent([p._],!0,"en.wikipedia.org"))||void 0===t?void 0:t[p._])&&void 0!==e?e:"",v=null===(n=JSON.parse(m))||void 0===n?void 0:n.WikiShield;if(!v)throw new Error("No killswitch found");if(v.disabled)return r(c,this,u).call(this,"kill");const f=null!==(s=null===(a=v.reload)||void 0===a?void 0:a.soft)&&void 0!==s?s:0;return(null!==(l=null===(d=v.reload)||void 0===d?void 0:d.hard)&&void 0!==l?l:0)>h._?r(c,this,u).call(this,"force-update"):f>g._?(g._=f,r(c,this,u).call(this,"update")):r(c,this,u).call(this,"okay")}catch(e){return r(c,this,u).call(this,"unsafe")}}monitor(e=1e4){return i(l,this)&&clearInterval(i(l,this)),a(l,this,setInterval(()=>this.check(),+e)),this}};var p={_:"User:LuniZunie/JSON/Killswitch.json"},g={_:11},h={_:1}}},t={};function n(s){var i=t[s];if(void 0!==i)return i.exports;var a=t[s]={exports:{}};return e[s](a,a.exports,n),a.exports}var s=n(8816),i=n(2486);{var a,r;function o(){(0,i.build)().then(s.run).catch(e=>{console.error("Error during build:",e),alert("An error occurred while starting WikiShield. Please check the console for details.")})}switch(null===(a=mw.util.addPortletLink("p-personal",mw.util.getUrl("Wikipedia:WikiShield/run"),"Run WikiShield","pt-wikishield","WikiShield",void 0,"#pt-notifications"))||void 0===a||a.addEventListener("click",e=>{e.preventDefault(),history.pushState({page:"WikiShield"},"",location.href),o()}),addEventListener("popstate",e=>{var t;"WikiShield"===(null===(t=e.state)||void 0===t?void 0:t.page)&&o()}),null===(r=history.state)||void 0===r?void 0:r.page){case"WikiShield":history.replaceState(null,"",location.href);break;case"WikiShield-reload":history.replaceState({page:"WikiShield"},"",location.href),o()}"Wikipedia:WikiShield/run"===mw.config.get("wgRelevantPageName")&&"view"===mw.config.get("wgAction")&&(history.pushState({page:"WikiShield"},"",location.href),o())}}(); fkoj7gzwvwxeeoaekvwue8jope8y06k 613760 613758 2026-05-25T17:15:51Z LuniZunie 25284 typo oops 613760 javascript text/javascript !function(){"use strict";var e={4279(e){e.exports="@import url('https://fonts.googleapis.com/css2?family=Varela+Round&display=swap');\r\n\r\n:root {\r\n\t--max-z-index: 2147483647;\r\n\r\n --body-color: rgba(241, 245, 255, 1);\r\n --body-background: rgba(20, 20, 30, 1);\r\n\r\n font-family: 'Inter', sans-serif;\r\n \tfont-optical-sizing: auto;\r\n -webkit-font-smoothing: antialiased;\r\n\t-moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n* {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n\tbox-sizing: border-box;\r\n}\r\n\r\n::-webkit-scrollbar {\r\n\twidth: 10px;\r\n\theight: 10px;\r\n}\r\n\r\n::-webkit-scrollbar-track {\r\n\tbackground: transparent;\r\n}\r\n\r\n::-webkit-scrollbar-thumb {\r\n\tborder: 2px solid transparent;\r\n border-radius: 10px;\r\n\r\n\t/* Theme dependent */\r\n\tbackground: rgba(255, 255, 255, .1);\r\n\tbackground-clip: content-box;\r\n\r\n\t&:hover {\r\n\t\tborder: 2px solid transparent;\r\n\t\tborder-radius: 10px;\r\n\r\n\t\t/* Theme dependent */\r\n\t\tbackground: rgba(255, 255, 255, .2);\r\n\t\tbackground-clip: content-box;\r\n\t}\r\n}\r\n\r\nhtml, body {\r\n width: 100%;\r\n\theight: 100%;\r\n\r\n\toverflow: hidden;\r\n\r\n /* Theme dependent */\r\n background: linear-gradient(135deg,\r\n\t\trgba(20, 30, 48, 1),\r\n\t\trgba(36, 59, 85, 1)\r\n\t);\r\n}\r\n\r\n@keyframes loading-dots {\r\n\t0%, 100% {\r\n\t\tcontent: '';\r\n\t}\r\n\t25% {\r\n\t\tcontent: '.';\r\n\t}\r\n\t50% {\r\n\t\tcontent: '..';\r\n\t}\r\n\t75% {\r\n\t\tcontent: '...';\r\n\t}\r\n}\r\n\r\n.animate-loading-dots::after {\r\n\tcontent: '';\r\n\r\n\tdisplay: inline-block;\r\n\r\n\tanimation: loading-dots 1.5s steps(3, start) infinite;\r\n}\r\n\r\n.auto-scroll {\r\n white-space: nowrap;\r\n overflow: auto hidden;\r\n\r\n scrollbar-width: none;\r\n -ms-overflow-style: none;\r\n\r\n\t&::-webkit-scrollbar { display: none; }\r\n\r\n & > .auto-scroll-item {\r\n display: inline-block;\r\n\r\n\t\t&:not(:last-child) {\r\n\t\t\tmargin-right: 20px;\r\n\t\t}\r\n }\r\n &:not(:has(> .auto-scroll-item)) {\r\n opacity: 0;\r\n }\r\n}"},5540(e){e.exports='<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <meta http-equiv="Content-Security-Policy">\n\n <title>WikiShield</title>\n\n <link rel="stylesheet" href="https://fonts.cdnfonts.com/css/open-dyslexic">\n <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.0/css/all.min.css">\n\n <link rel="stylesheet" href="../common/style.css">\n <link rel="stylesheet" href="style.css">\n\n <script type="module" src="script.js"><\/script>\n </head>\n <body>\n <div id="loading">\n <img class="icon" src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n </div>\n <div id="initial" class="hidden">\n\t\t\t<canvas id="dots-canvas"></canvas>\n\t\t\t<div id="welcome-container" class="shimmer shimmer-border">\n\t\t\t\t<div class="shield-container">\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t<div class="shield-icon">\n\t\t\t\t\t\t<img src="https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/src/assets/icon.png" alt="WikiShield Logo">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<h1>Welcome to <span id="wikishield-sikiwhield">WikiShield</span></h1>\n\t\t\t\t<div class="about-links">\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="about-link">About</a>\n\t\t\t\t\t<a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia talk:WikiShield" target="_blank" class="about-link">Discuss</a>\n\t\t\t\t\t<span class="about-link">v<span class="VERSION"></span></span>\n\t\t\t\t</div>\n\t\t\t\t<div id="rollback-needed" class="hidden">\n\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<p>You can apply for rollback rights <a rel="noopener" class="request-link" href="https://www.wikidata.org/wiki/Q7765871" target="_blank">here</a>.</p>\n\t\t\t\t</div>\n\t\t\t\t<button type="button" id="start-button">\n\t\t\t\t\tStart WikiShield <i class="fas fa-arrow-right"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n <div id="app" class="hidden">\n <div id="container">\n <div id="queue">\n <div id="queue-top">\n <div id="queue-top-left" class="queue-button-cluster" data-zen-show="alerts,messages">\n <span class="fa fa-bell" id="alerts-icon" data-tooltip="Alerts" data-zen-show="alerts">\n <span id="alerts-count" class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n <span class="fa fa-inbox" id="messages-icon" data-tooltip="Messages" data-zen-show="messages">\n <span id="messages-count" class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="DEFCON">\n <div class="dot"></div>\n <span><span class="DEFCON-RPM">0</span> RPM</span>\n </div>\n <div id="queue-top-right" class="queue-button-cluster">\n <span class="fa fa-envelope" id="email-button" data-tooltip="Email Emergency, ArbCom, or Oversight" data-multiple-hrefs="email" href></span>\n <span class="fa fa-gear" id="settings-icon" data-tooltip="Settings"></span>\n </div>\n </div>\n <div id="queue-tabs">\n <div id="queue-tab-recent" class="queue-tab selected" data-tooltip="Recent edits">\n <span class="fas fa-stopwatch">\n <span class="icon-count hidden gray" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-pending" class="queue-tab" data-tooltip="Pending edits">\n <span class="fas fa-flag">\n <span class="icon-count hidden orange" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-users" class="queue-tab" data-tooltip="User creation logs">\n <span class="fas fa-user">\n <span class="icon-count hidden green" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-watchlist" class="queue-tab" data-tooltip="Watchlist edits">\n <span class="fas fa-book-bookmark">\n <span class="icon-count hidden blue" data-zen-show="badges"></span>\n </span>\n </div>\n <div id="queue-tab-abuselog" class="queue-tab" data-tooltip="Abuse logs">\n <span class="fas fa-filter-circle-xmark">\n <span class="icon-count hidden red" data-zen-show="badges"></span>\n </span>\n </div>\n </div>\n <div id="queue-items" class="queue-list">\n <div class="queue-empty">\n No edits in queue.\n </div>\n </div>\n <div class="width-adjust" id="queue-width-adjust"></div>\n <div id="clear-queue">\n <span class="fa fa-trash"></span>\n </div>\n </div>\n <div id="alerts-panel" class="notification-panel">\n <div id="alerts-header" class="notification-header">\n <span>Alerts</span>\n <span id="mark-all-alerts-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="alerts-list" class="notification-list"></div>\n </div>\n <div id="messages-panel" class="notification-panel">\n <div id="messages-header" class="notification-header">\n <span>Messages</span>\n <span id="mark-all-messages-read" class="mark-all-read">Mark all as read</span>\n </div>\n <div id="messages-list" class="notification-list"></div>\n </div>\n <div id="right-container">\n <div id="right-content">\n <div id="main-container">\n <div id="edit-details">\n <div class="central">Nothing selected</div>\n </div>\n <div id="previous-item-button" class="nav-item-button">\n <i class="fas fa-chevron-left"></i>\n </div>\n <div id="next-item-button" class="nav-item-button">\n <i class="fas fa-chevron-right"></i>\n </div>\n <div id="ai-analysis-container" class="hidden shimmer shimmer-border">\n <div class="header">\n <i class="fas fa-robot"></i>\n <span class="title">AI Analysis</span>\n <span class="assessment"></span>\n <span class="confidence"></span>\n </div>\n <div class="explanation"></div>\n <div class="issues"></div>\n </div>\n <div id="diff-scroll-up" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-up"></i>\n </div>\n <div id="diff-container"></div>\n <div id="diff-scroll-down" class="diff-scroll-button hidden">\n <i class="fas fa-chevron-down"></i>\n </div>\n <div id="pending-changes-container" class="hidden">\n <div class="accept">Accept</div>\n <div class="reject">Reject</div>\n </div>\n <div id="progress-bar-container"></div>\n <div id="bottom-tools" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-item" data-menu="revert" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-undo"></i>\n <span>Revert</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="warn" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-exclamation-triangle"></i>\n <span>Warn</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="user" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-user"></i>\n <span>User</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="page" data-queue-type="edit,logevent,abuselog">\n <div class="bottom-tool-trigger">\n <i class="fas fa-file-lines"></i>\n <span>Page</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n\n <div class="bottom-tool-item" data-menu="edit" data-queue-type="edit">\n <div class="bottom-tool-trigger">\n <i class="fas fa-pen-to-square"></i>\n <span>Edit</span>\n <i class="fas fa-chevron-up bottom-tool-chevron"></i>\n </div>\n </div>\n </div>\n <div id="copy-link" data-tooltip="Copy link" data-queue-type="edit,logevent,abuselog">\n <div>\n <i class="fas fa-link"></i>\n </div>\n </div>\n </div>\n <div id="right-details">\n <div id="right-top">\n <div class="tabs">\n <div id="latest-edits-tab" class="tab hidden selected" data-tooltip="Latest edit">\n <i class="fas fa-user"></i>\n </div>\n <div id="consecutive-edits-tab" class="tab hidden" data-tooltip="Consecutive edits">\n <i class="fas fa-users"></i>\n </div>\n </div>\n\n <div class="icons"></div>\n </div>\n\n <div id="user-contributions" class="section" data-queue-type="edit,logevent,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-user-contributions" class="fas fa-rotate"></i> Contributions</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View all contributions</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div id="page-history" class="section" data-queue-type="edit,abuselog">\n <div class="header">\n <div class="title"><i id="refresh-page-history" class="fas fa-rotate"></i> Page History</div>\n <div class="pills">\n\n </div>\n </div>\n <div class="queue-list">\n\n </div>\n <div class="footer">\n <span>View full page history</span>\n <i class="fas fa-arrow-right"></i>\n </div>\n </div>\n\n <div class="width-adjust" id="details-width-adjust"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="bottom-tool-menu" id="revert-menu"></div>\n <div class="bottom-tool-menu" id="warn-menu"></div>\n <div class="bottom-tool-menu" id="user-menu">\n <div id="user-open-user-page" class="menu-option">\n <i class="fas fa-user-circle"></i>\n <span>Open user page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-open-user-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open user talk</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-contribs" class="menu-option">\n <i class="fas fa-list"></i>\n <span>View contributions</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="user-view-filter-log" class="menu-option">\n <i class="fas fa-filter"></i>\n <span>View filter log</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="user-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist user</span>\n </div>\n <div id="user-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist user</span>\n </div>\n <div id="user-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight user</span>\n </div>\n <div id="user-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight user</span>\n </div>\n <div class="menu-divider"></div>\n <div id="user-welcome" class="menu-option submenu-trigger">\n <i class="fas fa-paper-plane"></i>\n <span>Welcome</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-aiv" class="menu-option submenu-trigger">\n <i class="fas fa-flag"></i>\n <span>Report (AIV)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-report-uaa" class="menu-option submenu-trigger">\n <i class="fas fa-user-slash"></i>\n <span>Report (UAA)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-request-global-block" class="menu-option submenu-trigger">\n <i class="fas fa-ban"></i>\n <span>Request global block</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="user-request-global-lock" class="menu-option submenu-trigger">\n <i class="fas fa-lock"></i>\n <span>Request global lock</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="user-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>Message user</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="page-menu">\n <div id="page-open-page" class="menu-option">\n <i class="fas fa-file"></i>\n <span>Open page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-open-talk" class="menu-option">\n <i class="fas fa-comments"></i>\n <span>Open talk page</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="page-view-history" class="menu-option">\n <i class="fas fa-clock-rotate-left"></i>\n <span>View page history</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="page-watch" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>Watch page</span>\n </div>\n <div id="page-unwatch" class="menu-option">\n <i class="fas fa-eye-slash"></i>\n <span>Unwatch page</span>\n </div>\n <div id="page-whitelist" class="menu-option">\n <i class="fas fa-check"></i>\n <span>Whitelist page</span>\n </div>\n <div id="page-unwhitelist" class="menu-option hidden">\n <i class="fas fa-xmark"></i>\n <span>Unwhitelist page</span>\n </div>\n <div id="page-highlight" class="menu-option">\n <i class="fas fa-star"></i>\n <span>Highlight page</span>\n </div>\n <div id="page-unhighlight" class="menu-option hidden">\n <i class="fas fa-star"></i>\n <span>Unhighlight page</span>\n </div>\n <div class="menu-divider"></div>\n <div id="page-request-protection" class="menu-option submenu-trigger">\n <i class="fas fa-shield-halved"></i>\n <span>Request protection</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div class="menu-divider"></div>\n <div id="page-new-talk-topic" class="menu-option submenu-trigger">\n <i class="fas fa-envelope"></i>\n <span>New talk page topic</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n <div class="bottom-tool-menu" id="edit-menu">\n <div id="edit-view-revision" class="menu-option">\n <i class="fas fa-eye"></i>\n <span>View revision</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div id="edit-view-diff" class="menu-option">\n <i class="fas fa-code-compare"></i>\n <span>View diff</span>\n <i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n </div>\n <div class="menu-divider"></div>\n <div id="edit-thank-user" class="menu-option">\n <i class="fas fa-heart"></i>\n <span>Thank user</span>\n </div>\n <div id="edit-rollback" class="menu-option submenu-trigger">\n <i class="fas fa-rotate-left"></i>\n <span>Rollback</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-rollback-goodfaith" class="menu-option submenu-trigger">\n <i class="fas fa-handshake"></i>\n <span>Rollback (good faith)</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n <div id="edit-undo" class="menu-option submenu-trigger">\n <i class="fas fa-arrow-rotate-left"></i>\n <span>Undo</span>\n <i class="fas fa-chevron-right menu-option-chevron"></i>\n <div class="submenu"></div>\n </div>\n </div>\n\n <div id="settings-container">\n <div class="settings">\n <div class="settings-left">\n <div class="settings-category">\n <div class="settings-category-header">\n <span>CORE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-general-button">\n <span><i class="fas fa-gear"></i>General</span>\n </div>\n <div class="settings-left-menu-item" id="settings-audio-button">\n <span><i class="fas fa-volume-high"></i>Audio</span>\n </div>\n <div class="settings-left-menu-item" id="settings-controls-button">\n <span><i class="fas fa-keyboard"></i>Controls</span>\n </div>\n <div class="settings-left-menu-item" id="settings-zen-button">\n <span><i class="fas fa-spa"></i>Zen Mode</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>APPEARANCE</span>\n </div>\n <div class="settings-left-menu-item" id="settings-app-button">\n <span><i class="fas fa-palette"></i>App</span>\n </div>\n <div class="settings-left-menu-item" id="settings-queue-button">\n <span><i class="fas fa-list"></i>Queue</span>\n </div>\n <div class="settings-left-menu-item" id="settings-accessibility-button">\n <span><i class="fas fa-universal-access"></i>Accessibility</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>TOOLS</span>\n </div>\n <div class="settings-left-menu-item" id="settings-auto-reporting-button">\n <span><i class="fas fa-flag"></i>Auto Reporting</span>\n </div>\n <div class="settings-left-menu-item" id="settings-gadgets-button">\n <span><i class="fas fa-toolbox"></i>Gadgets</span>\n </div>\n <div class="settings-left-menu-item" id="settings-AI-button">\n <span><i class="fas fa-robot"></i>AI Analysis</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WHITELIST</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-whitelist-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-whitelist-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>HIGHLIGHT</span>\n </div>\n <div class="settings-left-menu-compact">\n <div class="settings-left-menu-item" id="settings-highlight-users-button">\n <i class="fas fa-user" title="Users"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-pages-button">\n <i class="fas fa-file" title="Pages"></i>\n </div>\n <div class="settings-left-menu-item" id="settings-highlight-tags-button">\n <i class="fas fa-tag" title="Tags"></i>\n </div>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>DATA</span>\n </div>\n <div class="settings-left-menu-item" id="settings-statistics-button">\n <span><i class="fas fa-chart-area"></i>Statistics</span>\n </div>\n <div class="settings-left-menu-item" id="settings-save-button">\n <span><i class="fas fa-floppy-disk"></i>Save</span>\n </div>\n </div>\n\n <div class="settings-category">\n <div class="settings-category-header">\n <span>WIKISHIELD</span>\n </div>\n <div class="settings-left-menu-item" id="settings-changelog-button">\n <span><i class="fas fa-file-alt"></i>Changelog</span>\n </div>\n <div class="settings-left-menu-item" id="settings-about-button">\n <span><i class="fas fa-info"></i>About</span>\n </div>\n </div>\n </div>\n <div class="settings-right">\n <div class="general hidden">\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum edit count</div>\n <div class="settings-section-desc">Edits from users with more than this number of total edits will not be shown unless that user is highlighted.</div>\n <numeric-input id="settings-maximum-edit-count" step="5" min="0" value="50"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Maximum queue size</div>\n <div class="settings-section-desc">Maximum number of edits to keep in the queue for review. Higher values may impact performance.</div>\n <numeric-input id="settings-maximum-queue-size" step="10" min="0" value="100"></numeric-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Minimum ORES score</div>\n <div class="settings-section-desc">Minimum ORES score required for an edit to appear in the recent changes queue.</div>\n <numeric-input id="settings-minimum-ores-score" step="0.05" min="0" max="1" value="0"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">ORES bias</div>\n <div class="settings-section-desc">\n Select how ORES scores are calculated for edits in the recent changes queue. "Badfaith" is how likely an edit is to be made in bad faith, "Damaging" is how likely an edit is to be damaging.\n </div>\n <div id="settings-ores-bias" class="settings-slider">\n <div class="settings-slider-labels">\n <div class="settings-slider-label-left active">Badfaith<span class="percent">50%</span></div>\n <div class="settings-slider-label-right active">Damaging<span class="percent">50%</span></div>\n </div>\n <div class="settings-slider-track">\n <div class="settings-slider-thumb"></div>\n </div>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Watchlist expiry</div>\n <div class="settings-section-desc">Amount of time to leave warned user\'s talk pages on your watchlist.</div>\n <duration-input id="settings-watchlist-expiry"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Namespaces to monitor</div>\n <div class="settings-section-desc">Select which namespaces WikiShield should monitor for recent changes and pending changes.</div>\n <div id="settings-namespaces-container" class="checkbox-container">\n \x3c!-- Namespace checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="audio hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">ORES</span>\n <span>ORES Alerts</span>\n </div>\n <div class="settings-section compact inline" id="sound-alert-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Sound alerts for high ORES scores</div>\n <div class="settings-section-desc">Play a sound when an edit above the threshold is added to the queue</div>\n </div>\n <toggle-input id="settings-ORES-alert-toggle" value="false"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="sound-alert-ores-score">\n <div class="settings-section-content">\n <div class="settings-section-title">ORES score threshold</div>\n <div class="settings-section-desc">Play a sound alert when an edit with an ORES score above this value is added</div>\n </div>\n <numeric-input id="settings-ORES-alert-threshold" step="0.05" min="0" max="1" value="0.9"></numeric-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Volume</div>\n <volume-control\n id="settings-master-volume"\n title="Master Volume"\n description="Controls the overall volume of all sounds"\n value="1"\n ></volume-control>\n <div id="settings-sounds-container" class="settings-section">\n \x3c!-- Individual sound settings will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="controls hidden">\n <div class="settings-section">\n <div class="settings-section-title">Keyboard shortcuts</div>\n <div class="settings-section-desc">Customize keyboard shortcuts for various actions in WikiShield.</div>\n <div class="settings-section compact inline" id="repeat-control-scripts">\n <div class="settings-section-content">\n <div class="settings-section-title">Repeat control scripts</div>\n <div class="settings-section-desc">Allow control scripts to be triggered repeatedly when holding down keys</div>\n </div>\n <toggle-input id="repeat-control-scripts-toggle" value="true"></toggle-input>\n </div>\n <button type="button" id="settings-new-control-script" class="add-action-button new-control-script"><span class="fa fa-plus"></span> Add new action</button>\n </div>\n </div>\n <div class="zen hidden">\n <div class="settings-section">\n <div class="settings-section-title">Zen Mode</div>\n <div class="settings-section-desc">Your distraction-free editing experience.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Zen Mode</div>\n <div class="settings-section-desc">Reduce on-screen distractions while reviewing edits.</div>\n </div>\n <toggle-input id="settings-zen-mode" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Customize Zen Mode</div>\n <div class="settings-compact-grid">\n <div class="settings-section compact">\n <div class="settings-section-title">Sound</div>\n <div class="settings-section-desc">Play sound in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-sound" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Music</div>\n <div class="settings-section-desc">Play background music in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-music" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Alerts</div>\n <div class="settings-section-desc">Show alerts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-alerts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Messages</div>\n <div class="settings-section-desc">Show messages in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-messages" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Toasts</div>\n <div class="settings-section-desc">Show toasts in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-toasts" value="true"></toggle-input>\n </div>\n <div class="settings-section compact">\n <div class="settings-section-title">Badges</div>\n <div class="settings-section-desc">Show badges in Zen Mode.</div>\n <toggle-input id="settings-zen-mode-badges" value="true"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="app hidden">\n <div class="settings-section" data-electron="false">\n <div class="settings-section-title">Launch behavior</div>\n <div class="settings-section-desc">Choose whether WikiShield should open inthe current tabor a new tab when launched.</div>\n <div id="settings-launch-behavior" class="settings-radio-group">\n <div class="settings-radio-option selected" data-value="current_tab">Open in current tab</div>\n <div class="settings-radio-option" data-value="new_tab">Open in new tab</div>\n </div>\n </div>\n \x3c!-- <div class="settings-section">\n <div class="settings-section-title">App theme</div>\n <div class="settings-section-desc">Choose between light mode, dark mode, or automatic switching based on system settings.</div>\n <div id="settings-app-theme" class="settings-radio-group">\n <div class="settings-radio-option" data-value="light">Light mode</div>\n <div class="settings-radio-option selected" data-value="auto">Auto</div>\n <div class="settings-radio-option" data-value="dark">Dark mode</div>\n </div>\n </div> --\x3e\n <div class="settings-section">\n <div class="settings-section-title">Startup animation</div>\n <div class="settings-section-desc">Enable or disable the startup animation when launching WikiShield.</div>\n <div id="settings-startup-performance" class="settings-radio-group">\n <div class="settings-radio-option" data-value="always_off">Always off</div>\n <div class="settings-radio-option selected" data-value="adaptive">Adaptive (recommended)</div>\n <div class="settings-radio-option" data-value="always_on">Always on</div>\n </div>\n </div>\n </div>\n <div class="queue hidden">\n <div class="settings-section">\n <div class="settings-section-title">Queues</div>\n <div class="settings-section-desc">Enable or disable different edit queues, and customize their order.</div>\n <draggable-order-list id="settings-queues">\n \x3c!-- Queue items will be populated here --\x3e\n </draggable-order-list>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Color palette</div>\n <div class="settings-section-desc">Select the color palette used for highlighting users and pages.</div>\n <div id="settings-palette-selector" class="palette-selector">\n\n </div>\n </div>\n </div>\n <div class="accessibility hidden">\n <div class="settings-section">\n <div class="settings-section-title">Accessibility Options</div>\n <div class="settings-section-desc">Customize accessibility features for better usability.</div>\n <div class="settings-compact-grid">\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">Colorblind Mode</div>\n <div class="settings-section-desc">Add indicators to help distinguish colors for colorblind users.</div>\n <toggle-input id="settings-colorblind-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Dyslexia Friendly Font</div>\n <div class="settings-section-desc">Use a font that is easier to read for users with dyslexia.</div>\n <toggle-input id="settings-dyslexia-font" value="false"></toggle-input>\n </div>\n \x3c!-- <div class="settings-section compact">\n <div class="settings-section-title">High Contrast Mode</div>\n <div class="settings-section-desc">Increase contrast for better visibility.</div>\n <toggle-input id="settings-high-contrast-mode" value="false"></toggle-input>\n </div> --\x3e\n <div class="settings-section compact">\n <div class="settings-section-title">Reduce Motion</div>\n <div class="settings-section-desc">Minimize motion effects for users sensitive to motion.</div>\n <toggle-input id="settings-reduce-motion" value="false"></toggle-input>\n </div>\n </div>\n </div>\n </div>\n\n <div class="auto-reporting hidden">\n <div class="settings-section">\n <div class="settings-section-title">Enable Auto Reporting</div>\n <div class="settings-section-desc">Automatically report edits that receive certain warnings.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Auto Reporting</div>\n <div class="settings-section-desc">When enabled, edits that trigger selected warnings will be automatically reported.</div>\n </div>\n <toggle-input id="settings-auto-reporting-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Auto Reporting Warnings</div>\n <div class="settings-section-desc">Select which warnings should trigger automatic reporting.</div>\n <div id="settings-auto-reporting-warnings-container" class="checkbox-container">\n \x3c!-- Warning checkboxes will be populated here --\x3e\n </div>\n </div>\n </div>\n <div class="gadgets hidden">\n <div class="settings-toggles-section">\n <div class="settings-section-title">Gadgets</div>\n <div class="settings-section-desc">Toggle various Wikishield features.</div>\n <div class="settings-section compact inline" id="auto-welcome-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Automatic welcoming of new users</div>\n <div class="settings-section-desc">Automatically welcome new users with empty talk pages when moving past their constructive edits</div>\n </div>\n <toggle-input id="settings-auto-welcome-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="wikipedia-popups-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Popups</div>\n <div class="settings-section-desc">When enabled, links will be opened in a new window. Otherwise, they will be opened in your default browser. (Not supported by Opera or Safari browsers)</div>\n </div>\n <toggle-input id="settings-wikipedia-popups-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="talk-page-thanks-for-temporary-users-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Send talk page thanks for temporary users</div>\n <div class="settings-section-desc">If enabled, when you thank a temporary user with an empty talk page, WikiShield will send them a welcoming thank you message in addition to the standard thank you message.</div>\n </div>\n <toggle-input id="settings-edit-summaries-toggle" value="true"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-title">Username Highlighting</div>\n <div class="settings-section compact inline" id="username-highlighting-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable username highlighting</div>\n <div class="settings-section-desc">Highlights usernames in edit summaries, edit diffs, and user creation logs.</div>\n </div>\n <toggle-input id="settings-username-highlighting-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline" id="username-highlighting-mode-toggle">\n <div class="settings-section-content">\n <div class="settings-section-title">Toggle fuzzy matching mode</div>\n <div class="settings-section-desc">\n When enabled, highlights similar usernames. Not recommended for users with short usernames.<br/>\n <strong>NOTE:</strong> This may cause performance issues for those with long usernames, or users on weaker devices.\n </div>\n </div>\n <toggle-input id="settings-username-highlighting-fuzzy-toggle" value="false"></toggle-input>\n </div>\n </div>\n </div>\n <div class="AI hidden">\n <div class="settings-section">\n <div class="settings-section-title">AI Analysis</div>\n <div class="settings-section-desc">Configure AI-powered analysis features.</div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Enable Ollama AI Analysis &lpar;<a href="https://ollama.com">ollama.com</a>&rpar;</div>\n <div class="settings-section-desc">Use local AI models with complete privacy.</div>\n </div>\n <toggle-input id="settings-AI-toggle" value="false"></toggle-input>\n </div>\n </div>\n <div class="settings-toggles-section">\n <div class="settings-section-header">\n <span class="settings-section-header-icon">Tools</span>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Edit Analysis</div>\n <div class="settings-section-desc">Suggests actions to take on edits.</div>\n </div>\n <toggle-input id="settings-AI-edit-analysis-toggle" value="true"></toggle-input>\n </div>\n <div class="settings-section compact inline">\n <div class="settings-section-content">\n <div class="settings-section-title">Username Analysis</div>\n <div class="settings-section-desc">Flags potentially problematic usernames and prompts you to report them to UAA</div>\n </div>\n <toggle-input id="settings-AI-username-analysis-toggle" value="true"></toggle-input>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-server-url">\n <div class="settings-section-title">Server URL</div>\n <div class="settings-section-desc">The URL of your local Ollama server</div>\n <div class="text-input-container">\n <input title="Ollama URL" type="text" id="ollama-url-input" autoComplete="off">\n <button type="button" id="settings-ollama-test-connection">Test Connection</button>\n </div>\n <div class="settings-section compact connection-status-container">\n <p id="settings-ollama-connection-status"></p>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-model-select">\n <div class="settings-section-title">\n Model Selection\n <button type="button" id="settings-ollama-refresh-models">\n <span class="fa fa-sync"></span> Refresh Models\n </button>\n </div>\n <div class="settings-section-desc">Select which Ollama model to use for edit analysis</div>\n <div class="settings-section compact models-container">\n <p id="settings-ollama-models-status">Click "Refresh Models" to load available models</p>\n <div id="settings-ollama-models"></div>\n </div>\n </div>\n\n <div class="settings-section" id="ollama-setup">\n <div class="settings-section-title">Setup required</div>\n <div class="settings-section-desc">\n <details>\n <summary><strong>Windows (Permanent)</strong></summary>\n <ol class="pad-list">\n <li>Press <code>Win + R</code>, type <code>sysdm.cpl</code>, and press Enter</li>\n <li>Go to the "Advanced" tab and click on "Environment Variables"</li>\n <li>Create a new variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_HOST</code> and the value to <code>http://127.0.0.11434</code>\n <ul class="pad-list">\n <li><strong>NOTE:</strong> You can change the port (11434) if that port is already in use, but make sure to update the "Server URL" setting in WikiShield accordingly</li>\n </ul>\n </li>\n <li>Click "OK" to save the variable</li>\n <li>Create another variable under "System variables"</li>\n <li>Set the name to <code>OLLAMA_ORIGINS</code> and the value to <code>https://*.wikipedia.org</code></li>\n <li>Click "OK" to save the variable, you can now close the Environment Variables and System Properties windows</li>\n <li>Restart Ollama</li>\n </ol>\n </details>\n\n <details>\n <summary><strong>Windows (Temporary)</strong></summary>\n <pre>\n$env:OLLAMA_HOST="http://127.0.0.11434"\n$env:OLLAMA_ORIGINS="https://*.wikipedia.org"\nollama serve</pre>\n </details>\n\n <details>\n <summary><strong>macOS / Linux</strong></summary>\n Add the following to <code>~/.bashrc</code> or <code>~/.zshrc</code>:\n <pre>\nexport OLLAMA_HOST="http://127.0.0.11434"\nexport OLLAMA_ORIGINS="https://*.wikipedia.org"</pre>\n Then run:\n <pre>source ~/.bashrc && ollama serve</pre>\n </details>\n </div>\n </div>\n </div>\n\n <div class="whitelist users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted users</div>\n <div class="settings-section-desc">Amount of time before a whitelisted user is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-users-expiry" label="Default expiry for whitelisted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Users</div>\n <div class="settings-section-desc">Manage your list of whitelisted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-users-input" placeholder="Add user to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-whitelist-users-list" class="settings-section list-container">\n \x3c!-- Whitelisted users will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted pages</div>\n <div class="settings-section-desc">Amount of time before a whitelisted page is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-pages-expiry" label="Default expiry for whitelisted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Pages</div>\n <div class="settings-section-desc">Manage your list of whitelisted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-pages-input" placeholder="Add page to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-whitelist-pages-list" class="settings-section list-container">\n \x3c!-- Whitelisted pages will be populated here --\x3e\n </div>\n </div>\n <div class="whitelist tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for whitelisted tags</div>\n <div class="settings-section-desc">Amount of time before a whitelisted tag is automatically removed from the whitelist.</div>\n <duration-input id="settings-whitelist-tags-expiry" label="Default expiry for whitelisted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Whitelisted Tags</div>\n <div class="settings-section-desc">Manage your list of whitelisted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-whitelist-tags-input" placeholder="Add tag to whitelist..." autocomplete="off"/>\n <button type="button" id="settings-whitelist-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-whitelist-tags-list" class="settings-section list-container">\n \x3c!-- Whitelisted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="highlight users hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted users</div>\n <div class="settings-section-desc">Amount of time before a highlighted user is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-users-expiry" label="Default expiry for highlighted users"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Users</div>\n <div class="settings-section-desc">Manage your list of highlighted users.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-users-input" placeholder="Add user to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-users-add-button">Add user</button>\n </div>\n </div>\n <div id="settings-highlight-users-list" class="settings-section list-container">\n \x3c!-- Highlighted users will be populated here --\x3e\n </div>\n </div>\n <div class="highlight pages hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted pages</div>\n <div class="settings-section-desc">Amount of time before a highlighted page is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-pages-expiry" label="Default expiry for highlighted pages"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Pages</div>\n <div class="settings-section-desc">Manage your list of highlighted pages.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-pages-input" placeholder="Add page to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-pages-add-button">Add page</button>\n </div>\n </div>\n <div id="settings-highlight-pages-list" class="settings-section list-container">\n \x3c!-- Highlighted pages will be populated here --\x3e\n </div>\n </div>\n <div class="highlight tags hidden">\n <div class="settings-section">\n <div class="settings-section-title">Expiry for highlighted tags</div>\n <div class="settings-section-desc">Amount of time before a highlighted tag is automatically removed from the highlight list.</div>\n <duration-input id="settings-highlight-tags-expiry" label="Default expiry for highlighted tags"></duration-input>\n </div>\n <div class="settings-section">\n <div class="settings-section-title">Highlighted Tags</div>\n <div class="settings-section-desc">Manage your list of highlighted tags.</div>\n <div class="text-input-container">\n <input type="text" id="settings-highlight-tags-input" placeholder="Add tag to highlight..." autocomplete="off"/>\n <button type="button" id="settings-highlight-tags-add-button">Add tag</button>\n </div>\n </div>\n <div id="settings-highlight-tags-list" class="settings-section list-container">\n \x3c!-- Highlighted tags will be populated here --\x3e\n </div>\n </div>\n\n <div class="statistics hidden">\n <div class="settings-section">\n <div class="settings-section-title">\n Statistics Overview\n <button type="button" id="reset-statistics-button">Reset Statistics</button>\n </div>\n <div class="stats-grid">\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-total-reviewed" class="stat-value"></div>\n <div class="stat-label">Edits Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have thanked <span id="stats-thanks-percentage"></span>% of the edits you reviewed\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-recent-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Recent Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n Recent changes make up <span id="stats-recent-changes-percentage"></span>% of your reviewed edits\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pending-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Pending Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n You have accepted <span id="stats-pending-changes-accepted"></span> &lpar;\n <span id="stats-pending-changes-accepted-percentage"></span>%\n &rpar; pending changes\n </div>\n <div class="stat-sublabel">\n You have rejected <span id="stats-pending-changes-rejected"></span> &lpar;\n <span id="stats-pending-changes-rejected-percentage"></span>%\n &rpar; pending changes from entering the public eye\n </div>\n <div class="stat-sublabel">\n Out of all the edits you&rsquo;ve reviewed, <span id="stats-pending-changes-percentage"></span>% of them were pending review\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-user-creations-reviewed" class="stat-value"></div>\n <div class="stat-label">User Creations Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-user-creations-percentage"></span>% of your reviews came from user creations\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-watchlist-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Watchlist Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-watchlist-changes-percentage"></span>% of your reviews came from your watchlist\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-abuselog-changes-reviewed" class="stat-value"></div>\n <div class="stat-label">Abuse Log Changes Reviewed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-abuselog-changes-percentage"></span>% of your reviews came from your abuse log\n </div>\n </div>\n </div>\n </div>\n\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reverts-made" class="stat-value"></div>\n <div class="stat-label">Reverts Made</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reverts-percentage"></span>% of edits that cross your path are reverted by you\n </div>\n <div class="stat-sublabel">\n You assumed good faith <span id="stats-goodfaith-reverts-percentage"></span>% of the time\n </div>\n <div class="stat-sublabel">\n <span id="stats-recent-reverts-percentage"></span>% of your reverts were from recent changes\n </div>\n <div class="stat-sublabel">\n <span id="stats-pending-reverts-percentage"></span>% of your reverts were pending\n </div>\n <div class="stat-sublabel">\n <span id="stats-watchlist-reverts-percentage"></span>% of your reverts were from your watchlist\n </div>\n <div class="stat-sublabel">\n <span id="stats-abuselog-reverts-percentage"></span>% of your reverts were from your abuse log\n </div>\n <div class="stat-sublabel">\n &hellip;and the last <span id="stats-other-reverts-percentage"></span>% weren&rsquo;t even in your queue!\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-users-welcomed" class="stat-value"></div>\n <div class="stat-label">Users Welcomed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-welcomed-message"></span>\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-warnings" class="stat-value"></div>\n <div class="stat-label">Warnings Issued</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-warning-1-percentage"></span>% were level 1\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-2-percentage"></span>% were level 2\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-3-percentage"></span>% were level 3\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4-percentage"></span>% were level 4\n </div>\n <div class="stat-sublabel">\n <span id="stats-warning-4im-percentage"></span>% were level 4im\n </div>\n <div class="stat-sublabel">\n &hellip;and the rest we were too lazy to track =&rpar;\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-reports" class="stat-value"></div>\n <div class="stat-label">Reports Filed</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n AIV accounted for <span id="stats-AIV-reports-percentage"></span>% of your reports\n </div>\n <div class="stat-sublabel">\n another <span id="stats-UAA-reports-percentage"></span>% were for UAA\n </div>\n <div class="stat-sublabel">\n <span id="stats-global-block-reports-percentage"></span>% were for global block requests\n </div>\n <div class="stat-sublabel">\n while <span id="stats-global-lock-reports-percentage"></span>% were for global lock requests\n </div>\n <div class="stat-sublabel">\n finally, <span id="stats-RFPP-reports-percentage"></span>% were posted at RFPP\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-pages-watched" class="stat-value"></div>\n <div class="stat-label">Pages Watched</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-pages-unwatched"></span> pages were annoying enough to be unwatched\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-whitelisted" class="stat-value"></div>\n <div class="stat-label">Items Whitelisted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-whitelisted"></span> &lpar;\n <span id="stats-users-whitelisted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-whitelisted"></span> &lpar;\n <span id="stats-pages-whitelisted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-whitelisted"></span> &lpar;\n <span id="stats-tags-whitelisted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-items-highlighted" class="stat-value"></div>\n <div class="stat-label">Items Highlighted</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-users-highlighted"></span> &lpar;\n <span id="stats-users-highlighted-percentage"></span>%\n &rpar; were users\n </div>\n <div class="stat-sublabel">\n <span id="stats-pages-highlighted"></span> &lpar;\n <span id="stats-pages-highlighted-percentage"></span>%\n &rpar; were pages\n </div>\n <div class="stat-sublabel">\n <span id="stats-tags-highlighted"></span> &lpar;\n <span id="stats-tags-highlighted-percentage"></span>%\n &rpar; were tags\n </div>\n </div>\n </div>\n </div>\n <div class="stat-card">\n <div class="inside shimmer shimmer-border">\n <div class="front">\n <div id="stats-session-time" class="stat-value"></div>\n <div class="stat-label">Session Time</div>\n </div>\n <div class="back">\n <div class="stat-sublabel">\n <span id="stats-reports-per-day"></span> reports per day\n </div>\n <div class="stat-sublabel">\n <span id="stats-reverts-per-hour"></span> reverts per hour\n </div>\n <div class="stat-sublabel">\n <span id="stats-reviews-per-minute"></span> reviews per minute\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class="save hidden">\n <div class="save settings-section">\n <div class="save-settings-header">\n <div class="settings-section-title">Save Settings</div>\n <div class="settings-section-desc">Manage how and where your WikiShield settings are stored.</div>\n </div>\n\n <div class="save-settings-content">\n <div class="save-settings-card data-management-card">\n <div class="card-header">\n <div class="card-icon">\n <i class="fa fa-database"></i>\n </div>\n <div class="card-header-content">\n <div class="card-title">Data Management</div>\n <div class="card-desc">Import, export, or reset your WikiShield settings. Settings are encoded as base64 for easy sharing.</div>\n </div>\n </div>\n\n <div class="card-body">\n <div class="action-buttons-grid">\n <button type="button" id="settings-export-button" class="action-card export-card">\n <div class="action-card-icon">\n <i class="fa fa-download"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Export Settings</div>\n <div class="action-card-desc">Save your configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-import-button" class="action-card import-card">\n <div class="action-card-icon">\n <i class="fa fa-upload"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Import Settings</div>\n <div class="action-card-desc">Load saved configuration</div>\n </div>\n </button>\n\n <button type="button" id="settings-reset-button" class="action-card reset-card">\n <div class="action-card-icon">\n <i class="fa fa-undo"></i>\n </div>\n <div class="action-card-content">\n <div class="action-card-title">Reset Settings</div>\n <div class="action-card-desc">Restore to defaults</div>\n </div>\n </button>\n </div>\n\n <div id="settings-save-status" class="status-message hidden"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class="changelog hidden">\n <div class="settings-section">\n <div class="changelog-content">\n\n </div>\n </div>\n </div>\n <div class="about hidden">\n <div class="settings-section">\n <div class="about-content">\n <div class="about-version">\n <span class="fa fa-shield-alt"></span>\n <span>WikiShield v<span id="settings-about-version"></span></span>\n </div>\n\n <div class="about-tagline">\n <p>A powerful, real-time patrolling tool for Wikipedia editors</p>\n </div>\n\n <div class="about-links">\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="link-card docs">\n <div class="link-card-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Documentation</div>\n <div class="link-card-desc">Learn how to use WikiShield</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://github.com/LuniZunie/WikiShield-App" target="_blank" class="link-card source">\n <div class="link-card-icon">\n <span class="fa fa-code-branch"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Source Code</div>\n <div class="link-card-desc">View on GitHub</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n <a rel="noopener" href="https://en.wikipedia.org/wiki/Wikipedia_talk:WikiShield" target="_blank" class="link-card feedback">\n <div class="link-card-icon">\n <span class="fa fa-comments"></span>\n </div>\n <div class="link-card-content">\n <div class="link-card-title">Feedback</div>\n <div class="link-card-desc">Share your thoughts</div>\n </div>\n <span class="fa fa-arrow-right link-card-arrow"></span>\n </a>\n </div>\n\n <div class="about-footer">\n <div class="footer-divider"></div>\n <div class="about-credits">\n <div>\n <div class="credit-card" data-link="https://about.luni.me">\n <div class="credit-icon">\n <span class="fa fa-code"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">LuniZunie</div>\n <div class="credit-role auto-scroll">Lead Developer</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Ingenuity">\n <div class="credit-icon">\n <span class="fa fa-lightbulb"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Ingenuity</div>\n <div class="credit-role auto-scroll">Original Creator</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Monkeysmashingkeyboards">\n <div class="credit-icon">\n <span class="fa fa-database"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Monkeysmashingkeyboards</div>\n <div class="credit-role auto-scroll">Backend</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:pro-anti-air">\n <div class="credit-icon">\n <span class="fa fa-book"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Pro-anti-air</div>\n <div class="credit-role auto-scroll">Documentation</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:Chaotic_Enby">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">Chaotic Enby</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n <div class="credit-card" data-link="https://en.wikipedia.org/wiki/User:HurricaneZeta">\n <div class="credit-icon">\n <span class="fa fa-paint-brush"></span>\n </div>\n <div class="credit-info">\n <div class="credit-name auto-scroll">HurricaneZeta</div>\n <div class="credit-role auto-scroll">Logo Design</div>\n </div>\n </div>\n </div>\n <div class="randomize">\n <div class="copyright-card" data-link="https://sound-effects.bbcrewind.co.uk">\n <div class="copyright-title auto-scroll">Nature sounds</div>\n <div class="copyright-desc auto-scroll">bbc.co.uk &ndash; &copy; copyright 2026 BBC</div>\n </div>\n <div class="copyright-card" data-link="https://pixabay.com/sound-effects">\n <div class="copyright-title auto-scroll">Sound effects</div>\n <div class="copyright-desc auto-scroll">pixabay.com &ndash; CC0 License</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </body>\n</html>'},2459(e){e.exports="@keyframes startup {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes particles {\n\t0%, 100% {\n\t\ttransform: translate(0, 0) rotate(0deg);\n\t}\n\t33% {\n\t\ttransform: translate(30px, -30px) rotate(120deg);\n\t}\n\t66% {\n\t\ttransform: translate(-20px, 20px) rotate(240deg);\n\t}\n}\n\n@keyframes container-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(30px) scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0) scale(1);\n\t}\n}\n\n@keyframes border-glow {\n\t0%, 100% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 40px rgba(102, 126, 234, .4),\n\t\t\t0 0 80px rgba(240, 147, 251, .3),\n\t\t\tinset 0 0 60px rgba(102, 126, 234, .15),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .2);\n\t}\n\t50% {\n\t\tbox-shadow:\n\t\t\t0 20px 60px rgba(0, 0, 0, .5),\n\t\t\t0 0 60px rgba(240, 147, 251, .6),\n\t\t\t0 0 120px rgba(102, 126, 234, .4),\n\t\t\tinset 0 0 80px rgba(240, 147, 251, .2),\n\t\t\tinset 0 1px 0 rgba(255, 255, 255, .3);\n\t}\n}\n\n@keyframes shield-entrance {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: scale(0) rotate(-180deg);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: scale(1.15) rotate(10deg);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: scale(1) rotate(0deg);\n\t}\n}\n\n@keyframes shield-float {\n\t0%, 100% {\n\t\ttransform: translate(-50%, -50%) translateY(0px);\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) translateY(-10px);\n\t}\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: translate(-50%, -50%) scale(.8);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: translate(-50%, -50%) scale(1);\n\t\topacity: 0.8;\n\t}\n\t100% {\n\t\ttransform: translate(-50%, -50%) scale(1.5);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes sparkle {\n\t0%, 100% {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\t50% {\n\t\ttransform: scale(1.5);\n\t\topacity: 1;\n\t}\n}\n\n@keyframes title-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-20px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes links-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes warning-fade-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: scale(.95);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes button-slide-in {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(40px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n\n@keyframes fade-in {\n\tfrom {\n\t\topacity: 0;\n\t}\n\tto {\n\t\topacity: 1;\n\t}\n}\n@keyframes fade-out {\n\tfrom {\n\t\topacity: 1;\n\t}\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-in {\n\tfrom {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n}\n@keyframes scale-out {\n\tfrom {\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\t}\n\tto {\n\t\ttransform: scale(0);\n\t\topacity: 0;\n\t}\n}\n\n@keyframes scale-x {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n}\n\n@keyframes bottom-tool-menu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateY(10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n}\n@keyframes bottom-tool-submenu-enter {\n\tfrom {\n\t\topacity: 0;\n\t\ttransform: translateX(-10px);\n\t}\n\tto {\n\t\topacity: 1;\n\t\ttransform: translateX(0);\n\t}\n}\n\n@keyframes toast-alert-enter {\n\t0% {\n\t\topacity: 0;\n\t\ttransform: translateX(100%) scale(.8);\n\t}\n\t60% {\n\t\topacity: 1;\n\t\ttransform: translateX(-10px) scale(1.05);\n\t}\n\t100% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n}\n@keyframes toast-alert-leave {\n\t0% {\n\t\topacity: 1;\n\t\ttransform: translateX(0) scale(1);\n\t}\n\t100% {\n\t\topacity: 0;\n\t\ttransform: translateX(150%) scale(.7);\n\t}\n}\n\n@keyframes music-toast-enter {\n from {\n opacity: 0;\n transform: translateX(150%);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes music-toast-leave {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(150%);\n }\n}\n\n@keyframes tooltip-enter {\n from {\n\t\ttransform: scale(.8);\n\t}\n\tto {\n\t\ttransform: scale(1);\n\t}\n}\n\n@keyframes star-spin {\n 0% {\n transform: rotate(0deg) scale(1);\n }\n 50% {\n transform: rotate(180deg) scale(1.3);\n }\n 100% {\n transform: rotate(360deg) scale(1);\n }\n}\n\n@keyframes flash-highlight {\n 0%, 100% {\n filter: brightness(1);\n }\n 50% {\n filter: brightness(.5);\n }\n}\n\n@keyframes logo-loader {\n 0%, 100% {\n transform: scale(1);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 10px rgba(102, 126, 234, .4));\n }\n 50% {\n transform: scale(1.5);\n\n /* Theme dependent */\n filter: drop-shadow(0 0 20px rgba(102, 126, 234, .6));\n }\n}\n\n@keyframes refresh-rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse-DEFCON {\n 0% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.15);\n }\n 100% {\n transform: scale(1);\n }\n}\n\nbody {\n --transparency: 1;\n\n font-size: clamp(14px, 3vw, 16px);\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n background: rgba(20, 20, 30, 1);\n\n &.dyslexia-font {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n\n *:not(.fa):not(.fas):not(.far):not(.fal):not(.fab) {\n font-family: \"Open-Dyslexic\", system-ui, -apple-system, \"Segoe UI\", sans-serif;\n }\n }\n\n &.reduce-motion * {\n animation-duration: 0.001s !important;\n transition-duration: 0.001s !important;\n }\n\n & a {\n text-decoration: none;\n\n &:active {\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n }\n }\n\n & > #popup-blocker {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 1);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease;\n }\n\n & > #loading {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 2);\n\n opacity: 1;\n\n transition: opacity .5s ease;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n & > .icon {\n width: 100vmin;\n }\n }\n\n & > .icon {\n aspect-ratio: 1 / 1;\n width: 12.5vmin;\n\n animation: logo-loader 2s ease-in-out infinite;\n\n transition: width .5s cubic-bezier(0.6, -0.28, 0.735, 0.045);\n }\n }\n\n & > #initial {\n display: flex;\n align-items: center;\n\t justify-content: center;\n\n width: 100%;\n height: 100%;\n\n position: relative;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: rgba(20, 20, 30, 1);\n\n &.hidden {\n display: none;\n }\n\n &:before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 0;\n background:\n radial-gradient(circle at 20% 50%, rgba(102, 126, 234, .08) 0%, transparent 50%),\n radial-gradient(circle at 80% 80%, rgba(118, 75, 162, .06) 0%, transparent 50%);\n pointer-events: none;\n }\n\n &:not(.hidden) {\n animation: startup 1.2s ease-out;\n\n & > #welcome-container {\n animation: container-fade-in 1.2s ease-out;\n\n & > .shield-container {\n animation: shield-entrance 1.5s ease 2s forwards;\n }\n\n & > h1 {\n animation: title-fade-in 0.8s ease-out 0.5s both;\n }\n\n & > .about-links {\n animation: link-slide-in 0.8s ease-out 0.7s both;\n }\n\n & > #rollback-needed {\n animation: warning-fade-in 1s ease-out 0.7s both;\n }\n\n & > button {\n animation: button-slide-in 2s ease-out 1s both;\n }\n }\n }\n\n & > #dots-canvas {\n width: 100%;\n height: 100%;\n\n position: absolute;\n z-index: 0;\n left: 0;\n top: 0;\n }\n\n & > #welcome-container {\n padding: 48px;\n\n border-radius: 16px;\n\n max-width: 480px;\n\n position: relative;\n z-index: 2;\n\n text-align: center;\n\n overflow: hidden;\n\n /* Theme dependent */\n border: 1px solid rgba(143, 163, 255, .15);\n box-shadow:\n 0 12px 40px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & * {\n position: relative;\n z-index: 1;\n }\n\n & > .shield-container {\n width: 100px;\n height: 100px;\n\n position: relative;\n\n margin: 0 auto 24px;\n\n opacity: 0;\n\n & > .glow-ring {\n width: 240px;\n height: 240px;\n\n position: absolute;\n left: 50%;\n top: 50%;\n\n border: 2px solid;\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: pulse 2.5s ease-in-out infinite;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n &:nth-child(2) {\n animation-delay: 0.4s;\n border-color: rgba(118, 75, 162, .25);\n }\n &:nth-child(3) {\n animation-delay: 0.8s;\n border-color: rgba(143, 163, 255, .2);\n }\n }\n\n & > .sparkle {\n width: 5px;\n height: 5px;\n\n position: absolute;\n\n border-radius: 50%;\n\n animation: sparkle 2s ease-in-out infinite;\n\n &:nth-child(4) {\n top: 15%;\n left: 25%;\n\n animation-delay: 0s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .6);\n box-shadow: 0 0 8px rgba(143, 163, 255, .6);\n }\n &:nth-child(5) {\n top: 25%;\n left: 18%;\n\n animation-delay: 0.4s;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .6);\n box-shadow: 0 0 8px rgba(102, 126, 234, .6);\n }\n &:nth-child(6) {\n bottom: 20%;\n\t left: 30%;\n\n animation-delay: 0.8s;\n\n /* Theme dependent */\n background: rgba(118, 75, 162, .5);\n box-shadow: 0 0 8px rgba(118, 75, 162, .5);\n }\n &:nth-child(7) {\n bottom: 25%;\n right: 25%;\n\n animation-delay: 1.2s;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .5);\n box-shadow: 0 0 8px rgba(143, 163, 255, .5);\n }\n }\n\n & > .shield-icon {\n width: 100px;\n\n position: absolute;\n z-index: 2;\n left: 50%;\n top: 50%;\n\n transform: translate(-50%, -50%);\n\n animation: shield-float 3s ease-in-out infinite;\n\n /* Theme dependent */\n filter: drop-shadow(0 0 8px rgba(102, 126, 234, .3));\n\n & > img {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 2.2em;\n font-weight: 700;\n line-height: 1.2;\n\n /* Theme dependent */\n color: rgba(241, 245, 255, 1);\n }\n\n & > .subtitle {\n margin: 0 0 24px 0;\n\n font-size: 0.95em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 0.8);\n }\n\n & > .about-links {\n display: flex;\n justify-content: center;\n gap: 12px;\n flex-wrap: wrap;\n\n margin: 24px 0;\n\n & > .about-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n padding: 8px 14px;\n\n border: 1px solid;\n border-radius: 8px;\n\n font-size: 0.85em;\n font-weight: 500;\n text-decoration: none;\n\n transition: background .2s ease,\n transform .2s ease,\n color .2s ease,\n border-color .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 0.9);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .2);\n }\n }\n }\n\n & > #rollback-needed {\n margin: 20px 0;\n padding: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(247, 76, 60, .3);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n\t\t inset 0 1px 0 rgba(255, 255, 255, .05);\n background: rgba(247, 76, 60, .08);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n display: none;\n }\n\n & p {\n margin: 6px 0;\n\n font-weight: 400;\n font-size: 0.9em;\n\n /* Theme dependent */\n color: rgba(247, 76, 60, 0.95);\n }\n & a {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n & > button {\n cursor: pointer;\n\n width: 100%;\n\n padding: 12px 24px;\n\n border: 2px solid transparent;\n border-radius: 10px;\n\n position: relative;\n\n font-size: 1em;\n font-weight: 700;\n color: rgba(143, 163, 255, 1);\n letter-spacing: 0.5px;\n\n overflow: hidden;\n\n opacity: 1;\n\n transition: all .25s ease;\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.8), rgba(118, 75, 162, 0.8)) border-box;\n box-shadow:\n 0 0 10px rgba(102, 126, 234, .6),\n 0 0 20px rgba(118, 75, 162, .3),\n inset 0 0 10px rgba(102, 126, 234, .1);\n\n &.hidden {\n display: none;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(160, 180, 255, 1);\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 75, 162, 1)) border-box;\n box-shadow:\n 0 0 15px rgba(102, 126, 234, .8),\n 0 0 30px rgba(118, 75, 162, .5),\n inset 0 0 15px rgba(102, 126, 234, .2);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n background:\n linear-gradient(rgba(20, 20, 30, 1), rgba(20, 20, 30, 1)) padding-box,\n linear-gradient(135deg, rgba(102, 126, 234, 0.7), rgba(118, 75, 162, 0.7)) border-box;\n box-shadow:\n 0 0 8px rgba(102, 126, 234, .5),\n 0 0 16px rgba(118, 75, 162, .3),\n inset 0 0 8px rgba(102, 126, 234, .1);\n }\n\n &::before {\n content: \"\";\n\n width: 100%;\n height: 100%;\n\n position: absolute;\n left: -100%;\n top: 0;\n\n transition: left .4s ease;\n\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1),\n transparent\n );\n }\n\n & > i {\n margin-right: 6px;\n font-size: 14px;\n transition: transform 0.3s ease;\n }\n\n &:hover > i {\n transform: translateX(2px);\n }\n }\n }\n }\n\n & > #app {\n width: 100%;\n height: 100%;\n\n line-height: 1.5;\n color: var(--body-color);\n\n overflow: hidden;\n\n background: var(--body-background);\n\n &.hidden {\n display: none;\n }\n\n & > #container {\n display: flex;\n width: 100%;\n height: 100%;\n\n margin: 0;\n\n overflow: hidden;\n\n & > #queue {\n width: 15vw;\n height: 100%;\n\n position: relative;\n\n border-right: 1px solid;\n\n /* Theme dependent */\n border-right-color: rgba(58, 61, 74, 1);\n\n & > #queue-top {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 69px;\n\n position: relative;\n z-index: 2;\n\n border-bottom: 2px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 8px;\n\n padding: 10px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-button-cluster {\n display: flex;\n align-items: center;\n gap: 20px;\n\n padding: 10px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n font-size: 1.2em;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .fa {\n position: relative;\n }\n\n & > span {\n cursor: pointer;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > #DEFCON {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n padding: 4px 14px;\n\n border: 1px solid;\n border-radius: 14px;\n\n /* Theme dependent */\n border-color: rgba(143, 143, 255, .2);\n background: rgba(143, 143, 255, .1);\n\n & > .dot {\n flex: 0 0 auto;\n\n width: 10px;\n height: 10px;\n\n border-radius: 50%;\n\n animation: pulse-DEFCON 2s ease-in-out infinite;\n\n /* Theme dependent */\n background: rgba(100, 100, 100, 1);\n box-shadow: 0 0 0 4px rgba(100, 100, 100, .15);\n\n &.DEFCON-1 {\n background: rgba(255, 75, 75, 1);\n box-shadow: 0 0 0 4px rgba(255, 75, 75, .3);\n }\n &.DEFCON-2 {\n background: rgba(255, 165, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 165, 0, .3);\n }\n &.DEFCON-3 {\n background: rgba(255, 255, 0, 1);\n box-shadow: 0 0 0 4px rgba(255, 255, 0, .3);\n }\n &.DEFCON-4 {\n background: rgba(75, 255, 75, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 75, .3);\n }\n &.DEFCON-5 {\n background: rgba(75, 255, 255, 1);\n box-shadow: 0 0 0 4px rgba(75, 255, 255, .3);\n }\n }\n\n & > span {\n overflow: auto hidden;\n\n white-space: nowrap;\n font-size: 13px;\n font-weight: 500;\n }\n }\n }\n\n & > #queue-tabs {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-around;\n gap: 8px;\n\n position: relative;\n z-index: 2;\n\n border-radius: 0 0 12px 12px;\n padding: 10px 12px;\n\n overflow: hidden;\n\n /* Theme dependent */\n background: transparent;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .queue-tab {\n cursor: pointer;\n\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n\n position: relative;\n\n border-radius: 50%;\n padding: 8px 14px;\n\n font-size: 1.4em;\n\n transition: transform .18s ease,\n color .18s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .85);\n\n &::after {\n content: \"\";\n\n height: 3px;\n\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n\n border-radius: 2px;\n\n transform: scaleX(0);\n\n transition: transform .22s cubic-bezier(.2, .9, .27, 1);\n\n /* Theme dependent */\n opacity: .95;\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, 1),\n rgba(118, 75, 162, 1)\n );\n }\n\n &:hover, &:focus-visible {\n transform: translateY(-2px);\n }\n\n &:not(.selected).mentions-me::after {\n animation: scale-x 1s ease-in-out infinite;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(244, 196, 32, 1),\n rgba(255, 107, 107, 1)\n );\n }\n\n &.selected {\n transform: translateY(-2px);\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n &::after {\n transform: scaleX(1);\n }\n }\n\n &.hidden {\n display: none;\n }\n\n & > .fas {\n position: relative;\n }\n }\n }\n\n & > .queue-list {\n height: calc(100% - 60px);\n\n position: relative;\n top: -60px;\n\n padding-top: 60px;\n padding-bottom: 10px;\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n right: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > #clear-queue {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-container {\n display: flex;\n flex-wrap: wrap;\n width: calc(100% - 15vw);\n\n & > #right-content {\n display: flex;\n width: 100%;\n height: 100%;\n\n & > #main-container {\n display: flex;\n flex-direction: column;\n gap: 0px;\n width: calc(100% - 15vw);\n height: 100%;\n\n padding-top: 69px;\n\n position: relative;\n\n & > #edit-details {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 4px;\n\n width: calc(100% - 20vmin);\n height: 69px;\n\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-top: none;\n border-radius: 8px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease;\n\n /* Theme dependent */\n background: rgba(30, 34, 45, 1);\n border-color: rgba(143, 163, 255, .2);\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, .2),\n inset 0 1px 0px rgba(255, 255, 255, .05);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .central {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n flex: 1;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: 1em;\n\n & > .page-title {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(119, 166, 215, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n\n & > a {\n color: inherit;\n\n white-space: nowrap;\n text-overflow: ellipsis;\n\n overflow: hidden;\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > a {\n color: inherit;\n }\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: calc(1rem + 4px);\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n\n & > .subheader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: .75rem;\n\n width: 100%;\n\n font-size: .9em;\n\n & > .item-comment {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n &.none {\n opacity: .6;\n }\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n white-space: nowrap;\n\n overflow: auto hidden;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: .85rem;\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px 8px;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .8em;\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--diff-color);\n border-color: color-mix(in srgb, var(--diff-color) 20%, transparent);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .nav-item-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 41px;\n height: 41px;\n\n position: absolute;\n top: 14px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: 0;\n }\n\n &#previous-item-button {\n left: calc(5vmin - calc(41px / 2));\n }\n &#next-item-button {\n right: calc(5vmin - calc(41px / 2));\n }\n\n & > i {\n font-size: 16px;\n }\n }\n\n & > #ai-analysis-container {\n flex-shrink: 0;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 12px;\n margin-bottom: 0;\n padding: 10px;\n\n overflow: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .2);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3),\n inset 0 1px 0px rgba(255, 255, 255, .08),\n inset 0 -1px 0px rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(30, 34, 45, .7),\n rgba(25, 25, 36, .5)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n align-items: center;\n gap: 6px;\n\n margin-bottom: 8px;\n\n & > .fa {\n font-size: 1.1em;\n }\n\n & > .title {\n font-size: .95em;\n letter-spacing: .3px;\n }\n\n & > .assessment {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .8em;\n font-weight: 700;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.review {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.suspicious {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.bad {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n &.error {\n /* Theme dependent */\n background: rgba(158, 158, 158, .25);\n }\n }\n\n & > .confidence {\n border-radius: 6px;\n padding: 3px 8px;\n\n font-size: .75em;\n font-weight: 600;\n }\n }\n\n & > .explanation {\n border-left: 3px solid;\n\n border-radius: 4px;\n margin-bottom: 6px;\n padding: 6px 8px;\n\n font-size: .8em;\n line-height: 1.3;\n\n /* Theme dependent */\n border-left-color: rgba(143, 163, 255, .4);\n }\n\n & > .issues {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n\n & > .issue {\n border-radius: 6px;\n padding: 4px 10px;\n\n font-size: .75em;\n font-weight: 600;\n\n &.low {\n /* Theme dependent */\n background: rgba(76, 175, 80, .25);\n }\n &.medium {\n /* Theme dependent */\n background: rgba(255, 193, 7, .25);\n }\n &.high {\n /* Theme dependent */\n background: rgba(244, 67, 54, .25);\n }\n &.critical {\n /* Theme dependent */\n background: rgba(211, 47, 47, .25);\n }\n }\n }\n }\n\n & > .notice {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 8px;\n\n border-left: 4px solid;\n border-radius: 4px;\n\n margin: 10px;\n padding: 8px 12px;\n\n font-size: .9em;\n\n &.edit-war {\n /* Theme dependent */\n color: rgba(120, 27, 20, 1);\n border-left-color: rgba(247, 50, 20, 1);\n background: rgba(255, 205, 199, 1);\n }\n\n &.outdated {\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-left-color: rgba(255, 193, 7, 1);\n background: rgba(255, 243, 205, 1);\n\n &.pending {\n /* Theme dependent */\n color: rgba(12, 84, 96, 1);\n border-left-color: rgba(23, 162, 184, 1);\n background: rgba(209, 236, 241, 1);\n }\n }\n\n & > .text {\n flex: 1;\n }\n\n & > .button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .85em;\n font-weight: 600;\n white-space: nowrap;\n text-decoration: none;\n\n transition: color .2s ease,\n border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n color: rgba(102, 77, 3, 1);\n border-color: rgba(255, 193, 7, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .1);\n\n background: rgba(255, 235, 159, .45);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > i {\n font-size: 14px;\n\n transition: transform .3s ease;\n }\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n color: rgba(80, 60, 0, 1);\n border-color: rgba(255, 193, 7, .6);\n box-shadow: 0 4px 16px rgba(255, 193, 7, .25);\n\n background: rgba(255, 235, 159, .65);\n\n & > i {\n transform: translateX(3px);\n\n &.restore {\n transform: rotateZ(180deg);\n }\n }\n }\n }\n }\n\n & > .diff-scroll-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n left: 8px;\n z-index: 2;\n\n border-radius: 50%;\n border: 1px solid;\n\n opacity: 1;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > i {\n font-size: 16px;\n }\n\n &#diff-scroll-up {\n top: 77px;\n }\n &#diff-scroll-down {\n bottom: 8px;\n }\n }\n\n & > #diff-container {\n flex: 1;\n\n padding: 12px;\n\n scroll-behavior: smooth;\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(20, 22, 28, .3),\n transparent\n );\n\n & > .loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n height: 100%;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n & > .loading-spinner {\n margin-bottom: 24px;\n\n font-size: 56px;\n\n animation: logo-loader 2s ease-in-out infinite;\n }\n\n & > .loading-text {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n text-align: center;\n font-weight: 500;\n letter-spacing: .3px;\n\n /* Theme dependent */\n color: rgba(160, 170, 200, 1);\n }\n }\n\n & > table {\n width: 100%;\n\n border: 1px solid;\n border-collapse: separate;\n border-spacing: 0;\n\n border-radius: 14px;\n margin-bottom: 24px;\n\n overflow: hidden;\n\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: .8em;\n line-height: 1.6;\n vertical-align: baseline;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0px rgba(255, 255, 255, .1),\n inset 0 -1px 0px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(143, 163, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(35, 40, 52, .5),\n rgba(30, 35, 48, .4)\n );\n -webkit-backdrop-filter: blur(16px) saturate(110%);\n backdrop-filter: blur(16px) saturate(110%);\n\n & > tbody {\n .mw-diff-movedpara-left, .mw-diff-movedpara-right {\n text-decoration: none;\n }\n\n & > tr {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease;\n\n &:hover {\n & > td {\n /* Theme dependent */\n background: rgba(143, 163, 255, .12);\n }\n }\n\n &:not(.diff-addedline, .diff-deletedline) {\n & > td {\n /* Theme dependent */\n background: rgba(255, 255, 255, .02);\n }\n }\n\n .flash-highlight {\n animation: flash-highlight 1s ease-out infinite;\n }\n\n & > td {\n border: none;\n\n overflow-wrap: anywhere;\n\n transition: background .25s ease,\n color .25s ease;\n\n &:not(.diff-marker) {\n width: 50%;\n\n padding: 10px 14px;\n\n transition: background .25s ease;\n\n /* Theme dependent */\n color: rgba(200, 210, 230, 1);\n }\n\n &.diff-lineno {\n -webkit-user-select: none;\n user-select: none;\n\n border-bottom: 1px solid;\n\n padding: 10px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-align: center;\n letter-spacing: .6px;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .12),\n rgba(158, 115, 212, .08)\n );\n }\n\n &.diff-marker {\n -webkit-user-select: none;\n user-select: none;\n\n width: 40px;\n\n border-right: 1px solid;\n\n padding: 10px 8px;\n\n font-weight: 700;\n text-align: center;\n\n /* Theme dependent */\n border-right-color: rgba(143, 163, 255, .15);\n\n color: rgba(160, 170, 200, .9);\n\n background: linear-gradient(90deg,\n rgba(40, 45, 60, .3),\n rgba(35, 40, 52, .2)\n );\n\n &::before {\n content: attr(data-marker);\n }\n }\n\n &.diff-empty {\n /* Theme dependent */\n background: rgba(20, 25, 35, .3);\n }\n\n &:is(.diff-addedline, .diff-deletedline) {\n position: relative;\n\n border-left: 4px solid;\n\n transition: background .25s ease,\n border-left-color .25s ease,\n box-shadow .25s ease;\n\n &.diff-addedline {\n /* Theme dependent */\n border-left-color: rgba(76, 175, 80, .9);\n\n background: rgba(76, 175, 80, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(129, 199, 132, 1);\n background: rgba(129, 199, 132, .18);\n box-shadow: inset 0 0 12px rgba(76, 175, 80, .15);\n }\n }\n &.diff-deletedline {\n /* Theme dependent */\n border-left-color: rgba(244, 67, 54, .9);\n\n background: rgba(244, 67, 54, .12);\n\n transition: background .25s ease;\n\n &:hover {\n /* Theme dependent */\n border-left-color: rgba(255, 112, 97, 1);\n background: rgba(255, 112, 97, .18);\n box-shadow: inset 0 0 12px rgba(244, 67, 54, .15);\n }\n }\n }\n\n & > div {\n & > :is(ins, del) {\n border-radius: 6px;\n padding: 2px 6px;\n\n font-weight: 600;\n text-decoration: none;\n\n transition: background .25s ease,\n transform .15s ease;\n }\n\n & > ins {\n /* Theme dependent */\n background: rgba(130, 169, 26, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(139, 195, 74, .6);\n\n transform: scale(1.08);\n }\n }\n & > del {\n /* Theme dependent */\n background: rgba(244, 67, 54, .55);\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 112, 97, .6);\n\n transform: scale(1.08);\n }\n }\n }\n\n a {\n text-decoration: none;\n\n /* Theme dependent */\n color: rgba(107, 163, 216, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n text-decoration: underline;\n }\n }\n }\n }\n }\n }\n }\n\n & > #pending-changes-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n\n position: fixed;\n left: 50%;\n bottom: 63px;\n z-index: 2;\n\n transform: translateX(-50%);\n\n &.hidden {\n display: none;\n }\n\n & > :is(.accept, .reject) {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n gap: 8px;\n\n border: 1px solid;\n\n border-radius: 10px 10px 0 0;\n padding: 8px 12px;\n\n font-size: .95em;\n font-weight: 600;\n line-height: 1;\n text-decoration: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease,\n border-color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.accept {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .14);\n box-shadow: 0 10px 26px rgba(46, 125, 50, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(46, 125, 50, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(46, 125, 50, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n &.reject {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .14);\n box-shadow: 0 10px 26px rgba(155, 40, 34, .12),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .15)\n );\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n box-shadow: 0 14px 30px rgba(155, 40, 34, .2),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n }\n &:active {\n /* Theme dependent */\n box-shadow: 0 6px 20px rgba(155, 40, 34, .1),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n }\n }\n }\n }\n\n & > #progress-bar-container {\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-direction: column;\n\n position: absolute;\n top: 0px;\n bottom: 56px;\n right: 0px;\n\n padding: 0;\n\n overflow: hidden;\n\n & > .progress-bar {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 180px;\n height: 32px;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 16px;\n margin-bottom: 10px;\n margin-right: 10px;\n\n overflow: hidden;\n\n font-size: .85em;\n font-weight: 400;\n\n opacity: 1;\n\n transition: width .3s ease,\n opacity .3s ease,\n border-color .3s ease,\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .1),\n rgba(158, 115, 212, .1)\n );\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.error {\n /* Theme dependent */\n border-color: rgba(239, 68, 68, .8);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .15),\n 0 2px 4px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .1),\n rgba(220, 38, 38, .1)\n );\n\n & > .progress-bar-overlay {\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(255, 68, 68, .6),\n rgba(220, 38, 38, .6)\n );\n }\n }\n\n & > .progress-bar-overlay {\n width: 0;\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 16px;\n\n transition: width .4s cubic-bezier(.4, 0, .2, 1),\n box-shadow .4s cubic-bezier(.4, 0, .2, 1),\n background .4s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n box-shadow: inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .6),\n rgba(158, 115, 212, .6)\n );\n }\n\n & > .progress-bar-text {\n max-width: 100%;\n\n position: relative;\n\n padding: 0 12px;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .2);\n\n color: rgba(255, 255, 255, 1);\n }\n }\n }\n\n & > #bottom-tools {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n\n max-width: calc(100% - 20vmin);\n width: fit-content;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 8px;\n z-index: 2;\n\n margin-inline: auto;\n\n border: 1px solid;\n border-radius: 16px;\n\n padding: 8px;\n\n overflow: auto hidden;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > .bottom-tool-item {\n position: relative;\n\n white-space: nowrap;\n\n transition: opacity .2s ease;\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n\n & > .bottom-tool-trigger {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease;\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.active {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n\n & > .bottom-tool-chevron {\n transform: rotate(180deg);\n }\n }\n\n & > .bottom-tool-chevron {\n font-size: .75em;\n\n transition: transform .2s ease;\n }\n }\n }\n\n & > .bottom-tool-action {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n\n transition: color .2s ease,\n background .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(255, 255, 255, .08);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: .2;\n }\n }\n }\n\n & > #copy-link {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n flex-shrink: 0;\n gap: 8px;\n\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n bottom: 8px;\n z-index: 2;\n\n border: 1px solid;\n border-radius: 50%;\n\n overflow: auto hidden;\n\n opacity: 1;\n\n transition: opacity .3s ease,\n padding .3s ease,\n color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n box-shadow: 0 -2px 8px rgba(0, 0, 0, .3);\n color: rgba(255, 255, 255, .9);\n\n background: transparent;\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n }\n\n & > div {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n\n font-size: .9em;\n font-weight: 400;\n\n white-space: nowrap;\n\n background: transparent;\n }\n }\n }\n\n & > #right-details {\n width: 15vw;\n\n position: relative;\n\n border-left: 1px solid;\n\n /* Theme dependent */\n border-left-color: rgba(54, 62, 81, 1);\n\n & > #right-top {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n align-content: center;\n justify-content: center;\n\n width: 100%;\n height: 69px;\n\n border-bottom: 2px solid;\n border-left: 1px solid;\n border-bottom-left-radius: 8px;\n\n padding: 8px 15px;\n\n /* Theme dependent */\n border-color: rgba(54, 62, 81, 1);\n\n background: rgba(41, 47, 60, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n & > .tabs {\n display: flex;\n justify-content: center;\n width: 100%;\n\n & > .tab {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 2px solid;\n\n padding: 10px;\n\n opacity: .75;\n\n transition: background .35s cubic-bezier(.4, 0, .2, 1),\n opacity .35s cubic-bezier(.4, 0, .2, 1),\n box-shadow .35s cubic-bezier(.4, 0, .2, 1),\n border-color .35s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n\n &:hover, &:focus-visible {\n opacity: 1;\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 75, 162, .25)\n );\n }\n\n &.hidden {\n display: none;\n }\n\n &:first-child {\n border-radius: 10px 0 0 10px;\n }\n &:last-child {\n border-radius: 0 10px 10px 0;\n }\n }\n }\n\n & > .icons {\n display: flex;\n justify-content: center;\n width: 100%;\n\n font-size: 1.4em;\n\n & > .hidden {\n display: none;\n }\n }\n }\n\n & > .section {\n display: flex;\n flex-direction: column;\n height: calc(50% - calc(69px / 2) - 15px);\n\n margin: 10px 10px 0 10px;\n\n border: 1px solid;\n border-radius: 16px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n background: rgba(30, 35, 45, .8);\n\n &.hidden {\n display: none;\n }\n\n & > .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n\n padding: 14px 14px 12px;\n\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(143, 163, 255, .2);\n background: rgba(30, 35, 45, .8);\n\n & > .title {\n font-weight: 600;\n font-size: .85em;\n text-transform: uppercase;\n letter-spacing: .07em;\n white-space: nowrap;\n\n & > i {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n\n margin-right: 4px;\n\n font-size: .9em;\n\n transition: transform .5s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .8);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n transform: rotate(180deg);\n }\n }\n }\n\n & > .pills {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n\n & > .pill {\n border: 1px solid;\n border-radius: 10px;\n padding: 4px 8px;\n\n font-size: .75em;\n font-weight: 500;\n\n white-space: nowrap;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(224, 228, 240, 1);\n background: rgba(140, 132, 255, .1);\n\n &.uw-1 {\n /* Theme dependent */\n border-color: rgba(107, 163, 216, .8);\n background: rgba(107, 163, 216, .1);\n color: rgba(107, 163, 216, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .8);\n background: rgba(143, 163, 255, .15);\n color: rgba(143, 163, 255, 1);\n }\n }\n &.uw-2 {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .8);\n background: rgba(255, 193, 7, .1);\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n color: rgba(255, 193, 7, 1);\n }\n }\n &.uw-3 {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, .8);\n background: rgba(255, 87, 34, .1);\n color: rgba(255, 87, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n background: rgba(255, 87, 34, .15);\n color: rgba(255, 87, 34, 1);\n }\n }\n &.uw-4 {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, .8);\n background: rgba(244, 67, 54, .1);\n color: rgba(244, 67, 54, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(244, 67, 54, 1);\n background: rgba(244, 67, 54, .15);\n color: rgba(244, 67, 54, 1);\n }\n }\n &.uw-4im {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, .8);\n background: rgba(178, 34, 34, .1);\n color: rgba(178, 34, 34, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(178, 34, 34, 1);\n background: rgba(178, 34, 34, .15);\n color: rgba(178, 34, 34, 1);\n }\n }\n\n &.ub {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, .8);\n background: rgba(255, 99, 132, .1);\n color: rgba(255, 99, 132, 1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 99, 132, 1);\n background: rgba(255, 99, 132, .15);\n color: rgba(255, 99, 132, 1);\n }\n }\n }\n }\n }\n\n & > .queue-list {\n flex: 1;\n height: 100%;\n\n padding: 4px;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .3);\n }\n\n & > .footer {\n cursor: pointer;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n\n padding: 10px 14px;\n\n border-top: 1px solid;\n\n font-size: .85em;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(30, 35, 45, .8);\n border-top-color: rgba(143, 163, 255, .2);\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n & > i {\n transform: translateX(3px);\n }\n }\n\n & > i {\n transition: transform .2s ease;\n }\n }\n }\n\n &:has(#user-contributions.hidden) {\n & > #page-history {\n height: calc(100% - 89px);\n }\n }\n &:has(#page-history.hidden) {\n & > #user-contributions {\n height: calc(100% - 89px);\n }\n }\n\n & > .width-adjust {\n touch-action: none;\n cursor: col-resize;\n\n width: 10px;\n height: 100%;\n\n position: absolute;\n left: -5px;\n top: 0;\n z-index: 3;\n }\n\n & > .height-adjust {\n touch-action: none;\n cursor: row-resize;\n\n height: 10px;\n width: 100%;\n\n position: absolute;\n left: 0;\n top: calc(50% - 5px);\n z-index: 3;\n }\n }\n }\n }\n }\n\n & > .bottom-tool-menu {\n display: none;\n max-width: calc(100vw - 40px);\n min-width: 200px;\n\n position: absolute;\n left: 0;\n bottom: calc(100% + 8px);\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n overflow-y: visible;\n\n animation: bottom-tool-menu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n }\n\n & > .menu-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border-radius: 8px;\n padding: 10px 12px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.hidden {\n display: none;\n }\n\n &:hover, &:focus-visible {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n\n & > i:first-child {\n opacity: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n opacity: 1;\n }\n }\n\n & > i:first-child {\n width: 18px;\n\n font-size: 1.1em;\n text-align: center;\n\n opacity: .8;\n\n transition: opacity .2s ease;\n }\n\n & > span {\n flex: 1;\n }\n\n & > :is(.menu-option-icon, .menu-option-chevron) {\n margin-left: auto;\n\n font-size: .85em;\n\n opacity: .5;\n\n transition: opacity .2s ease;\n }\n\n & > .submenu {\n cursor: default;\n\n display: none;\n min-width: 240px;\n\n position: absolute;\n left: calc(100% + 4px);\n top: -6px;\n z-index: 4;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 6px;\n\n color: var(--body-color);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5);\n\n background: rgba(35, 38, 48, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.show {\n display: block;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n }\n\n & > .bottom-subcontent-title {\n border-bottom: 1px solid;\n\n margin-bottom: 12px;\n padding-bottom: 8px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n }\n\n & > .bottom-subcontent-input-title {\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > :is(select, input[type=\"text\"]) {\n width: 100%;\n\n font-size: .9em;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n\n & > .bottom-subcontent-button {\n --background: 123, 143, 245;\n\n display: block;\n width: 100%;\n\n margin: 10px 0 2px 0;\n\n font-size: .9em;\n font-weight: 600;\n }\n }\n }\n\n &:is(#revert-menu, #warn-menu) {\n max-height: calc(100vh - 120px);\n\n overflow: hidden auto;\n\n & > .warning-menu {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 280px;\n\n position: relative;\n\n border-radius: 12px;\n padding: 8px;\n\n & > .warning-menu-no-items {\n text-align: center;\n padding: 20px;\n\n font-size: .9em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n }\n\n & > .favorites-section {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 4px;\n\n & > .favorites-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n\n font-size: .85em;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .9);\n\n & > .icon {\n font-size: 1.1em;\n }\n }\n\n & > .favorites-container {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n }\n\n & > .favorites-separator {\n height: 1px;\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n }\n\n & > .favorites-section:not(:has(.warning-menu-item)) {\n display: none;\n\n & ~ .favorites-separator {\n display: none;\n }\n }\n\n & > .menu-option {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n color: rgba(224, 228, 240, 1);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .12);\n\n & > .icon {\n opacity: 1;\n transform: scale(1.1);\n }\n\n & > .submenu-arrow {\n opacity: 1;\n transform: translateX(2px);\n }\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: rgba(102, 126, 234, .15);\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n opacity: .85;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > span:not(.icon):not(.submenu-arrow) {\n flex: 1;\n\n font-weight: 500;\n }\n\n & > .submenu-arrow {\n flex-shrink: 0;\n\n font-size: .8em;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n }\n }\n }\n\n & > .warning-submenu {\n display: none;\n max-width: calc(100vw - 60px);\n min-width: 420px;\n max-height: calc(100vh - 120px);\n\n position: absolute;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n overflow-y: auto;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(30, 33, 42, .98);\n -webkit-backdrop-filter: blur(25px);\n backdrop-filter: blur(25px);\n\n &.show {\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n }\n\n .warning-menu-item {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n font-size: .95em;\n\n transition: border-color .2s ease,\n background .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(40, 43, 52, .4);\n\n &:hover, &.focus-visible {\n transform: translateX(3px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n background: rgba(102, 126, 234, .12);\n }\n\n &.favorite-item {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n\n &.dragging {\n opacity: 0.5;\n transform: scale(0.95);\n }\n }\n\n & > .favorite-star {\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border-radius: 4px;\n\n font-size: 1.2em;\n line-height: 1;\n\n transition: transform .2s cubic-bezier(.4, 0, .2, 1),\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .4);\n\n &:hover {\n transform: scale(1.2);\n\n /* Theme dependent */\n color: rgba(255, 193, 7, .8);\n }\n\n &.favorited {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 152, 0, 1);\n }\n }\n\n &.spin {\n animation: star-spin 0.5s cubic-bezier(.4, 0, .2, 1);\n }\n }\n\n & > .icon {\n flex-shrink: 0;\n width: 20px;\n\n text-align: center;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n\n & > .warning-menu-title {\n flex: 1;\n\n font-size: .92em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 228, 240, 1);\n }\n\n & > .fa-circle-question {\n flex-shrink: 0;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .6);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .warning-menu-buttons {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n\n margin-left: 8px;\n }\n\n & > .warning-menu-buttons > .warning-menu-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 7px 14px;\n\n font-size: .82em;\n font-weight: 500;\n text-transform: capitalize;\n\n transition: border-color .2s ease,\n background .2s ease,\n color .2s ease,\n transform .15s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, .95);\n background: rgba(102, 126, 234, .1);\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(143, 163, 255, 1);\n background: rgba(102, 126, 234, .22);\n }\n\n &:active {\n transform: translateY(0);\n }\n\n &.warning-menu-no-warn-button {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .2);\n color: rgba(255, 193, 7, .95);\n background: rgba(255, 152, 0, .1);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 152, 0, .4);\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 152, 0, .22);\n }\n }\n }\n }\n\n & > .levels-menu {\n display: none;\n min-width: 0px;\n\n position: fixed;\n z-index: 5;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 8px;\n\n animation: bottom-tool-submenu-enter .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .6),\n 0 0 0 1px rgba(255, 255, 255, .05);\n\n background: rgba(28, 30, 38, .98);\n -webkit-backdrop-filter: blur(24px);\n backdrop-filter: blur(24px);\n\n &.show {\n display: flex;\n gap: 6px;\n }\n\n & > .levels-menu-item {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 8px;\n padding: 6px 14px;\n\n font-size: .95em;\n font-weight: 600;\n text-align: center;\n white-space: nowrap;\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n background: rgba(255, 255, 255, .05);\n border: 1px solid rgba(255, 255, 255, .1);\n\n &:hover {\n transform: translateY(-2px);\n background: rgba(255, 255, 255, .08);\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n\n &:active {\n transform: translateY(0);\n }\n }\n }\n\n .queue-list {\n overflow: hidden auto;\n\n &:is(#user-contributions-content, #page-history-content) {\n & > .queue-item {\n margin: 4px 0;\n }\n }\n\n & > .queue-empty {\n text-align: center;\n padding: 40px 20px;\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n }\n\n & > .historical-bar {\n height: 4px;\n width: 100%;\n\n position: relative;\n\n margin: 8px 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(255, 255, 255, .1) 20%,\n rgba(255, 255, 255, .1) 80%,\n transparent\n );\n\n & > .label {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n font-size: 1em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .8);\n }\n }\n\n & > .queue-item {\n cursor: pointer;\n\n display: flex;\n\n position: relative;\n\n border: 1px solid;\n border-radius: .75rem;\n\n margin: 4px;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .4);\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n &:hover, &:focus-within {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 12px oklch(0 0 0 / 0.3);\n\n background: rgba(40, 43, 52, .6);\n }\n\n &.current {\n /* Theme dependent */\n border-color: linear-gradient(90deg,\n rgba(40, 43, 52, .4),\n rgba(40, 43, 82, .6)\n );\n box-shadow: 0 0 0 1px rgba(60, 63, 122, 1) inset;\n\n background: rgba(40, 43, 82, .6);\n\n & > .item-body {\n & > .item-tags {\n & > .tag {\n /* Theme dependent */\n color: rgba(145, 145, 165, 1);\n background: rgba(60, 63, 122, .4);\n border-color: rgba(60, 63, 122, .6);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .4);\n border-color: rgba(255, 193, 7, .6);\n }\n }\n }\n }\n }\n\n &.mentions-me {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 1) inset;\n\n background: rgba(40, 43, 52, .6);\n }\n\n & > .item-color {\n --ores-color: rgba(128, 128, 128, 1);\n\n flex-shrink: 0;\n width: 4px;\n\n position: relative;\n\n opacity: .85;\n\n /* Theme dependent */\n background: var(--ores-color);\n }\n\n & > .item-body {\n --ores-color: rgba(128, 128, 128, 1);\n --diff-color: rgba(128, 128, 128, 1);\n\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: .5rem;\n\n min-width: 0;\n\n padding: .75rem 1rem;\n\n & > .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: .75rem;\n\n & > .page-title {\n display: flex;\n flex: 1;\n gap: 4px;\n\n min-width: 0;\n\n font-size: clamp(.825rem, .85rem + .35vw, .95rem);\n font-weight: 600;\n\n word-wrap: break-word;\n word-break: break-word;\n\n line-height: 1.35;\n\n /* Theme dependent */\n color: rgba(205, 204, 202, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n & > i {\n font-size: .9em;\n\n line-height: inherit;\n }\n }\n\n & > .timestamp {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: 4px;\n\n min-width: 3ex;\n\n padding-top: 1px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .75rem;\n\n width: 100%;\n\n & > .user-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 500;\n\n hyphens: auto;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n\n &.blocked {\n font-style: italic;\n text-decoration: line-through;\n\n opacity: .7;\n }\n &.empty-talk {\n /* Theme dependent */\n color: rgba(221, 105, 116, 1);\n }\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n }\n\n & > .chips {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-grow: 1;\n gap: 4px;\n\n & > .ores-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n font-weight: 600;\n\n /* Theme dependent */\n color: var(--ores-color);\n background: color-mix(in srgb, var(--ores-color) 15%, transparent);\n }\n\n & > .diff-chips {\n display: flex;\n align-items: center;\n gap: 4px;\n\n & > .minor-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 5px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: rgba(175, 175, 175, 1);\n background: rgba(175, 175, 175, .15);\n }\n & > .diff-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n\n padding: 2px .5rem;\n\n border-radius: .375rem;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n /* Theme dependent */\n color: var(--diff-color);\n background: color-mix(in srgb, var(--diff-color) 15%, transparent);\n }\n }\n }\n }\n\n & > .item-comment {\n display: flex;\n align-items: center;\n gap: 4px;\n\n font-size: clamp(.75rem, .7rem + .25vw, .875rem);\n\n overflow: hidden;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n\n & > i {\n flex-shrink: 0;\n\n opacity: .6;\n }\n\n & > .text {\n font-style: italic;\n white-space: nowrap;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n &.none {\n opacity: .6;\n }\n }\n }\n\n & > .item-tags {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: .5rem;\n\n & > .tag {\n display: flex;\n align-items: center;\n gap: 2px;\n\n padding: 1px .5rem;\n\n border: 1px solid;\n border-radius: .375rem;\n\n font-size: .7rem;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(135, 135, 135, 1);\n background: rgba(45, 44, 51, 1);\n border-color: rgba(38, 37, 35, 1);\n\n &.highlighted {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border-color: rgba(255, 193, 7, .4);\n }\n }\n }\n }\n\n & > .remove-button {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n\n position: absolute;\n right: 0px;\n bottom: 0px;\n\n border-top-left-radius: 8px;\n\n line-height: 1;\n\n transition: color .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, .7);\n background: rgba(255, 255, 255, 0);\n\n &:hover {\n /* Theme dependent */\n color: rgba(255, 70, 0, 1);\n background: rgba(255, 70, 0, .15);\n }\n }\n }\n }\n\n .tooltip {\n min-width: 0;\n max-height: 80vh;\n\n position: fixed;\n left: 0;\n top: 0;\n z-index: calc(var(--max-z-index) - 3);\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 4px 6px;\n\n overflow-wrap: break-word;\n overflow: hidden auto;\n\n font-size: .95em;\n line-height: 1.45;\n word-wrap: break-word;\n white-space: normal;\n\n animation: tooltip-enter .1s ease-out forwards;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n box-shadow: 0 10px 30px rgba(6, 12, 24, .6),\n inset 0 1px 0 rgba(255, 255, 255, .02);\n\n color: rgba(234, 240, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .03),\n rgba(255, 255, 255, .01)\n );\n -webkit-backdrop-filter: blur(14px) brightness(.7);\n backdrop-filter: blur(14px) brightness(.7);\n\n &:not(.buttons) {\n pointer-events: none;\n\n max-width: 460px;\n }\n\n &.buttons {\n display: flex;\n flex-direction: row;\n gap: 8px;\n\n z-index: calc(var(--max-z-index) - 2);\n\n white-space: nowrap;\n\n & > .button {\n cursor: pointer;\n\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 4px 8px;\n\n font-size: .95em;\n font-weight: 500;\n letter-spacing: .3px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .05);\n\n color: rgba(240, 245, 255, .92);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .08),\n rgba(255, 255, 255, .02)\n );\n\n &:hover {\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .14),\n rgba(255, 255, 255, .06)\n );\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 1px 4px rgba(0, 0, 0, .3),\n inset 0 1px 2px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .tooltip-title {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-bottom: 1px solid;\n\n border-radius: 6px;\n margin-bottom: 12px;\n padding: 8px 10px;\n\n font-size: 1.04em;\n font-weight: 700;\n letter-spacing: .25px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .05);\n\n color: rgba(255, 255, 255, .92);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(0, 0, 0, .04)\n );\n -webkit-backdrop-filter: blur(6px);\n backdrop-filter: blur(6px);\n }\n\n & > .tooltip-item {\n display: flex;\n flex-direction: column;\n\n position: relative;\n\n border: 1px solid;\n\n border-radius: 10px;\n margin: 10px 0;\n padding: 10px 12px;\n\n overflow: hidden;\n overflow-wrap: anywhere;\n\n word-wrap: break-word;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 255, .075),\n rgba(0, 0, 0, .25)\n );\n\n &:is(.user-warnings, .user-blocks) {\n & > .tooltip-item-level {\n display: block;\n width: 100%;\n\n border-bottom: 1px solid;\n\n border-radius: 6px 6px 0 0;\n padding: 6px 10px;\n\n font-size: .95em;\n font-weight: 700;\n letter-spacing: .3px;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 120, .25);\n\n color: rgba(255, 255, 120, .95);\n\n background: linear-gradient(135deg,\n rgba(255, 255, 120 .22),\n rgba(255, 255, 120, .08)\n );\n }\n\n & > .tooltip-item-details {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n\n & > :is(.tooltip-item-user, .tooltip-item-time) {\n font-size: .82em;\n font-weight: 400;\n\n opacity: .8;\n\n &.tooltip-item-user {\n /* Theme dependent */\n color: rgba(150, 210, 255, .9);\n }\n &.tooltip-item-time {\n /* Theme dependent */\n color: rgba(220, 225, 235, .9);\n\n & > span:not(:first-of-type) {\n margin-left: 1ex;\n }\n }\n }\n }\n }\n\n & > .tooltip-more {\n border-top: 1px solid;\n\n border-radius: 8px;\n margin-top: 14px;\n padding-top: 10px;\n\n font-size: .92em;\n font-style: italic;\n text-align: center;\n\n opacity: .95;\n\n /* Theme dependent */\n border-top-color: rgba(255, 255, 255, .04);\n\n color: rgba(240, 240, 255, .75);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .015),\n rgba(0, 0, 0, .03)\n );\n -webkit-backdrop-filter: blur(4px);\n backdrop-filter: blur(4px);\n }\n }\n }\n\n .confirmation-modal-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: calc(var(--max-z-index) - 6);\n\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n animation: fade-in .2s ease-out;\n\n &.closing {\n animation: fade-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal {\n max-width: 500px;\n min-width: 400px;\n\n border: 1px solid;\n\n border-radius: 16px;\n\n word-wrap: break-word;\n\n animation: scale-in .2s ease-out;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 12px 48px rgba(0, 0, 0, .7),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: rgba(41, 47, 60, .98);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.closing {\n animation: scale-out .2s ease-out forwards;\n }\n\n & > .confirmation-modal-header {\n border-bottom: 1px solid;\n\n padding: 20px 24px;\n\n /* Theme dependent */\n border-bottom-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-title {\n font-size: 1.2em;\n font-weight: 700;\n }\n }\n\n & > .confirmation-modal-body {\n max-height: 70vh;\n\n padding: 24px;\n\n line-height: 1.5;\n\n overflow: hidden auto;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n\n & > .confirmation-modal-username {\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(91, 154, 255, 1);\n }\n\n & > .confirmation-modal-input {\n width: 100%;\n\n border: 1px solid;\n border-radius: 4px;\n\n margin-top: 10px;\n padding: 8px;\n\n /* Theme dependent */\n color: white;\n border-color: rgba(255, 255, 255, .2);\n background: rgba(0, 0, 0, .3);\n }\n }\n\n & > .confirmation-modal-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n\n border-top: 1px solid;\n\n padding: 16px 24px;\n\n /* Theme dependent */\n border-top-color: rgba(54, 62, 81, 1);\n\n & > .confirmation-modal-footer-right {\n display: flex;\n gap: 12px;\n }\n\n &.confirmation-modal-footer-vertical {\n flex-direction: column;\n align-items: stretch;\n\n & > .confirmation-modal-button {\n width: 100%;\n }\n }\n }\n\n .confirmation-modal-button {\n font-size: .95em;\n font-weight: 500;\n }\n }\n }\n\n .notification-panel {\n pointer-events: none;\n\n display: flex;\n flex-direction: column;\n width: 480px;\n max-height: 600px;\n\n position: absolute;\n left: 15px;\n top: 55px;\n z-index: calc(var(--max-z-index) - 9);\n\n border: 1px solid;\n border-radius: 18px;\n\n overflow: hidden;\n\n opacity: 0;\n\n transform: translateY(-20px) scale(.95);\n\n transition: opacity .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 20px 60px rgba(0, 0, 0, .8),\n 0 0 0 1px rgba(255, 255, 255, .08),\n inset 0 1px 0 rgba(255, 255, 255, .03);\n\n background: rgba(25, 27, 36, .96);\n -webkit-backdrop-filter: blur(25px) brightness(0.95);\n backdrop-filter: blur(25px) brightness(0.95);\n\n a {\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n\n transition: color .2s ease;\n\n &:hover {\n /* Theme dependent */\n color: rgba(160, 195, 255, 1);\n }\n\n &:visited {\n /* Theme dependent */\n color: rgba(150, 185, 255, 1);\n }\n }\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n\n & > .notification-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border-bottom: 1px solid;\n\n padding: 18px 22px;\n\n font-size: 1.12em;\n font-weight: 700;\n letter-spacing: 0.3px;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .08);\n\n color: rgba(245, 245, 255, 1);\n\n background: linear-gradient(135deg,\n rgba(120, 145, 255, .12),\n rgba(140, 100, 200, .08)\n );\n\n & > .mark-all-read {\n cursor: pointer;\n\n font-size: 0.78em;\n font-weight: 500;\n letter-spacing: 0.2px;\n\n padding: 6px 12px;\n border-radius: 6px;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(120, 170, 255, 1);\n background: rgba(120, 170, 255, .08);\n\n &:hover {\n /* Theme dependent */\n background: rgba(120, 170, 255, .15);\n color: rgba(160, 200, 255, 1);\n }\n\n &:active {\n opacity: .85;\n }\n }\n }\n\n & > .notification-list {\n max-height: 520px;\n\n overflow: hidden auto;\n\n padding: 8px;\n\n & > .notifications-empty {\n padding: 40px 20px;\n\n text-align: center;\n\n font-size: 0.95em;\n\n /* Theme dependent */\n color: rgba(120, 125, 145, 1);\n\n & strong {\n /* Theme dependent */\n color: rgba(150, 155, 175, 1);\n }\n }\n\n & > .notification {\n cursor: pointer;\n\n display: flex;\n align-items: flex-start;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 18px;\n margin-bottom: 8px;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(50, 55, 75, .4),\n rgba(40, 45, 65, .3)\n );\n\n &:hover {\n opacity: 1;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .3);\n box-shadow: 0 8px 24px rgba(120, 170, 255, .15),\n inset 0 1px 0 rgba(255, 255, 255, .04);\n\n background: linear-gradient(135deg,\n rgba(80, 100, 160, .15),\n rgba(70, 85, 145, .1)\n );\n\n transform: translateY(-2px);\n }\n\n &.unread {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(120, 170, 255, .5);\n box-shadow: 0 0 20px rgba(120, 170, 255, .2),\n inset 0 1px 0 rgba(255, 255, 255, .06);\n\n background: linear-gradient(135deg,\n rgba(120, 170, 255, .1),\n rgba(100, 145, 255, .05)\n );\n }\n\n &.read {\n opacity: .72;\n\n border-color: rgba(255, 255, 255, .04);\n }\n\n & > .notification-icon {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n\n border-radius: 10px;\n\n overflow: hidden;\n\n background: rgba(60, 75, 120, .5);\n\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n & > .notification-content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: 5px;\n\n & > .notification-header {\n margin: 0;\n\n font-size: .95rem;\n font-weight: 600;\n letter-spacing: 0.2px;\n\n /* Theme dependent */\n color: rgba(235, 240, 255, 1);\n }\n\n & > .notification-body {\n font-size: .82rem;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 180, 205, 1);\n }\n\n & > .notification-links {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n\n margin-top: 6px;\n\n & > a {\n border: none;\n\n padding: 4px 8px;\n border-radius: 5px;\n\n font-size: .8rem;\n font-weight: 500;\n text-decoration: none;\n\n background: rgba(120, 170, 255, .12);\n opacity: 1;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n color: rgba(140, 185, 255, 1);\n\n &:hover {\n opacity: 1;\n\n background: rgba(120, 170, 255, .22);\n\n /* Theme dependent */\n color: rgba(180, 210, 255, 1);\n }\n\n &:active {\n opacity: .85;\n\n transform: scale(0.98);\n }\n }\n }\n }\n\n & > .notification-right {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n gap: 10px;\n\n & > .notification-unread-indicator {\n cursor: pointer;\n\n width: 12px;\n height: 12px;\n\n border-radius: 50%;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n background: rgba(120, 170, 255, 1);\n box-shadow: 0 0 8px rgba(120, 170, 255, .5);\n\n &:hover, &:focus {\n transform: scale(1.35);\n\n /* Theme dependent */\n box-shadow: 0 0 16px rgba(120, 170, 255, .8);\n }\n }\n\n & > .notification-timestamp {\n font-size: .72rem;\n font-weight: 500;\n\n opacity: .8;\n\n white-space: nowrap;\n\n /* Theme dependent */\n color: rgba(140, 150, 175, 1);\n }\n }\n }\n }\n }\n\n .icon-count {\n --color: 255, 255, 255;\n --background: 255, 255, 255;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n\n position: absolute;\n right: -11px;\n top: -11px;\n z-index: 3;\n\n border: 1px solid;\n\n border-radius: 50%;\n padding: 0 8px;\n\n font-family: sans-serif;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n\n transition: transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(var(--background), .3);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(var(--background), .15);\n\n color: rgba(--color, 1);\n text-shadow: 0 1px 0 rgba(0, 0, 0, .35);\n\n background: linear-gradient(135deg,\n rgba(var(--background), .7),\n rgba(var(--background), .5)\n );\n -webkit-backdrop-filter: blur(6px) brightness(0%);\n backdrop-filter: blur(6px) brightness(0%);\n\n &.red {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 255, 60, 60;\n }\n &.green {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 205, 80;\n }\n &.blue {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 60, 120, 255;\n }\n &.yellow {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 215, 60;\n }\n &.orange {\n /* Theme dependent */\n --color: 30, 30, 30;\n --background: 255, 165, 60;\n }\n &:is(.gray, .grey) {\n /* Theme dependent */\n --color: 255, 255, 255;\n --background: 150, 150, 150;\n }\n\n &.hidden {\n pointer-events: none;\n\n opacity: 0;\n\n transform: scale(0);\n }\n }\n\n .toast-alert {\n display: flex;\n align-items: center;\n gap: 14px;\n max-width: 500px;\n min-width: 320px;\n\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: calc(var(--max-z-index) - 4);\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 14px 20px;\n\n opacity: 0;\n\n transform: translateX(100%) scale(.8);\n\n animation: toast-alert-enter .5s cubic-bezier(.68, -.55, .265, 1.55);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 12px 40px rgba(0, 0, 0, .2),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n color: rgba(255, 255, 255, 1);\n\n -webkit-backdrop-filter: blur(25px) saturate(180%);\n backdrop-filter: blur(25px) saturate(180%);\n\n &.success {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(76, 175, 80, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .25),\n rgba(56, 142, 60, .25)\n );\n }\n &.warning {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(255, 152, 0, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(255, 152, 0, .25),\n rgba(245, 124, 0, .25)\n );\n }\n &.error {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(244, 67, 54, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(244, 67, 54, .25),\n rgba(211, 47, 47, .25)\n );\n }\n &.dev {\n /* Theme dependent */\n box-shadow: 0 12px 40px rgba(156, 39, 176, .3),\n 0 0 0 1px rgba(255, 255, 255, .1);\n\n background: linear-gradient(135deg,\n rgba(156, 39, 176, .25),\n rgba(123, 31, 162, .25)\n );\n }\n\n &.show {\n opacity: 1;\n\n transform: translateX(0) scale(1);\n }\n\n &.hidden {\n animation: toast-alert-leave .4s cubic-bezier(.6, -.28, .735, .045) forwards;\n }\n\n & > .toast-icon {\n flex-shrink: 0;\n\n font-size: 1.8em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .3));\n }\n\n & > .toast-content {\n flex: 1;\n\n & > .toast-title {\n margin-bottom: 4px;\n\n font-size: 1.05em;\n font-weight: 700;\n letter-spacing: .3px;\n }\n\n & > .toast-message {\n font-size: .9em;\n line-height: 1.4;\n\n opacity: .95;\n }\n }\n\n & > .toast-close {\n cursor: pointer;\n\n flex-shrink: 0;\n\n border-radius: 6px;\n padding: 4px;\n\n font-size: 1.3em;\n\n background: transparent;\n opacity: .8;\n\n transition: opacity .2s ease,\n transform .2s ease,\n background .2s ease;\n\n &:hover {\n opacity: 1;\n\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n }\n }\n\n .minor-indicator {\n border: 1px solid;\n\n border-radius: 4px;\n margin-right: 4px;\n padding: 0 4px;\n\n font-size: .9em;\n font-weight: 700;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(153, 153, 153, 1);\n\n background: rgba(60, 64, 76, .9);\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n\n .menu-divider {\n height: 1px;\n\n margin: 6px 8px;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n\n .profanity {\n display: flex;\n flex-direction: column;\n gap: 16px;\n\n margin: 20px;\n padding: 20px;\n\n border-radius: 12px;\n border: 1px solid;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .8);\n border-color: rgba(255, 255, 255, .12);\n box-shadow: 0 4px 16px rgba(0, 0, 0, .3);\n\n & > .profanity-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n\n padding-bottom: 16px;\n border-bottom: 1px solid;\n\n /* Theme dependent */\n border-bottom-color: rgba(255, 255, 255, .1);\n\n & > .profanity-score {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n & > .score-label {\n font-size: .85em;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(180, 180, 180, 1);\n }\n\n & > .score-value {\n font-size: 2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(255, 200, 100, 1);\n }\n }\n\n & > .profanity-risk {\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 16px;\n\n font-size: .95em;\n font-weight: 600;\n\n /* Theme dependent */\n background: rgba(60, 64, 76, .6);\n\n &.risk-high {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n background: rgba(211, 47, 47, .2);\n border: 1px solid rgba(211, 47, 47, .4);\n }\n\n &.risk-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n background: rgba(255, 193, 7, .15);\n border: 1px solid rgba(255, 193, 7, .3);\n }\n\n &.risk-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n background: rgba(66, 165, 245, .15);\n border: 1px solid rgba(66, 165, 245, .3);\n }\n }\n }\n\n & > .profanity-matches-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .profanity-matches-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n & > .profanity-match {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n border-radius: 8px;\n padding: 12px 14px;\n border-left: 3px solid;\n\n transition: background .2s ease,\n border-color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n background: rgba(45, 50, 62, .7);\n border-left-color: rgba(255, 150, 150, .5);\n\n &:hover {\n transform: translateX(4px);\n\n /* Theme dependent */\n background: rgba(50, 56, 70, .85);\n border-left-color: rgba(255, 150, 150, .8);\n }\n\n & > .match-header {\n display: flex;\n align-items: center;\n gap: 8px;\n\n font-size: .95em;\n\n & > .match-text {\n font-family: 'Courier New', monospace;\n font-weight: 600;\n\n border-radius: 4px;\n padding: 4px 8px;\n\n /* Theme dependent */\n color: rgba(255, 180, 180, 1);\n background: rgba(211, 47, 47, .2);\n }\n\n & > .match-arrow {\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .match-name {\n font-family: 'Courier New', monospace;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n }\n\n & > .match-details {\n display: flex;\n gap: 16px;\n\n & > .match-stat {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n & > .stat-label {\n font-size: .75em;\n text-transform: uppercase;\n letter-spacing: .5px;\n\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .stat-value {\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n &.severity-critical {\n /* Theme dependent */\n color: rgba(255, 100, 100, 1);\n }\n &.severity-high {\n /* Theme dependent */\n color: rgba(255, 150, 100, 1);\n }\n\n &.severity-medium {\n /* Theme dependent */\n color: rgba(255, 193, 7, 1);\n }\n\n &.severity-low {\n /* Theme dependent */\n color: rgba(100, 200, 255, 1);\n }\n }\n }\n }\n\n & > .match-note {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n margin-top: 6px;\n padding: 10px 12px;\n border-radius: 6px;\n\n font-size: .85em;\n line-height: 1.5;\n\n /* Theme dependent */\n background: rgba(30, 33, 43, .6);\n border: 1px solid rgba(100, 150, 255, .2);\n\n & > .fa {\n margin-top: 2px;\n font-size: 1.1em;\n\n /* Theme dependent */\n color: rgba(100, 150, 255, .8);\n }\n\n & > .note-text {\n flex: 1;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n }\n }\n }\n\n & > .profanity-no-matches {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n padding: 20px;\n\n font-size: 1em;\n\n /* Theme dependent */\n color: rgba(100, 200, 100, 1);\n }\n }\n\n & > #settings-container {\n z-index: calc(var(--max-z-index) - 7);\n\n pointer-events: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n position: fixed;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n\n opacity: 0;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n background: rgba(0, 0, 0, .6);\n -webkit-backdrop-filter: blur(12px);\n backdrop-filter: blur(12px);\n\n &.show {\n pointer-events: auto;\n\n opacity: 1;\n\n & > .settings {\n transform: scale(1);\n }\n }\n\n & > .settings {\n display: flex;\n max-width: 1100px;\n width: 90vw;\n\n border: 1px solid;\n\n border-radius: 20px;\n\n overflow: hidden;\n\n transform: scale(.75);\n\n transition: transform .1s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(30, 33, 42, .95);\n -webkit-backdrop-filter: blur(30px);\n backdrop-filter: blur(30px);\n\n & > div {\n height: 80vh;\n\n &.settings-left {\n width: 250px;\n\n border-right: 1px solid;\n\n padding: 20px 0;\n\n overflow-y: auto;\n\n /* Theme dependent */\n border-right-color: rgba(255, 255, 255, .1);\n\n background: linear-gradient(180deg,\n rgba(255, 255, 255, .02),\n rgba(255, 255, 255, .05)\n );\n\n & > .settings-category {\n &:not(:last-child) {\n margin-bottom: 20px;\n }\n\n & > .settings-category-header {\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n margin-bottom: 4px;\n padding: 12px 20px;\n\n font-size: .7em;\n font-weight: 800;\n letter-spacing: 1.5px;\n text-transform: uppercase;\n }\n\n & > .settings-left-menu-compact {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n padding: 0 12px;\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n border-radius: 10px;\n padding: 12px;\n\n font-size: 1.2em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:first-child {\n margin-left: 12px;\n }\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n }\n }\n\n & > .settings-left-menu-item {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 12px;\n\n border-radius: 10px;\n margin: 2px 12px;\n padding: 12px 20px;\n\n font-size: .95em;\n font-weight: 500;\n\n transition: background .2s ease,\n color .2s ease,\n box-shadow .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n\n &:hover {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .15);\n }\n\n &.selected {\n font-weight: 600;\n\n /* Theme dependent */\n box-shadow: 0 0 20px rgba(102, 126, 234, .2);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n & > span > i {\n height: 1em;\n aspect-ratio: 1 / 1;\n\n margin-right: 12px;\n\n text-align: center;\n }\n }\n }\n }\n\n &.settings-right {\n flex: 1;\n\n padding: 20px 30px;\n\n overflow-y: auto;\n\n /* Theme dependent */\n background: rgba(20, 22, 28, .5);\n\n & > .hidden {\n display: none;\n }\n\n a {\n color: rgba(143, 163, 255, 1);\n\n &:hover {\n color: rgba(176, 192, 255, 1);\n }\n }\n\n pre, code {\n border-radius: 4px;\n padding: 2px 4px;\n\n font-size: .95em;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .15);\n }\n\n .settings-compact-grid {\n & > .compact {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n & > .numeric-input-container {\n & > .numeric-input {\n width: calc(100% - 70px);\n }\n }\n\n & > select {\n width: 100%;\n }\n }\n }\n\n .settings-section, .settings-toggles-section {\n display: block;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 25px;\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n\n background: rgba(35, 38, 48, .8);\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n &.disabled {\n pointer-events: none;\n\n opacity: .5;\n }\n\n .settings-section-title {\n margin-bottom: 5px;\n\n font-size: 1em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n &.collapse-title {\n margin-bottom: 0;\n }\n }\n\n .settings-section-desc {\n margin-bottom: 0;\n\n font-size: .85em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .pad-list {\n margin: 8px 0;\n padding-left: 20px;\n }\n\n &:not(:last-child) {\n margin-bottom: 30px;\n }\n\n &.compact {\n margin-bottom: 0;\n padding: 18px;\n\n & > .settings-section-title {\n font-size: 1.05em;\n\n &.collapse-title {\n margin-bottom: 15px;\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 12px;\n\n font-size: .85em;\n }\n }\n\n &.inline {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: rgba(35, 38, 48, .6);\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .settings-section-content {\n flex: 1;\n }\n }\n\n &.collapsed {\n & > .collapse-title::after {\n transform: rotate(-180deg);\n }\n }\n\n & > .collapse-title {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n &::after{\n content: \"\\f077\";\n\n float: right;\n\n font-family: \"Font Awesome 6 Free\";\n font-weight: 900;\n\n transition: transform .2s ease;\n }\n }\n\n & > .collapsible-content {\n padding: initial;\n\n overflow: hidden;\n\n transition: padding .2s ease;\n\n &.collapsed {\n padding: 0;\n }\n }\n\n & > .settings-section-title {\n margin-bottom: 15px;\n\n font-size: 1.4em;\n font-weight: 700;\n letter-spacing: -.5px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 8px;\n }\n }\n\n & > .settings-section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n\n margin-bottom: 15px;\n\n font-size: 1.2em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.collapse-title {\n margin-bottom: 0;\n }\n\n & > .settings-section-header-icon {\n font-size: 1.3em;\n\n /* Theme dependent */\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .2));\n }\n }\n\n & > .settings-section-desc {\n margin-bottom: 20px;\n\n font-size: .95em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n .checkbox-container {\n display: flex;\n flex-wrap: wrap;\n\n & > div {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 200px;\n\n margin-bottom: 8px;\n\n &:hover {\n & > .checkbox-box {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .checkbox-box {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: block;\n\n position: relative;\n\n border-radius: 5px;\n\n font-size: .95em;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(213, 213, 213, 1);\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n position: absolute;\n width: 0;\n height: 0;\n\n border-radius: 5px;\n\n opacity: 0;\n\n &:checked ~ .checkmark {\n /* Theme dependent */\n background: linear-gradient(45deg,\n rgba(100, 61, 219, 1),\n rgba(217, 21, 239, 1)\n );\n\n &::after {\n opacity: 1;\n }\n }\n }\n\n & > .checkmark {\n width: 1.3em;\n height: 1.3em;\n\n position: relative;\n left: 0;\n top: 0;\n\n border-radius: 5px;\n\n transition: background .2s ease;\n\n /* Theme dependent */\n background: rgba(204, 204, 204, 1);\n\n &::after {\n content: \"\";\n\n width: .25em;\n height: .5em;\n\n position: absolute;\n left: .45em;\n top: .25em;\n\n border-width: 0 .15em .15em 0;\n border-style: solid;\n\n opacity: 0;\n\n transform: rotate(45deg);\n\n transition: opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, 1);\n }\n }\n }\n }\n }\n\n .numeric-input-container {\n display: flex;\n\n & > .numeric-input-button {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n justify-content: center;\n width: 35px;\n height: 35px;\n\n border: 1px solid;\n\n border-radius: 8px;\n\n font-size: 1.3em;\n\n transition: background .2s ease,\n border-color .2s ease,\n color .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .8);\n\n &:hover {\n transform: scale(1.05);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n\n color: rgba(143, 163, 255, 1);\n\n background: rgba(102, 126, 234, .2);\n }\n }\n\n & > .numeric-input {\n width: 100px;\n\n border-radius: 8px;\n margin: 0 5px;\n padding: 6px 12px;\n\n font-size: 1.1em;\n }\n }\n\n .volume-control {\n display: block;\n\n border: 1px solid;\n\n border-radius: 12px;\n margin: 20px 0;\n padding: 20px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .volume-control-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n\n margin-bottom: 16px;\n\n & > .volume-control-info {\n flex: 1;\n\n & > .volume-control-title {\n margin-bottom: 6px;\n\n font-size: 1.05em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .volume-control-desc {\n font-size: .9em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n & > .volume-control-preview {\n --background: 123, 143, 245;\n\n display: flex;\n align-items: center;\n gap: 8px;\n\n border-radius: 8px;\n padding: 10px 18px;\n\n font-size: .9em;\n font-weight: 500;\n }\n }\n\n & > .volume-control-slider-container {\n display: flex;\n align-items: center;\n gap: 16px;\n\n & > .volume-control-slider {\n flex: 1;\n height: 6px;\n\n outline: none;\n\n border-radius: 3px;\n\n -webkit-appearance: none;\n appearance: none;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n\n &::-webkit-slider-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n\n &::-moz-range-thumb {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n\n border: none;\n\n border-radius: 50%;\n\n -webkit-appearance: none;\n appearance: none;\n\n transition: transform .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 6px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 10px rgba(102, 126, 234, .5);\n }\n }\n }\n\n & > .volume-control-input {\n width: 70px;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-size: .95em;\n text-align: center;\n }\n }\n }\n\n .settings-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 60px;\n height: 32px;\n\n position: relative;\n\n &:hover {\n & > .toggle-switch {\n transform: scale(1.02);\n }\n }\n\n &.active {\n & > .toggle-switch {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5),\n inset 0 1px 2px rgba(255, 255, 255, .2);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n & > .toggle-slider {\n left: 30px;\n\n /* Theme dependent */\n box-shadow: 0 4px 10px rgba(0, 0, 0, .3),\n 0 2px 4px rgba(0, 0, 0, .2);\n }\n }\n }\n\n & > .toggle-switch {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n border: 2px solid;\n\n border-radius: 16px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n box-shadow: inset 0 2px 6px rgba(0, 0, 0, .4);\n\n background: rgba(60, 63, 75, .8);\n\n & > .toggle-slider {\n width: 24px;\n height: 24px;\n\n position: absolute;\n left: 2px;\n top: 2px;\n\n border-radius: 50%;\n\n transition: left .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n 0 1px 2px rgba(0, 0, 0, .15);\n\n background: rgba(255, 255, 255, 1);\n }\n }\n }\n\n .settings-radio-group {\n display: flex;\n flex-direction: row;\n gap: 12px;\n\n border-radius: 100vh;\n padding: 8px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-radio-option {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n flex: 1;\n\n text-align: center;\n\n border-radius: 100vh;\n padding: 10px 16px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: background .2s ease,\n color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n color: rgba(143, 163, 255, 1);\n }\n\n &.selected {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n color: rgba(224, 224, 224, 1);\n }\n }\n }\n\n .settings-slider {\n display: flex;\n flex-direction: column;\n gap: 14px;\n\n border-radius: 14px;\n padding: 16px 20px;\n\n /* Theme dependent */\n background: rgba(40, 43, 52, .7);\n\n & > .settings-slider-labels {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n }\n\n & > .settings-slider-labels > .settings-slider-label-left,\n & > .settings-slider-labels > .settings-slider-label-right {\n display: flex;\n flex-direction: column;\n gap: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n transition: color .2s ease;\n\n /* Theme dependent */\n color: rgba(192, 192, 192, 1);\n\n &.active {\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .percent {\n font-size: .85em;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .9);\n }\n }\n\n & > .settings-slider-labels > .settings-slider-label-right {\n text-align: right;\n }\n\n & > .settings-slider-track {\n cursor: pointer;\n\n height: 8px;\n\n position: relative;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .08);\n\n &::before {\n content: '';\n\n width: var(--fill, 50%);\n height: 100%;\n\n position: absolute;\n left: 0;\n top: 0;\n\n border-radius: 100vh;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .6),\n rgba(118, 75, 162, .6)\n );\n }\n\n & > .settings-slider-thumb {\n cursor: grab;\n\n width: 22px;\n height: 22px;\n\n position: absolute;\n top: 50%;\n\n border: 2px solid;\n\n border-radius: 50%;\n\n transform: translate(-50%, -50%);\n\n transition: transform .15s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .4),\n 0 0 12px rgba(102, 126, 234, .3);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n &:hover {\n transform: translate(-50%, -50%) scale(1.15);\n\n /* Theme dependent */\n box-shadow: 0 3px 12px rgba(0, 0, 0, .5),\n 0 0 20px rgba(102, 126, 234, .5);\n }\n\n &:active, &.dragging {\n cursor: grabbing;\n\n transform: translate(-50%, -50%) scale(1.2);\n\n /* Theme dependent */\n box-shadow: 0 4px 16px rgba(0, 0, 0, .5),\n 0 0 24px rgba(102, 126, 234, .6);\n }\n }\n }\n }\n\n .palette-selector {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n gap: 16px;\n\n margin-top: 20px;\n\n & > .palette-option {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 12px;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 20px rgba(20, 20, 30, .4);\n }\n\n &.selected {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4);\n }\n\n & > .palette-name {\n pointer-events: none;\n\n font-size: .9em;\n font-weight: 600;\n text-align: center;\n }\n\n & > .palette-preview {\n pointer-events: none;\n\n display: flex;\n gap: 4px;\n height: 40px;\n\n border-radius: 8px;\n margin-bottom: 12px;\n\n overflow: hidden;\n\n & > canvas {\n flex: 1;\n width: 100%;\n height: 100%;\n }\n }\n }\n }\n\n .tracklist {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n\n & > .track {\n position: relative;\n\n border-radius: 8px;\n\n overflow: hidden;\n\n & > .thumbnail {\n display: block;\n width: 100%;\n aspect-ratio: 1 / 1;\n\n overflow: hidden;\n\n & > img {\n display: block;\n width: 100%;\n height: 100%;\n\n overflow: hidden;\n }\n }\n\n & > .info {\n display: flex;\n flex-direction: column;\n gap: 3px;\n\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n\n padding: 10px 12px;\n\n /* Theme dependent */\n background: linear-gradient(180deg,\n rgba(0, 0, 0, 0),\n rgba(0, 0, 0, .35),\n rgba(0, 0, 0, .65)\n );\n\n & > .title {\n font-size: .95em;\n font-weight: 600;\n\n overflow: hidden;\n text-overflow: ellipsis;\n\n white-space: nowrap;\n\n /* Theme dependent */\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n\n color: rgba(255, 255, 255, 1);\n }\n\n & > :is(.artist, .length) {\n font-size: .8em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .9);\n }\n }\n\n & > .preview-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0;\n width: 40px;\n height: 40px;\n\n position: absolute;\n right: 8px;\n top: 8px;\n\n border-radius: 50%;\n padding: 0;\n }\n }\n }\n\n .control-container {\n border: 1px solid;\n\n border-radius: 12px;\n margin-bottom: 15px;\n padding: 18px 22px;\n\n font-size: .9em;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n & > .control-container-title {\n margin-bottom: 12px;\n\n font-size: 1.1em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n &.margin-top {\n margin-top: 10px;\n }\n }\n\n & > .control-keys {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n\n & > div {\n display: flex;\n align-items: center;\n width: max-content;\n\n border: 1px solid;\n\n border-radius: 8px;\n padding: 8px 14px;\n\n font-weight: 500;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .3);\n\n color: rgba(192, 192, 192, 1);\n\n background: rgba(50, 54, 66, .9);\n\n &:not(.key-select):hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(60, 64, 78, .95);\n }\n\n &.key-select {\n border: 2px dashed;\n\n font-style: italic;\n\n /* Theme dependent */\n border-color: rgba(192, 192, 192, .6);\n box-shadow: 0 0 10px rgba(192, 192, 192, .4);\n\n background: rgba(192, 192, 192, .1);\n }\n\n &.duplicate {\n border: 2px dashed;\n\n /* Theme dependent */\n border-color: rgba(255, 87, 34, 1);\n box-shadow: 0 0 10px rgba(255, 87, 34, .5);\n\n background: rgba(255, 87, 34, .1);\n }\n\n & > .key-elem-title {\n margin-right: 10px;\n }\n\n &.add, & > .remove {\n cursor: pointer;\n }\n }\n }\n\n & > .control-actions {\n .control-action {\n border-left: 2px solid;\n\n margin-top: 12px;\n padding-left: 16px;\n\n /* Theme dependent */\n border-left-color: rgba(102, 126, 234, .5);\n\n & > .control-action-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n margin-bottom: 8px;\n\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n\n span {\n margin-right: 5px;\n }\n\n & > .control-action-title-left {\n white-space: nowrap;\n\n overflow-x: auto;\n\n & > span {\n width: 17px;\n }\n\n & > select {\n border-radius: 6px;\n margin: 0 5px;\n padding: 6px 10px;\n }\n\n & > .params {\n font-size: .85em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n & > .condition-parameter {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n margin: 0 4px;\n\n & > select,\n & > input:not([type=checkbox]) {\n border-radius: 6px;\n padding: 6px 10px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 18px;\n height: 18px;\n }\n }\n }\n }\n\n & > .control-action-title-right {\n display: flex;\n\n & > span {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display:flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n\n border-radius: 5px;\n margin-right: 0;\n\n font-size: 1.2em;\n\n transition: background .1s ease;\n\n &:hover {\n /* Theme dependent */\n background: rgba(255, 255, 255, .1);\n }\n }\n }\n }\n\n & > .action-parameter {\n border: 1px solid;\n\n border-radius: 8px;\n margin-top: 10px;\n padding: 12px 14px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .3);\n\n & > .parameter-title {\n margin-bottom: 8px;\n\n font-size: .9em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(180, 190, 210, 1);\n }\n\n & > select,\n & > input:not([type=checkbox]),\n & > duration-input {\n width: 100%;\n\n border-radius: 6px;\n padding: 8px 12px;\n }\n\n & > input[type=checkbox] {\n cursor: pointer;\n\n width: 20px;\n height: 20px;\n }\n }\n }\n\n & > .control-bottom-container {\n display: flex;\n justify-content: space-between;\n\n margin-top: 10px;\n\n & > div {\n display: flex;\n\n & > .add-action-button {\n width: max-content;\n\n border-radius: 8px;\n padding: 8px 16px;\n\n font-weight: 500;\n }\n }\n }\n }\n }\n\n .text-input-container {\n display: flex;\n gap: 12px;\n\n border-style: 2px dashed;\n\n border-radius: 12px;\n margin-top: 18px;\n padding: 16px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .35);\n\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 0.15),\n rgba(118, 75, 162, 0.15)\n );\n\n & > input[type=\"text\"] {\n flex: 1;\n\n border-style: dashed;\n\n border-radius: 10px;\n padding: 10px 16px;\n\n font-size: .95em;\n\n &:focus {\n border-style: solid;\n }\n }\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n\n margin-top: 20px;\n\n & > .stat-card {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n width: 100%;\n height: 150px;\n\n background-color: transparent;\n\n perspective: 1000px;\n\n transition: transform .3s ease;\n\n &:hover, &:active {\n transform: scale(1.05);\n\n & > .inside {\n transform: rotateY(180deg);\n\n &::before {\n opacity: 1;\n }\n }\n }\n\n & > .inside {\n width: 100%;\n height: 100%;\n\n position: relative;\n\n transform-style: preserve-3d;\n\n transition: transform 0.8s linear(\n 0, 0.005, 0.02 2.2%, 0.046 4.5%, 0.182 11.5%,\n 0.318 16.3%, 0.459 20.6%, 0.601 24.6%, 0.738 28.6%,\n 0.863 32.7%, 0.954 37%, 1.015 41.8%, 1.049 47.4%,\n 1.059, 1.047 57.3%, 1.03 63.5%, 1.012 70.9%,\n 1.002 79.5%, 1\n );\n\n &::before {\n inset: -2px;\n\n border-radius: 14px;\n padding: 2px;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n }\n\n & > :is(.front, .back) {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n position: absolute;\n\n border: 2px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n text-align: center;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .25);\n\n &.front {\n justify-content: center;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .15),\n rgba(118, 75, 162, .15)\n );\n }\n &.back {\n transform: rotateY(180deg);\n\n overflow: hidden auto;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(118, 75, 162, .15),\n rgba(102, 126, 234, .15)\n );\n\n &::-webkit-scrollbar {\n width: 8px;\n }\n &::-webkit-scrollbar-thumb {\n border-radius: 4px;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .4);\n }\n &::-webkit-scrollbar-track {\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n }\n\n & > .stat-value {\n margin-bottom: 8px;\n\n font-size: 2.2em;\n font-weight: 700;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 75, 162, 1)\n );\n\n /* Theme independent */\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .stat-label {\n margin-bottom: 4px;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .stat-sublabel {\n font-size: .8em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n\n &:not(:last-child) {\n margin-bottom: 8px;\n }\n }\n }\n }\n }\n }\n\n .changelog-content {\n & > .changelog-header {\n border-bottom: 2px solid;\n\n padding-bottom: 24px;\n margin-bottom: 8px;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n\n & > h1 {\n margin: 0 0 10px 0;\n\n font-size: 2.5em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n\n & > i {\n margin-right: 12px;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > .changelog-subtitle {\n margin: 0 0 20px 0;\n\n font-size: 1.1em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .9);\n }\n\n & > .changelog-nav {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n gap: 8px;\n\n & > .changelog-nav-item {\n cursor: pointer;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 6px 16px;\n\n font-size: .85em;\n font-weight: 600;\n text-decoration: none;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n color: rgba(200, 200, 200, .9);\n background: rgba(102, 126, 234, .08);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n color: rgba(255, 255, 255, 1);\n background: rgba(102, 126, 234, .2);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .3),\n rgba(118, 168, 255, .3)\n );\n box-shadow: 0 0 12px rgba(102, 126, 234, .3);\n }\n }\n }\n }\n\n & > .changelog-divider {\n height: 2px;\n\n margin: 48px auto 8px;\n\n border-radius: 1px;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(102, 126, 234, .4) 20%,\n rgba(118, 168, 255, .4) 50%,\n rgba(102, 126, 234, .4) 80%,\n transparent\n );\n }\n\n & > .changelog-version {\n margin-top: 32px;\n padding: 24px;\n\n border: 1px solid;\n border-radius: 16px;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n background: rgba(30, 33, 42, .4);\n\n & > .changelog-version-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n\n border-bottom: 1px solid;\n\n text-align: center;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n & > .version-badge-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n\n margin-bottom: 12px;\n\n & > .version-badge {\n display: inline-block;\n\n border: 1px solid;\n border-radius: 20px;\n padding: 4px 16px;\n\n font-size: .8em;\n font-weight: 700;\n font-family: 'Courier New', monospace;\n letter-spacing: .5px;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n color: rgba(118, 168, 255, 1);\n background: rgba(102, 126, 234, .12);\n }\n\n & > .version-tag {\n display: inline-block;\n\n border-radius: 20px;\n padding: 4px 12px;\n\n font-size: .7em;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 1px;\n\n &.latest {\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .4);\n }\n }\n }\n\n & > h1 {\n margin: 0 0 8px 0;\n\n font-size: 1.6em;\n font-weight: 800;\n\n /* Theme dependent */\n background: linear-gradient(135deg, rgba(102, 126, 234, 1), rgba(118, 168, 255, 1));\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n & > .changelog-version-subtitle {\n margin: 0;\n\n font-size: .9em;\n font-weight: 400;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .7);\n\n & > i {\n margin-right: 4px;\n }\n }\n }\n\n & > .changelog-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: 24px;\n\n margin: 0 auto;\n padding: 0;\n\n & > .card {\n position: relative;\n\n border: 1px solid;\n\n border-radius: 12px;\n padding: 20px;\n\n overflow: hidden;\n\n transition: border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n\n background: rgba(40, 43, 52, .6);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &::before {\n content: '';\n\n height: 3px;\n\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n\n opacity: 0;\n\n transition: opacity .3s ease;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n rgba(102, 126, 234, .8),\n rgba(118, 168, 255, .8)\n );\n }\n\n &:hover {\n transform: translateY(-4px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .5),\n 0 0 0 1px rgba(102, 126, 234, .2);\n\n background: rgba(40, 43, 52, .85);\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n transform: scale(1.1) rotate(5deg);\n }\n }\n\n &.featured {\n grid-column: 1 / -1;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n background: linear-gradient(135deg,\n rgba(40, 43, 52, .8),\n rgba(50, 53, 62, .8)\n );\n\n &::before {\n opacity: 1;\n }\n\n & > .card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25),\n rgba(118, 168, 255, .25)\n );\n }\n }\n\n & > .card-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n\n border-radius: 12px;\n margin-bottom: 16px;\n\n transition: transform .3s ease;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n\n & > i {\n font-size: 24px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, 1),\n rgba(118, 168, 255, 1)\n );\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n }\n\n & > h2 {\n margin: 0 0 12px 0;\n\n font-size: 1.35em;\n font-weight: 700;\n letter-spacing: -0.02em;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, .95);\n }\n\n & > p {\n margin: 0 0 16px 0;\n\n font-size: .95em;\n line-height: 1.6em;\n\n /* Theme dependent */\n color: rgba(118, 168, 255, .9);\n }\n\n & > ul {\n margin: 0;\n padding-left: 24px;\n\n font-size: .9em;\n line-height: 1.7em;\n\n /* Theme dependent */\n color: rgba(229, 229, 229, .9);\n\n & > li {\n margin-bottom: 8px;\n padding-left: 4px;\n\n &::marker {\n /* Theme dependent */\n color: rgba(102, 126, 234, .8);\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n & > strong {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(255, 255, 255, 1);\n }\n\n & > code {\n border-radius: 4px;\n padding: 2px 6px;\n\n font-family: 'Courier New', monospace;\n font-size: .9em;\n\n /* Theme dependent */\n background: rgba(102, 126, 234, .15);\n color: rgba(118, 168, 255, 1);\n }\n\n & > ul {\n margin-top: 6px;\n padding-left: 20px;\n\n & > li {\n font-size: .95em;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, .85);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .about-content {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n border: 1px solid;\n\n border-radius: 16px;\n padding: 0;\n\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .25);\n box-shadow: 0 8px 32px rgba(0, 0, 0, .4),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n background: linear-gradient(135deg,\n rgba(30, 33, 42, .95),\n rgba(25, 28, 36, .9)\n );\n -webkit-backdrop-filter: blur(20px);\n backdrop-filter: blur(20px);\n\n & > .about-version {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n\n padding: 32px;\n\n font-size: 1.3em;\n font-weight: 700;\n letter-spacing: .5px;\n\n /* Theme dependent */\n box-shadow: 0 4px 20px rgba(143, 163, 255, .25),\n inset 0 1px 0 rgba(255, 255, 255, .15),\n inset 0 -1px 0 rgba(0, 0, 0, .3);\n\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .25),\n rgba(118, 75, 162, .2)\n );\n\n & > .fa {\n font-size: 1.5em;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n filter: drop-shadow(0 2px 8px rgba(143, 163, 255, .6));\n }\n }\n\n & > .about-tagline {\n padding: 24px 32px;\n\n text-align: center;\n\n /* Theme dependent */\n border-bottom: 1px solid rgba(255, 255, 255, .08);\n\n & > p {\n margin: 0;\n\n font-size: 1.05em;\n line-height: 1.6;\n\n /* Theme dependent */\n color: rgba(180, 185, 200, 1);\n }\n }\n\n & > .about-links {\n display: flex;\n flex-direction: column;\n gap: 0;\n\n padding: 16px;\n\n & > .link-card {\n display: flex;\n align-items: center;\n gap: 16px;\n\n border: 1px solid;\n border-radius: 12px;\n margin-bottom: 12px;\n padding: 16px 20px;\n\n text-decoration: none;\n\n transition:\n border-color .3s ease,\n box-shadow .3s ease,\n background .3s ease,\n transform .3s ease,\n border-left-color .3s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n border-left: 3px solid rgba(143, 163, 255, .35);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .6) 40%\n );\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &:hover {\n transform: translateX(6px);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .5);\n border-left-color: rgba(143, 163, 255, .8);\n box-shadow: 0 6px 24px rgba(143, 163, 255, .2),\n 0 2px 12px rgba(0, 0, 0, .3),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n\n background: linear-gradient(90deg,\n rgba(143, 163, 255, .15),\n rgba(118, 75, 162, .08) 50%\n );\n\n & > .link-card-icon {\n transform: scale(1.1);\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .25);\n }\n\n & > .link-card-arrow {\n transform: translateX(4px);\n\n opacity: 1;\n }\n }\n\n & > .link-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n\n border-radius: 10px;\n\n font-size: 1.3em;\n\n transition:\n transform .3s ease,\n background .3s ease;\n\n /* Theme dependent */\n background: rgba(143, 163, 255, .15);\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .link-card-content {\n flex: 1;\n text-align: left;\n\n & > .link-card-title {\n margin-bottom: 4px;\n\n font-size: 1em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n }\n\n & > .link-card-desc {\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n & > .link-card-arrow {\n font-size: 1.2em;\n\n opacity: .5;\n\n transition:\n transform .3s ease,\n opacity .3s ease;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .about-footer {\n padding: 0;\n\n & > .footer-divider {\n height: 1px;\n\n margin: 0;\n\n /* Theme dependent */\n background: linear-gradient(90deg,\n transparent,\n rgba(143, 163, 255, .3) 20%,\n rgba(143, 163, 255, .3) 80%,\n transparent\n );\n }\n\n & > .about-credits {\n padding: 24px;\n\n & > div {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(max(280px, calc(50% - 6px)), 1fr));\n gap: 12px;\n\n &:not(:last-child) {\n margin-bottom: 12px;\n }\n\n & > .credit-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n border-radius: 14px;\n padding: 14px 16px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .06);\n border-top: 2px solid rgba(143, 163, 255, .18);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .06),\n rgba(40, 43, 52, .4) 30%\n );\n\n &:hover {\n transform: translateY(-3px) scale(1.01);\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n border-top-color: rgba(143, 163, 255, .5);\n box-shadow: 0 6px 20px rgba(143, 163, 255, .18),\n 0 2px 8px rgba(0, 0, 0, .25);\n\n background: linear-gradient(180deg,\n rgba(143, 163, 255, .1),\n rgba(40, 43, 52, .6) 40%\n );\n }\n\n & > .credit-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n\n border-radius: 50%;\n\n font-size: 1.1em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .15)\n );\n\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n & > .credit-info {\n flex: 1;\n min-width: 0;\n text-align: left;\n\n & > .credit-name {\n position: relative;\n overflow: hidden;\n\n margin-bottom: 2px;\n\n font-size: .95em;\n font-weight: 700;\n\n /* Theme dependent */\n color: rgba(220, 220, 220, 1);\n\n & > span {\n display: inline-block;\n white-space: nowrap;\n }\n }\n\n & > .credit-role {\n font-size: .8em;\n line-height: 1.4;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n /* Theme dependent */\n color: rgba(160, 160, 160, 1);\n }\n }\n\n &:hover {\n & > .credit-info {\n & > .credit-name > span {\n animation: scroll-text 3s linear infinite;\n }\n }\n }\n }\n\n & > .copyright-card {\n cursor: pointer;\n\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n text-align: center;\n overflow: hidden;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .04);\n\n background: rgba(35, 38, 46, .3);\n\n & > .copyright-title {\n margin-bottom: 2px;\n\n font-size: .9em;\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(200, 200, 200, 1);\n }\n\n & > .copyright-desc {\n font-size: .75em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(140, 140, 140, 1);\n }\n }\n }\n }\n }\n }\n\n &#ollama-server-url {\n & > .connection-status-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n &:has(#settings-ollama-connection-status:empty) {\n display: none;\n }\n\n &.testing {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.connected {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .7);\n box-shadow: 0 2px 8px rgba(76, 175, 80, .4);\n\n background: rgba(76, 175, 80, .1);\n }\n &.failed {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > #settings-connection-status {\n font-size: .9em;\n }\n }\n }\n\n &#ollama-model-select {\n .models-container {\n border: 1px solid;\n\n margin-top: 10px;\n\n text-align: center;\n\n transition: border-color .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n &.searching {\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .7);\n box-shadow: 0 2px 8px rgba(143, 163, 255, .4);\n\n background: rgba(143, 163, 255, .1);\n }\n &.none {\n /* Theme dependent */\n border-color: rgba(255, 193, 7, .7);\n box-shadow: 0 2px 8px rgba(255, 193, 7, .4);\n\n background: rgba(255, 193, 7, .1);\n }\n &.error {\n /* Theme dependent */\n border-color: rgba(211, 47, 47, .7);\n box-shadow: 0 2px 8px rgba(211, 47, 47, .4);\n\n background: rgba(211, 47, 47, .1);\n }\n\n & > p {\n font-size: .9em;\n font-style: italic;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n\n & > #settings-ollama-models {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 8px;\n\n &:not(:empty) {\n margin-top: 8px;\n }\n\n & > .model {\n cursor: pointer;\n\n border: 2px solid;\n\n border-radius: 8px;\n padding: 12px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(102, 126, 234, 1);\n box-shadow: 0 4px 12px rgba(20, 20, 30, .4);\n\n background: rgba(50, 54, 66, .9);\n }\n\n &.selected {\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, 1);\n box-shadow: 0 0 15px rgba(143, 163, 255, .5);\n\n background: rgba(143, 163, 255, .1);\n\n & > .model-top {\n & > .fa {\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n }\n\n & > .model-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n\n & > .fa {\n /* Theme dependent */\n color: rgba(128, 128, 128, .5);\n }\n\n & > .model-name {\n font-weight: 600;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .pseudo-indicator {\n pointer-events: none;\n\n opacity: 0;\n }\n }\n\n & > .model-bottom {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n\n font-size: .85em;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n }\n }\n }\n\n &#ollama-setup {\n & > .settings-section-title {\n /* Theme dependent */\n color: rgba(255, 54, 34, 1);\n }\n & > .settings-section-desc {\n border-left: 4px solid;\n\n border-radius: 6px;\n padding: 10px;\n\n /* Theme dependent */\n border-left-color: rgba(255, 193, 7, 1);\n\n background: rgba(255, 193, 7, .125);\n\n color: rgba(225, 225, 225, 1);\n }\n }\n\n &.save {\n & > .save-settings-header {\n margin-bottom: 16px;\n }\n\n & > .save-settings-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .save-settings-card {\n border: 1px solid;\n border-radius: 12px;\n overflow: hidden;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(40, 43, 52, .5);\n box-shadow: 0 2px 12px rgba(0, 0, 0, .2);\n\n transition: border-color .3s ease, box-shadow .3s ease;\n\n &:hover {\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .15);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .3);\n }\n\n & > .card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n\n padding: 14px 16px;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(50, 54, 66, .6),\n rgba(40, 43, 52, .6)\n );\n border-bottom: 1px solid rgba(255, 255, 255, .06);\n\n & > .card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 10px;\n\n font-size: 1.25em;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n box-shadow: 0 4px 12px rgba(143, 163, 255, .15);\n }\n\n & > .card-header-content {\n flex: 1;\n\n & > .card-title {\n font-size: 1.1em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(232, 232, 232, 1);\n }\n\n & > .card-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(187, 187, 187, 1);\n }\n }\n\n & > .card-toggle {\n flex-shrink: 0;\n }\n }\n\n & > .card-body {\n padding: 12px;\n\n & > .action-buttons-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n\n & > .action-card {\n cursor: pointer;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n border: 1px solid;\n border-radius: 10px;\n padding: 12px 14px;\n\n transition: all .3s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .08);\n background: rgba(46, 52, 66, .6);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .2);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .25);\n background: rgba(56, 62, 76, .7);\n }\n\n &:active {\n transform: translateY(0);\n\n /* Theme dependent */\n box-shadow: 0 2px 8px rgba(0, 0, 0, .15);\n }\n\n & > .action-card-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n\n border-radius: 8px;\n\n font-size: 1.15em;\n flex-shrink: 0;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n }\n\n & > .action-card-content {\n flex: 1;\n\n & > .action-card-title {\n font-size: .95em;\n font-weight: 600;\n margin-bottom: 1px;\n\n /* Theme dependent */\n color: rgba(224, 224, 224, 1);\n }\n\n & > .action-card-desc {\n font-size: .85em;\n line-height: 1.4;\n\n /* Theme dependent */\n color: rgba(170, 170, 170, 1);\n }\n }\n\n &.export-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .2),\n rgba(56, 142, 60, .2)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.import-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(143, 163, 255, .2),\n rgba(118, 75, 162, .2)\n );\n color: rgba(143, 163, 255, 1);\n }\n\n &.active {\n /* Theme dependent */\n border-color: rgba(76, 175, 80, .5);\n background: rgba(76, 175, 80, .1);\n\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .3),\n rgba(56, 142, 60, .3)\n );\n color: rgba(76, 175, 80, 1);\n }\n }\n }\n\n &.reset-card {\n & > .action-card-icon {\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .2),\n rgba(183, 28, 28, .2)\n );\n color: rgba(211, 47, 47, 1);\n }\n }\n }\n }\n\n & > .status-message {\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n animation: scale-in .3s ease;\n\n &.hidden {\n display: none;\n }\n\n & > .status-content {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n\n & > .status-icon {\n font-size: 1.25em;\n flex-shrink: 0;\n margin-top: 1px;\n }\n\n & > .status-text {\n flex: 1;\n\n & > .status-title {\n font-size: .95em;\n font-weight: 700;\n margin-bottom: 2px;\n\n /* Theme dependent */\n color: rgba(240, 240, 240, 1);\n }\n\n & > .status-desc {\n font-size: .9em;\n line-height: 1.5;\n\n /* Theme dependent */\n color: rgba(210, 210, 210, 1);\n }\n }\n }\n\n &.success {\n /* Theme dependent */\n border: 1px solid rgba(76, 175, 80, .4);\n background: linear-gradient(135deg,\n rgba(76, 175, 80, .15),\n rgba(56, 142, 60, .1)\n );\n box-shadow: 0 4px 16px rgba(76, 175, 80, .2);\n\n & > .status-content > .status-icon {\n color: rgba(76, 175, 80, 1);\n }\n }\n\n &.error {\n /* Theme dependent */\n border: 1px solid rgba(211, 47, 47, .4);\n background: linear-gradient(135deg,\n rgba(211, 47, 47, .15),\n rgba(183, 28, 28, .1)\n );\n box-shadow: 0 4px 16px rgba(211, 47, 47, .2);\n\n & > .status-content > .status-icon {\n color: rgba(211, 47, 47, 1);\n }\n }\n\n &.info {\n /* Theme dependent */\n border: 1px solid rgba(255, 193, 7, .4);\n background: linear-gradient(135deg,\n rgba(255, 193, 7, .15),\n rgba(255, 152, 0, .1)\n );\n box-shadow: 0 4px 16px rgba(255, 193, 7, .2);\n\n & > .status-content > .status-icon {\n color: rgba(255, 193, 7, 1);\n }\n }\n }\n\n & > .import-textarea {\n width: 100%;\n min-height: 140px;\n\n border: 2px solid;\n\n border-radius: 10px;\n margin-top: 12px;\n padding: 12px 14px;\n\n font-family: 'Courier New', Consolas, monospace;\n font-size: .88em;\n line-height: 1.6;\n\n resize: vertical;\n\n animation: scale-in .3s ease;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .3);\n background: rgba(20, 23, 32, .8);\n color: rgba(220, 220, 220, 1);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3);\n\n &:focus {\n outline: none;\n\n /* Theme dependent */\n border-color: rgba(143, 163, 255, .6);\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, .3),\n 0 0 0 3px rgba(143, 163, 255, .15);\n }\n\n &.hidden {\n display: none;\n }\n\n &::placeholder {\n /* Theme dependent */\n color: rgba(130, 130, 130, 1);\n }\n }\n }\n }\n }\n }\n\n .list-container {\n & > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n border: 1px solid;\n\n border-radius: 8px;\n margin-bottom: 8px;\n padding: 8px;\n padding-left: 15px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .7);\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 20px rgba(0, 0, 0, .4);\n\n background: rgba(40, 43, 52, .9);\n }\n\n &.empty {\n padding: 20px;\n\n text-align: center;\n\n opacity: .6;\n }\n\n & > div {\n display: flex;\n flex-direction: column;\n gap: 4px;\n\n a > {\n font-weight: 600;\n word-break: break-all;\n }\n\n & > span {\n font-size: .85em;\n\n opacity: .7;\n }\n\n & > .add-action-button {\n cursor: pointer;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n\n border-radius: 6px;\n\n font-size: 1em;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, .05);\n\n &:hover {\n /* Theme dependent */\n background: rgba(102, 126, 234, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(102, 126, 234, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n\n &.remove-button {\n /* Theme dependent */\n background: rgba(211, 47, 47, .1);\n\n &:hover {\n /* Theme dependent */\n background: rgba(211, 47, 47, .2);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n }\n &:active {\n /* Theme dependent */\n background: rgba(211, 47, 47, .3);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n }\n }\n }\n }\n }\n }\n\n .settings-compact-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 18px;\n\n margin-bottom: 25px;\n }\n\n .draggable-order-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n\n &.is-dragging .draggable-order-item {\n pointer-events: none;\n\n &:hover {\n transform: none;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: none;\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n opacity: .5;\n\n color: inherit;\n }\n }\n }\n\n & > .draggable-order-item-wrapper {\n position: relative;\n\n transition: transform .2s cubic-bezier(0.2, 0, 0, 1);\n\n &.dragging {\n z-index: 4;\n\n &::after {\n content: '';\n\n width: 100%;\n height: 100%;\n\n border: 2px dashed;\n\n border-radius: 10px;\n\n position: absolute;\n top: 0;\n left: 0;\n\n pointer-events: none;\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .8);\n box-shadow: 0 0 20px rgba(102, 126, 234, .4),\n inset 0 0 20px rgba(102, 126, 234, .15);\n\n background: rgba(102, 126, 234, .1);\n }\n\n & > .draggable-order-item {\n visibility: hidden;\n }\n }\n }\n\n .draggable-order-item {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 14px;\n\n border: 1px solid;\n\n border-radius: 10px;\n padding: 14px 18px;\n\n transition: background .2s ease,\n border-color .2s ease,\n box-shadow .2s ease,\n transform .2s ease,\n opacity .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n\n background: rgba(40, 43, 52, .8);\n\n &::before {\n content: '\\f0c9';\n\n font-family: 'Font Awesome 6 Free';\n font-size: .9em;\n font-weight: 900;\n\n opacity: .5;\n\n transition: opacity .2s ease,\n color .2s ease;\n }\n\n &:hover {\n transform: translateY(-2px);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .4);\n box-shadow: 0 6px 24px rgba(0, 0, 0, .4);\n\n background: rgba(50, 54, 66, .9);\n\n &::before {\n opacity: .8;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n }\n\n &:active {\n cursor: grabbing;\n\n transform: scale(1.02);\n\n /* Theme dependent */\n border-color: rgba(102, 126, 234, .6);\n box-shadow: 0 8px 32px rgba(102, 126, 234, .3);\n\n background: rgba(60, 65, 80, .95);\n }\n\n &.disabled {\n opacity: .5;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .05);\n\n background: rgba(30, 32, 38, .6);\n\n & > .draggable-order-item-name {\n /* Theme dependent */\n color: rgba(150, 150, 150, 1);\n }\n\n & > .draggable-order-item-toggle {\n /* Theme dependent */\n background: rgba(80, 80, 80, .5);\n\n &::before {\n transform: translateX(0);\n\n /* Theme dependent */\n background: rgba(120, 120, 120, 1);\n }\n }\n\n &:hover {\n opacity: .7;\n\n transform: translateY(-1px);\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n }\n }\n\n & > .draggable-order-item-name {\n flex: 1;\n\n font-size: .95em;\n font-weight: 500;\n\n /* Theme dependent */\n color: rgba(230, 230, 230, 1);\n }\n\n & > .draggable-order-item-toggle {\n cursor: pointer;\n\n flex-shrink: 0;\n width: 44px;\n height: 24px;\n\n border-radius: 100vh;\n\n position: relative;\n\n transition: background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .8),\n rgba(118, 75, 162, .8)\n );\n box-shadow: 0 2px 8px rgba(102, 126, 234, .3);\n\n &::before {\n content: '';\n\n width: 18px;\n height: 18px;\n\n border-radius: 50%;\n\n position: absolute;\n top: 3px;\n left: 3px;\n\n transform: translateX(20px);\n\n transition: transform .2s ease,\n background .2s ease,\n box-shadow .2s ease;\n\n /* Theme dependent */\n background: rgba(255, 255, 255, 1);\n box-shadow: 0 2px 4px rgba(0, 0, 0, .2);\n }\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px rgba(102, 126, 234, .5);\n }\n }\n }\n }\n }\n }\n }\n }\n\n select, input:not([type=range]), textarea, button {\n border: 1px solid transparent;\n\n border-radius: 8px;\n padding: 8px 12px;\n\n font-family: inherit;\n font-size: inherit;\n color: var(--color, inherit);\n\n transition: border .2s ease,\n background .2s ease,\n box-shadow .2s ease,\n transform .2s ease;\n\n /* Theme dependent */\n box-shadow: 0 2px 8px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .3), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .9);\n\n &:hover {\n /* Theme dependent */\n box-shadow: 0 4px 12px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .4), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), 1);\n }\n &:not(input, textarea):active {\n /* Theme dependent */\n box-shadow: 0 1px 4px color-mix(in srgb, rgba(var(--background, 46, 52, 66), .2), rgba(0, 0, 0, 1));\n\n background: rgba(var(--background, 46, 52, 66), .95);\n }\n\n &[type=number] {\n -moz-appearance: textfield;\n appearance: textfield;\n\n &::-webkit-inner-spin-button,\n &::-webkit-outer-spin-button {\n -webkit-appearance: none;\n appearance: none;\n\n margin: 0;\n }\n }\n }\n\n button {\n cursor: pointer !important;\n\n &:hover {\n transform: translateY(-2px);\n }\n &:active {\n transform: translateY(0);\n }\n }\n\n duration-input {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n\n border: 1px solid;\n border-radius: 12px;\n padding: 16px;\n\n font-family: inherit;\n font-size: .9em;\n\n transition: border-color .2s ease,\n box-shadow .2s ease,\n background .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n box-shadow: 0 2px 8px rgba(0, 0, 0, .2);\n background: rgba(40, 43, 52, .7);\n -webkit-backdrop-filter: blur(10px);\n backdrop-filter: blur(10px);\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n box-shadow: 0 4px 12px rgba(0, 0, 0, .3);\n background: rgba(40, 43, 52, .85);\n }\n\n & > .infinity-label {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n\n display: flex;\n align-items: center;\n gap: 10px;\n\n position: relative;\n\n border: 1px solid;\n border-radius: 8px;\n padding: 10px 14px;\n\n font-weight: 500;\n font-size: .95em;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(220, 220, 220, 1);\n background: rgba(35, 38, 48, .6);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2);\n\n &::after {\n content: '\\f00c';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n\n position: absolute;\n top: 50%;\n right: 12px;\n\n font-size: 13px;\n line-height: 1;\n\n opacity: 0;\n transform: translateY(-50%) scale(0);\n\n transition: all .2s cubic-bezier(.4, 0, .2, 1);\n\n /* Theme dependent */\n color: rgba(143, 163, 255, 1);\n }\n\n & > span {\n flex: 1;\n letter-spacing: .3px;\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(45, 48, 58, .8);\n box-shadow: 0 3px 10px rgba(0, 0, 0, .3);\n }\n\n &.selected {\n border-color: rgba(102, 126, 234, .5);\n color: rgba(255, 255, 255, 1);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .2) 0%,\n rgba(118, 75, 162, .2) 100%\n );\n box-shadow: 0 3px 12px rgba(102, 126, 234, .25),\n inset 0 1px 0 rgba(255, 255, 255, .08);\n\n &::after {\n opacity: 1;\n transform: translateY(-50%) scale(1);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .6);\n background: linear-gradient(135deg,\n rgba(102, 126, 234, .25) 0%,\n rgba(118, 75, 162, .25) 100%\n );\n box-shadow: 0 4px 16px rgba(102, 126, 234, .35),\n inset 0 1px 0 rgba(255, 255, 255, .1);\n }\n }\n }\n\n & > .duration-inputs {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n\n opacity: 1;\n transform: scale(1);\n\n transition: opacity .2s ease,\n transform .2s cubic-bezier(.4, 0, .2, 1);\n\n & > label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n\n & > span {\n font-size: .75em;\n font-weight: 600;\n letter-spacing: .5px;\n text-align: center;\n text-transform: uppercase;\n\n /* Theme dependent */\n color: rgba(143, 163, 255, .85);\n }\n\n & > input {\n cursor: text;\n\n width: 100%;\n\n border: 1px solid;\n border-radius: 6px;\n padding: 8px 10px;\n\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: .95em;\n font-weight: 500;\n text-align: center;\n\n transition: all .2s ease;\n\n /* Theme dependent */\n border-color: rgba(255, 255, 255, .1);\n color: rgba(230, 230, 230, 1);\n background: rgba(30, 33, 42, .9);\n box-shadow: 0 2px 6px rgba(0, 0, 0, .2),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n\n &::placeholder {\n color: rgba(150, 154, 170, .6);\n }\n\n &:hover {\n border-color: rgba(102, 126, 234, .3);\n background: rgba(35, 38, 48, 1);\n box-shadow: 0 3px 8px rgba(0, 0, 0, .25),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &:focus {\n outline: none;\n border-color: rgba(102, 126, 234, .6);\n background: rgba(40, 43, 52, 1);\n box-shadow: 0 0 0 2px rgba(102, 126, 234, .2),\n 0 2px 10px rgba(102, 126, 234, .15),\n inset 0 1px 2px rgba(0, 0, 0, .3);\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n }\n }\n\n &:has(.infinity-label.selected) > .duration-inputs {\n opacity: .4;\n transform: scale(.98);\n pointer-events: none;\n }\n }\n\n #reset-statistics-button {\n float: right;\n\n font-size: 1rem;\n\n /* Theme dependent */\n --background: 211, 51, 51;\n }\n\n #settings-ollama-refresh-models {\n float: right;\n\n font-size: 1rem;\n }\n }\n\n .ws-username-highlight {\n position: relative;\n\n &::before {\n content: \"\";\n\n pointer-events: none;\n\n position: absolute;\n inset: 0;\n\n border-radius: 10px;\n border: 2px solid;\n\n /* Theme dependent */\n border-color: rgba(255, 193, 7, 1);\n }\n }\n}"},4192(e,t){function n(){return crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}Object.defineProperty(t,"__esModule",{value:!0}),t.generateRandomUUID=function(){return 0===s.length?n():s.pop()};const s=[];"function"==typeof requestIdleCallback&&requestIdleCallback(function e(){s.length<256&&s.push(n()),requestIdleCallback(e)})},4041(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.CreateDOMElement=function(e,t={}){const n=document.createElement(e);"id"in t&&(n.id=t.id);"class"in t&&(n.className=t.class);"text"in t&&(n.textContent=t.text);"html"in t&&(n.innerHTML=t.html);"content"in t&&n.append(t.content);"value"in t&&(n.value=t.value);if("attributes"in t)for(const[e,s]of Object.entries(t.attributes||{}))n.setAttribute(e,s);if("dataset"in t)for(const[e,s]of Object.entries(t.dataset||{}))n.dataset[e]=s;if("style"in t)for(const[e,s]of Object.entries(t.style||{}))n.style.setProperty(e,s);return n}},5643(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.fullTrim=void 0;t.fullTrim=e=>{const t=e.split("\n"),n=t.length;let s=!0,i=1/0,a=[],r=[];for(let e=0;e<n;e++){const n=t[e];if(""===n.trim()){if(s)continue;a.push("")}else{s?s=!1:(r=r.concat(a),a=[]);const e=n.match(/^(\s*)/)[0].length;i=Math.min(i,e),r.push(n)}}const o=r.length;if(0===o)return"";const l=[];for(let e=0;e<o;e++){const t=r[e].trimEnd();""===t?l.push(""):l.push(t.slice(i))}return l.join("\n")}},2852(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Memory=void 0;t.Memory=class{constructor(e={}){this.order=[],this.store=new Map,this.timeouts=new Map,"timeout"in e&&(this.timeout=e.timeout),"size"in e&&(this.maxSize=e.size)}clear(){this.order=[],this.store.clear(),this.timeouts.clear()}has(e){return this.store.has(e)}get(e){return this.store.get(e)}set(e,t){const n=this.order.indexOf(e);-1!==n&&this.order.splice(n,1),this.order.push(e),this.store.set(e,t),this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e)),void 0!==this.timeout&&this.timeouts.set(e,setTimeout(()=>{this.delete(e)},this.timeout)),void 0!==this.maxSize&&this.store.size>this.maxSize&&this.delete(this.order.shift())}add(e){this.store.has(e)||this.set(e,!0)}delete(e){const t=this.order.indexOf(e);-1!==t&&this.order.splice(t,1),this.store.delete(e),clearTimeout(this.timeouts.get(e)),this.timeouts.delete(e)}size(){return this.store.size}}},2595(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Stack=void 0;t.Stack=class{constructor(e=50){this.items=[],this.maxSize=e}push(e){this.items.push(e),this.items.length>this.maxSize&&this.items.shift()}pop(){return this.items.pop()}unshift(e){this.items.unshift(e),this.items.length>this.maxSize&&this.items.pop()}shift(){return this.items.shift()}peek(){return this.items[this.items.length-1]}clear(){this.items=[]}get length(){return this.items.length}set length(e){this.items.length=Math.min(e,this.maxSize)}}},6873(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Trie=void 0;var s=n(4192);function i(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function a(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var r=new WeakSet;function o(e){var t;this.timeouts.has(e)&&clearTimeout(this.timeouts.get(e)),this.timeouts.delete(e);const n=this.order[e];delete this.order[e];const s=[{children:this.store}];let i=this.store;for(const e of n){const t=i.get(e);s.push(t),i=t.children}const a=s.pop();if(a.defined=!1,delete a.value,!((null===(t=a.children)||void 0===t?void 0:t.size)>0))for(let e=s.length-1;e>=0;e--){const t=s[e],i=n.pop();if(t.children.delete(i),t.children.size>0||t.defined)break;t.terminal=!0,delete t.children}}t.Trie=class{constructor(e={}){i(this,r),this.order={},this.store=new Map,this.timeouts=new Map,"timeout"in e&&(this.timeout=e.timeout),"size"in e&&(this.maxSize=e.size)}clear(){this.order={},this.store.clear(),this.timeouts.clear()}has(...e){var t;const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return!1;const e=s.get(t);if(e.terminal)return!1;s=e.children}return!0===(null===(t=s.get(n))||void 0===t?void 0:t.defined)}get(...e){var t;const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.value}set(...e){var t;const n=e.pop();let i=((e,t)=>{const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.UUID})(e);delete this.order[i],void 0===i&&(i=(0,s.generateRandomUUID)());const l=e.pop();let d=this.store;for(const t of e)if(d.has(t)){var c;const e=d.get(t);e.terminal=!1,null!==(c=e.children)&&void 0!==c||(e.children=new Map),d=e.children}else{const e={defined:!1,terminal:!1,children:new Map};d.set(t,e),d=e.children}const u=null!==(t=d.get(l))&&void 0!==t?t:{terminal:!0};u.UUID=i,u.defined=!0,u.value=n,d.set(l,u),this.order[i]=e.concat([l]),this.timeouts.has(i)&&clearTimeout(this.timeouts.get(i)),void 0!==this.timeout&&this.timeouts.set(i,setTimeout(()=>{a(r,this,o).call(this,i)},this.timeout)),void 0!==this.maxSize&&Object.keys(this.order).length>this.maxSize&&a(r,this,o).call(this,this.order.shift())}add(e){this.store.has(e)||this.set(e,!0)}delete(...e){const t=((e,t)=>{const n=e.pop();let s=this.store;for(const t of e){if(!s.has(t))return;const e=s.get(t);if(e.terminal)return;s=e.children}return null===(t=s.get(n))||void 0===t?void 0:t.UUID})(e);void 0!==t&&a(r,this,o).call(this,t)}size(){return Object.keys(this.order).length}}},4551(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.truncate=function(e,t){return e.length>t?`${e.substring(0,t-3).trimEnd()}...`:e}},1289(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.convertToUTCString=void 0;t.convertToUTCString=e=>`${e.getUTCFullYear().toString().padStart(4,"0")}-${(e.getUTCMonth()+1).toString().padStart(2,"0")}-${e.getUTCDate().toString().padStart(2,"0")}T${e.getUTCHours().toString().padStart(2,"0")}:${e.getUTCMinutes().toString().padStart(2,"0")}:${e.getUTCSeconds().toString().padStart(2,"0")}`},8678(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Ollama=t.AI=void 0;var s=n(4018),i=n(5643);function a(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o=new WeakSet;class l{static registerProvider(e,t){l.providers[e]=t}setup(e,t){if(this.analysis[e].has(t.id)){const n=this.analysis[e].get(t.id);return n.count++,n.request}const n=new AbortController,s=this.fetch(e,t,n.signal);return this.analysis[e].set(t.id,{request:s,abortController:n,count:1}),s.finally(()=>{this.analysis[e].delete(t.id)}),s}async fetch(e,t,n){return{error:"No service has been selected"}}constructor(e,t){a(this,o),r(this,"analysis",{edit:new Map,username:new Map}),r(this,"cache",{username:new Set}),r(this,"analyze",{edit:e=>this.setup("edit",e),username:e=>this.cache.username.has(e.user.name)?Promise.resolve({flag:!1,confidence:1,issues:[],explanation:"Username previously analyzed."}):(this.cache.username.add(e.user.name),this.setup("username",e))}),r(this,"cancel",{all:(e=!0)=>{if(!0===e)for(const e of Object.keys(this.analysis))for(const n of null===(t=this.analysis[e])||void 0===t?void 0:t.keys()){var t;this.cancel[e](n)}else for(const t of null===(n=this.analysis[e])||void 0===n?void 0:n.keys()){var n;this.cancel[e](t)}},edit:e=>{const t=this.analysis.edit.get(e);t&&(t.count--,t.count<=0&&(t.abortController.abort("Edit analysis canceled by user"),this.analysis.edit.delete(e)))},username:e=>{const t=this.analysis.username.get(e);t&&(t.count--,t.count<=0&&(t.abortController.abort("Username analysis canceled by user"),this.analysis.username.delete(e)))}}),r(this,"prompt",{edit:async e=>{var t,n;const a=function(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}(o,this,d).call(this,e.diff),r=null!==(t=s.namespaces.find(t=>t.id===e.ns))&&void 0!==t?t:s.namespaces[0];let l="registered";e.user.temp?l="temporary (unregistered)":e.user.ip&&(l="IP (unregistered)");const c=e.page.categories.join(", ")||"(none)",u=e.page.categories.some(e=>/living people/i.test(e));return(0,i.fullTrim)(`\nYou are an automated Wikipedia item reviewer. Analyze the following item and determine whether the CHANGES INTRODUCED violate Wikipedia policy.\n\nCRITICAL: You are evaluating what this item CHANGED, not the page content before it. The diff shows removed lines (prefixed "-") and added lines (prefixed "+"). Only ADDED content can be a new violation. Removing bad content is a GOOD item. Adding references, citations, and sources is GOOD — it improves verifiability, not the opposite.\n\nitem CONTEXT:\n- Page: "${e.page.title}" (${r.name} namespace)\n- Categories: ${c}${u?"\n- ⚠ BLP: This page is about a living person. Unsourced negative claims are a serious concern.":""}\n- User: "${e.user.name}" (${l}, warning level: ${e.user.warning}/4)\n- ORES vandalism probability: ${(100*e.ores).toFixed(0)}%\n- Size change: ${e.sizediff>0?"+":""}${e.sizediff} bytes\n- Flagged minor: ${e.minor?"yes":"no"}\n- Summary: ${e.comment||"(empty)"}\n- Tags: ${(null===(n=e.tags)||void 0===n?void 0:n.join(", "))||"(none)"}\n\nWHAT TO CHECK:\n1. VANDALISM: Does the item add nonsense, profanity as attacks, hoaxes, blanking, or deliberate misinformation? (WP:VANDALISM)\n2. NPOV: Does the item add clearly biased or one-sided language that is not presented neutrally? (WP:NPOV)\n3. VERIFIABILITY: Does the item add claims that are extraordinary or contentious WITHOUT any sourcing? Note: adding "<ref>" tags, URLs, or citation templates is adding sources — this is the OPPOSITE of a verifiability problem. (WP:V)\n4. ORIGINAL RESEARCH: Does the item add novel analysis, synthesis, or unpublished interpretation not attributable to any source? Simply adding text IS NOT original research if it restates commonly known facts or is sourced. Adding citations is NEVER original research. (WP:NOR)\n5. BLP: If this is a BLP article, does the item add unsourced or poorly-sourced negative material about the subject? (WP:BLP)\n\nWHAT IS NOT A VIOLATION:\n- Adding references, citations, "<ref>" tags, or URLs (this IMPROVES the article)\n- Removing vandalism or bad content\n- Fixing grammar, spelling, formatting, or wikilinks\n- Content about controversial topics written in a neutral, encyclopedic tone\n- Wikipedia is NOT censored — explicit content on appropriate pages is allowed (WP:NOTCENSORED)\n- Absent or auto-generated item summaries (e.g. "/* Section name */") are normal, not violations\n- ORES scores and warning levels are hints — do NOT treat them as evidence by themselves\n\nASSESSMENT SCALE:\n- "Good": No policy issues. Normal constructive item.\n- "Review": Minor concerns; a human should glance at it.\n- "Suspicious": Likely problematic; warrants close scrutiny.\n- "Bad": Clear policy violation.\n\nWhen in doubt between two ratings, choose the LESS severe one. Most items on Wikipedia are constructive — reflect that in your assessments.\n\nFor issues, use short policy codes (e.g. "WP:VANDALISM", "WP:NPOV", "WP:BLP"). Keep your explanation to 1-3 sentences.\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: <b>Clear vandalism</b> — added <code>lol hacked</code> which violates <i>WP:VANDALISM</i>.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n\nDIFF:\n${a}\n`)},username:async e=>{var t;return(0,i.fullTrim)(`\nYou are an automated Wikipedia username policy reviewer. Determine whether the username below violates Wikipedia's username policy.\n\nUSERNAME: ${e.user.name}\nPAGE CONTEXT: ${(null===(t=e.page)||void 0===t?void 0:t.title)||"(unknown)"}\n\nThe page context is provided ONLY to check for potential conflict-of-interest (e.g. a user named "AcmeCorp" iteming the Acme Corporation article). A controversial page topic does NOT make the username problematic.\n\nVIOLATION CATEGORIES (flag ONLY if the username clearly and unambiguously fits one):\n\n1. Offensive — The name is unambiguously profane, threatening, sexually explicit, or promotes vandalism. Merely edgy, weird, or humorous names do NOT qualify. (WP:U#OFFENSIVE)\n2. Disruptive — The name clearly declares intent to disrupt or vandalize (e.g. "I Will Vandalize"). (WP:U#DISRUPTIVE)\n3. Libelous — The name makes a clearly false or disparaging claim about a specific real person, or reveals private personal information. (WP:U#LIBEL)\n4. Misleading — The name impersonates a specific real person, or falsely claims special permissions by including terms like "admin", "sysop", "bureaucrat", "checkuser". (WP:U#MISLEADING)\n5. Promotional — The name is a URL or email address whose clear purpose is advertising or revenue. Containing a brand name alone is NOT enough. (WP:U#PROMO)\n6. Shared — The name unambiguously represents a company, organization, or role rather than an individual (e.g. "XYZ Foundation", "Secretary of ABC"). Names like "JohnAtAcme" or "AcmeFan123" are fine — they clearly identify an individual. (WP:U#SHARED)\n\nDECISION RULES:\n- Flag ONLY clear, unambiguous violations. Borderline = no flag.\n- Numbers at the end of a username (e.g. "itemor2847", "WikiFan99") are completely normal and NOT a violation of any kind.\n- Creative, odd, humorous, or meaningless usernames are NOT violations.\n- Containing a real word that could be offensive in some context is NOT enough — the name must be clearly and intentionally offensive.\n- When in doubt: do NOT flag. Set flag to false.\n- If not flagging, set explanation to "No violation."\n\nFORMATTING: Write your explanation as inline HTML with properly opened AND closed tags. Never use self-closing tags like <code/> or <b/> — always use an opening and closing pair.\nExample: Username contains <code>sysop</code> which falsely implies <i>WP:U#MISLEADING</i> permissions.\nAllowed tags: <b>...</b>, <i>...</i>, <code>...</code>. No markdown, no block tags.\n`)}}),this.ws=e,this.settings=e.store.settings.AI,this.config=t}async test(){return!1}async models(){return[]}}function d(e){var t;const n=document.createElement("div");n.innerHTML=e;const s=[];for(const e of n.querySelectorAll("tr")){const t=e.querySelector(".diff-deletedline"),n=e.querySelector(".diff-addedline"),i=e.querySelector(".diff-context");t&&s.push(`- ${t.textContent.trim()}`),n?s.push(`+ ${n.textContent.trim()}`):i&&s.push(` ${i.textContent.trim()}`)}return s.length>0?s.join("\n"):(null===(t=n.textContent)||void 0===t?void 0:t.trim())||""}t.AI=l,r(l,"providers",{});const c={type:"object",properties:{issues:{type:"array",items:{type:"object",properties:{policy:{type:"string"},severity:{type:"string",enum:["Low","Medium","High","Critical"]}},required:["policy","severity"]}},explanation:{type:"string"},assessment:{type:"string",enum:["Good","Review","Suspicious","Bad"]},confidence:{type:"number",minimum:0,maximum:1}},required:["assessment","confidence","issues","explanation"]},u={type:"object",properties:{issues:{type:"array",items:{type:"object",properties:{policy:{type:"string",enum:["Offensive","Disruptive","Libelous","Misleading","Promotional","Shared"]},severity:{type:"string",enum:["Low","Medium","High","Critical"]}},required:["policy","severity"]}},explanation:{type:"string"},flag:{type:"boolean"},confidence:{type:"number",minimum:0,maximum:1}},required:["flag","confidence","issues","explanation"]};class p extends l{async test(){try{return(await fetch(`${this.config.server}/api/version`,{method:"GET"})).ok}catch(e){return!1}}async models(){try{const e=await fetch(`${this.config.server}/api/tags`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Ollama API error: ${e.status} ${e.statusText}`);return(await e.json()).models||[]}catch(e){throw e}}async fetch(e,t,n=null){try{const s=this.prompt[e](t),i={method:"POST",headers:{"Content-Type":"application/json"}},a={model:this.config.model,prompt:await s,stream:!1,options:{temperature:.1,top_p:.9,num_predict:1024},format:"edit"===e?c:u};let r;i.body=JSON.stringify(a),n&&(i.signal=n);try{if(r=await fetch(`${this.config.server}/api/generate`,i),!r.ok)throw new Error(`Ollama API error: ${r.status} ${r.statusText}`);const e=await r.json();if(!e.response)throw new Error("Empty response from Ollama");return JSON.parse(e.response)}catch(e){return{error:e.message||"Ollama request failed"}}}catch(e){return{error:e.message||"Ollama request failed"}}}}t.Ollama=p,l.registerProvider("Ollama",p)},8169(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.AudioManager=void 0;var s=n(4192),i=n(1258);const a={startup:{type:"sound",title:"Startup Sound",description:"Sound played when WikiShield starts up.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/startup.wav"},music:{type:"category",title:"Music",description:"Background music tracks.",volume:1,properties:{zen_mode:{type:"sound",title:"Zen Mode",description:"Background audio played in Zen mode.",volume:1,data:"custom://zen_mode",preview:!1}}},ui:{type:"category",title:"User Interface Sounds",description:"Sounds used for user interface interactions.",volume:1,properties:{click:{type:"sound",title:"Click Sound",description:"Sound played when clicking on interface elements.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/click.wav"}}},queue:{type:"category",title:"Queue Sounds",description:"Sounds played for queue events.",volume:1,properties:{ores:{type:"sound",title:"ORES Alert",description:"Sound played due to a high ORES score.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/ores.wav"},mention:{type:"sound",title:"Mention Alert",description:"Sound played when your username is mentioned in an edit.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/mention.wav"}}},notification:{type:"category",title:"Notification Sounds",description:"Sounds played for various notifications.",volume:1,properties:{alert:{type:"sound",title:"Alert Sound",description:"Sound played for alerts.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/alert.wav"},message:{type:"sound",title:"Message Sound",description:"Sound played for messages.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/message.wav"},toast:{type:"sound",title:"Toast Sound",description:"Sound played for toast notifications.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/toast.wav"}}},action:{type:"category",title:"Action Sounds",description:"Sounds played for various user actions.",volume:1,properties:{default:{type:"sound",title:"Default Action Sound",description:"Sound played for default actions.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/action.wav"},failed:{type:"sound",title:"Failed Action Sound",description:"Sound played when an action fails.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/failed.wav"},report:{type:"sound",title:"Report Action Sound",description:"Sound played for report actions.",volume:1,data:"https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/audio/report.wav"}}}};t.AudioManager=class{constructor(e){this.ws=e,this.audio=a,this.soundEffects=new Map,this.previews=new Map,this.previewing=!1}async init(){this.zengine=new i.Zengine,this.zengine.debug=this.ws.__DEV__,await this.zengine.init(),this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"])}async playSound(e,t,n=!1,i){if(!n){const e=this.ws.store.settings.zen_mode;if(e.enabled&&!e.sound.enabled)return}const a=this.getSound(e);if(!a||!a.data)return;const r=this.getVolume(e),o=new Audio(a.data);o.volume=!n&&this.previewing?0:r,"mediaSession"in navigator&&(navigator.mediaSession.setActionHandler("play",()=>{}),navigator.mediaSession.setActionHandler("pause",()=>{}),navigator.mediaSession.setActionHandler("previoustrack",()=>{}),navigator.mediaSession.setActionHandler("nexttrack",()=>{}));const l=(0,s.generateRandomUUID)();n&&(this.muteId=l,this.previewing=!0,this.stopPreviews(),this._muteAll(),this.previews.set(o,e)),this.soundEffects.set(o,e);const d=new Promise((e,t)=>{o.resolve=e,o.reject=t});o.onended=()=>{o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))},o.onerror=()=>{o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))};let c=!1;return o.onplay=()=>{c||(c=!0,i&&i())},null==t||t.addEventListener("abort",()=>{o.pause(),o.src="",o.resolve(),this.soundEffects.delete(o),n&&(this.previewing=!1,setTimeout(()=>{this.muteId===l&&this._unmuteAll()},250),this.previews.delete(o))}),o.play(),d}async previewSound(e){const t=this.getSound(e);if(!t||!t.data)return;this._muteAll();const n=new Audio(t.data);n.volume=this.getVolume(e),this.previews.set(n,e);const s=()=>{this.previews.delete(n),0===this.previews.size&&this._unmuteAll()};n.onended=s,n.onerror=s,await n.play()}stopPreviews(){for(const e of this.previews.keys())e.resolve(),e.pause(),e.onended=null,e.onerror=null,e.src="";this.previews.clear(),this._unmuteAll()}onvolumechanged(){if(this.zengine.setMasterVolume(this.ws.store.settings.audio.volume["master.music.zen_mode"]),this.previewing)for(const[e,t]of this.previews.entries()){const n=this.getVolume(t);e.volume=n}else for(const[e,t]of this.soundEffects.entries()){const n=this.getVolume(t);e.volume=n}}_muteAll(){for(const e of this.soundEffects.keys())e.volume=0}_unmuteAll(){for(const[e,t]of this.soundEffects.entries())e.volume=this.getVolume(t)}getSound(e){let t={type:"category",properties:this.audio};for(const n of e){if("category"!==t.type)return null;if(t=t.properties[n],!t)return null}return t}getVolume(e){const t=this.ws.store.settings.audio.volume;let n=t.master,s={type:"category",properties:this.audio};const i=["master"];for(const a of e){if(i.push(a),"category"!==s.type)return n;if(s=s.properties[a],!s)break;const e=t[i.join(".")];void 0!==e&&(n*=e)}return n}}},1258(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Zengine=void 0;class n{constructor(){this.audioContext=null,this.masterGain=null,this.isPlaying=!1,this.debug=!1,this.layers={bass:{oscillators:[],gains:[],compressor:null},pad:{oscillators:[],gains:[],filter:null,reverb:null}},this.nextChordTimeout=null,this.baseFrequency=65.41,this.currentKey=0,this.chordLibrary={maj7:{bass:[0],pad:[0,7,11,16,19],tension:.1},min7:{bass:[0],pad:[0,7,10,15,19],tension:.15},maj9:{bass:[0],pad:[0,7,11,14,19],tension:.12},min9:{bass:[0],pad:[0,7,10,14,19],tension:.18},sus2:{bass:[0],pad:[0,7,12,14,19],tension:.25},sus4:{bass:[0],pad:[0,7,12,17,19],tension:.28},add9:{bass:[0],pad:[0,7,14,16,21],tension:.15},madd9:{bass:[0],pad:[0,7,14,15,21],tension:.2},openvoice:{bass:[0],pad:[0,7,12,19,24],tension:.08},"6add9":{bass:[0],pad:[0,7,9,14,19],tension:.18}},this.chordCompatibility={maj7:["maj9","min7","sus2","add9","openvoice","6add9"],min7:["maj7","min9","sus4","madd9","openvoice"],maj9:["maj7","add9","sus2","6add9","openvoice"],min9:["min7","madd9","sus2","maj9"],sus2:["maj7","maj9","add9","openvoice","sus4"],sus4:["maj7","sus2","min7","openvoice"],add9:["maj9","sus2","maj7","openvoice","6add9"],madd9:["min9","min7","add9","sus2"],openvoice:["sus2","maj7","add9","maj9"],"6add9":["maj7","maj9","add9","sus2"]},this.currentChordName="maj7",this.currentTension=.1}init(){this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGain=this.audioContext.createGain(),this.masterGain.connect(this.audioContext.destination),this.masterGain.gain.value=.2,this.setupLayerEffects())}async start(){this.isPlaying||(this.init(),"suspended"===this.audioContext.state&&await this.audioContext.resume(),this.isPlaying=!0,this.currentKey=Math.floor(12*Math.random()),this.playNextChord())}setupLayerEffects(){const e=this.audioContext.createDynamicsCompressor();e.threshold.value=-30,e.knee.value=40,e.ratio.value=12,e.attack.value=.003,e.release.value=.25,e.connect(this.masterGain),this.layers.bass.compressor=e;const t=this.audioContext.createBiquadFilter();t.type="lowpass",t.frequency.value=1200,t.Q.value=.5;const n=this.audioContext.createDelay(2);n.delayTime.value=.4;const s=this.audioContext.createGain();s.gain.value=.3,t.connect(n),n.connect(s),s.connect(t),t.connect(this.masterGain),this.layers.pad.filter=t,this.layers.pad.reverb={delay:n,gain:s}}playNextChord(){if(!this.isPlaying)return;const e=this.chooseNextChord(),t=this.currentChordName;if(this.currentChordName=e,this.currentTension=this.chordLibrary[e].tension,this.debug&&console.log("[MusicEngine] Chord changed",{from:t,to:e,tension:this.currentTension,key:this.currentKey,timestamp:this.audioContext.currentTime}),Math.random()<.08){const e=this.currentKey;this.currentKey=(this.currentKey+[2,5,7][Math.floor(3*Math.random())])%12,this.debug&&console.log("[MusicEngine] Key changed",{from:e,to:this.currentKey})}this.transitionToChord(e);const n=12e3+1e4*Math.random();this.nextChordTimeout=setTimeout(()=>this.playNextChord(),n)}chooseNextChord(){const e=this.chordCompatibility[this.currentChordName]||Object.keys(this.chordLibrary),t=e.map(e=>({name:e,weight:this.chordLibrary[e].tension<.2?2:1})),n=t.reduce((e,t)=>e+t.weight,0);let s=Math.random()*n;for(const e of t)if(s-=e.weight,s<=0)return e.name;return e[0]}transitionToChord(e){const t=this.chordLibrary[e];if(!t)return;const n=6+3*Math.random();["bass","pad"].forEach(e=>this.createLayer(e,t[e],n))}createLayer(e,t,n){if(null==t||!t.length)return;const s=this.audioContext.currentTime,i=this.layers[e];if(i.gains&&i.gains.length>0){const e=[...i.oscillators],t=[...i.gains];t.forEach(e=>{try{e.gain.cancelScheduledValues(s),e.gain.setValueAtTime(e.gain.value,s),e.gain.linearRampToValueAtTime(0,s+n)}catch(e){}}),setTimeout(()=>{e.forEach(e=>{try{e.stop(),e.disconnect()}catch(e){}}),t.forEach(e=>{try{e.disconnect()}catch(e){}})},1e3*n+100)}const a=[],r=[],o=[];t.forEach((t,l)=>{const d=this.baseFrequency*Math.pow(2,(this.currentKey+t)/12);o.push(d);const c=this.audioContext.createOscillator();c.type="bass"===e?"sine":"triangle",c.frequency.value=d,c.detune.value=6*(Math.random()-.5);const u=this.audioContext.createGain();u.gain.value=0,c.connect(u),"bass"===e&&i.compressor?u.connect(i.compressor):i.filter&&u.connect(i.filter),c.start(s),a.push(c),r.push(u);const p="bass"===e?.15:.08-.01*l;u.gain.setValueAtTime(0,s),u.gain.linearRampToValueAtTime(p,s+n)}),this.debug&&console.log("[MusicEngine] Layer created",{layer:e,frequencies:o,volumes:r.map(e=>e.gain.value),fadeDuration:n}),i.oscillators=a,i.gains=r}stop(){this.isPlaying=!1,this.nextChordTimeout&&clearTimeout(this.nextChordTimeout),this.debug&&console.log("[MusicEngine] Stopping music engine",{timestamp:this.audioContext.currentTime});const e=this.audioContext.currentTime;if(Object.values(this.layers).forEach(t=>{t.gains&&t.gains.forEach(t=>{try{t.gain.setValueAtTime(t.gain.value,e),t.gain.linearRampToValueAtTime(0,e+.5)}catch(e){}}),t.oscillators&&setTimeout(()=>{t.oscillators.forEach(e=>{try{e.stop(),e.disconnect()}catch(e){}}),t.oscillators=[],t.gains&&(t.gains.forEach(e=>{try{e.disconnect()}catch(e){}}),t.gains=[])},550)}),this.masterGain)try{this.masterGain.gain.setValueAtTime(this.masterGain.gain.value,e),this.masterGain.gain.linearRampToValueAtTime(0,e+.5)}catch(e){}}setMasterVolume(e){if(this.masterGain){const t=this.masterGain.gain.value;this.masterGain.gain.value=e,this.debug&&console.log("[MusicEngine] Master volume changed",{from:t,to:e})}}}t.Zengine=class{constructor(){this.audioContext=null,this.sounds=[],this.activeSounds=new Map,this.masterGainNode=null,this.isRunning=!1,this.currentEnvironment=null,this.eventLoopInterval=null,this.activityLevel=4,this.musicEngine=null,this.debug=!1}async init(){this.musicEngine=new n,this.musicEngine.init(),this.musicEngine.debug=this.debug;const e=await fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/bbc-sounds.json"),t=await e.json();return this.sounds=this.categorizeSounds(t),this.debug&&console.log("[Zengine] Initialized",{soundCount:this.sounds.length,categories:[...new Set(this.sounds.map(e=>e.category))]}),this.sounds.length}categorizeSounds(e){return e.map(e=>{var t;const n=(e.tags||[]).map(e=>e.toLowerCase()),s=(e.description||"").toLowerCase(),i=parseFloat((null===(t=e.technicalMetadata)||void 0===t?void 0:t.duration)||e.duration)||0,a=this.detectCategory(n,s),r=i>60?"ambient":i>15?"feature":"event";return{id:e.id,duration:i,description:e.description,category:a,role:r}})}detectCategory(e,t){const n=[...e,t].join(" ");return/rain|drizzle/i.test(n)?"rain":/ocean|sea|wave/i.test(n)?"ocean":/stream|river|water/i.test(n)?"water-flow":/wind|breeze/i.test(n)?"wind":/bird/i.test(n)?"bird":/cricket|insect/i.test(n)?"insect":"other"}generateEnvironment(){const e=[{name:"Gentle Rain",requiredAmbient:["rain"],commonCategories:["bird"],weather:"rain"},{name:"Ocean Shore",requiredAmbient:["ocean"],commonCategories:["bird","wind"],weather:"clear"},{name:"Forest Stream",requiredAmbient:["water-flow"],commonCategories:["bird","insect"],weather:"clear"}],t=e[Math.floor(Math.random()*e.length)];return this.debug&&console.log("[Zengine] Environment generated",{name:t.name,weather:t.weather,ambientRequirements:t.requiredAmbient,commonSounds:t.commonCategories}),t}getEnvironmentSounds(e){return{ambient:this.sounds.filter(t=>"ambient"===t.role&&e.requiredAmbient.includes(t.category)),events:this.sounds.filter(t=>"event"===t.role&&e.commonCategories.includes(t.category))}}async start(){this.isRunning||(0===this.sounds.length&&await this.init(),this.musicEngine.isPlaying||await this.musicEngine.start(),this.audioContext||(this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.masterGainNode=this.audioContext.createGain(),this.masterGainNode.connect(this.audioContext.destination),this.masterGainNode.gain.value=.3),"suspended"===this.audioContext.state&&await this.audioContext.resume(),this.isRunning=!0,this.currentEnvironment=this.generateEnvironment(),this.debug&&console.log("[Zengine] Engine started",{environment:this.currentEnvironment.name,audioContextState:this.audioContext.state}),await this.startAmbientLayers(),this.startEventLoop())}async startAmbientLayers(){const e=this.getEnvironmentSounds(this.currentEnvironment),t=Math.min(e.ambient.length,2);for(let n=0;n<t;n++){const t=e.ambient[Math.floor(Math.random()*e.ambient.length)];this.activeSounds.has(t.id)||await this.playSound(t,"ambient",.35+.1*Math.random())}}startEventLoop(){this.eventLoopInterval=setInterval(()=>this.processEvents(),3e3),this.debug&&console.log("[Zengine] Event loop started")}async processEvents(){if(!this.isRunning)return;const e=this.getEnvironmentSounds(this.currentEnvironment);if(Array.from(this.activeSounds.values()).filter(e=>"ambient"!==e.role).length<this.activityLevel&&e.events.length>0&&Math.random()<.5){const t=e.events[Math.floor(Math.random()*e.events.length)];await this.playSound(t,"event",.12+.08*Math.random())}}async playSound(e,t,n){if(!this.activeSounds.has(e.id))try{const s=e.url||`https://sound-effects-media.bbcrewind.co.uk/mp3/${e.id}.mp3`,i=new Audio;i.crossOrigin="anonymous",i.src=s,i.preload="auto";const a=this.audioContext.createMediaElementSource(i),r=this.audioContext.createGain();r.gain.value=n,a.connect(r),r.connect(this.masterGainNode),this.activeSounds.set(e.id,{sound:e,audio:i,source:a,gainNode:r,role:t,volume:n}),this.debug&&console.log("[Zengine] Sound started playing",{soundId:e.id,description:e.description,role:t,volume:n,category:e.category,duration:e.duration,activeCount:this.activeSounds.size}),i.addEventListener("ended",()=>{this.removeSound(e.id),"ambient"===t&&this.isRunning&&setTimeout(()=>this.playSound(e,t,n),1e3)}),i.addEventListener("error",()=>this.removeSound(e.id)),await i.play()}catch(t){console.error("[Zengine] Sound error:",e.id,t)}}removeSound(e){const t=this.activeSounds.get(e);if(t){try{t.audio.pause(),t.gainNode.disconnect(),t.source.disconnect()}catch(e){}this.debug&&console.log("[Zengine] Sound removed",{soundId:e,description:t.sound.description,activeCount:this.activeSounds.size-1}),this.activeSounds.delete(e)}}stop(){this.musicEngine.isPlaying&&this.musicEngine.stop(),this.isRunning=!1,this.eventLoopInterval&&(clearInterval(this.eventLoopInterval),this.eventLoopInterval=null),this.debug&&console.log("[Zengine] Engine stopping",{activeSounds:this.activeSounds.size}),this.activeSounds.forEach((e,t)=>{try{e.audio.pause(),e.audio.currentTime=0}catch(e){}const n=this.audioContext.currentTime;e.gainNode.gain.cancelScheduledValues(n),e.gainNode.gain.setValueAtTime(e.gainNode.gain.value,n),e.gainNode.gain.linearRampToValueAtTime(0,n+.5),setTimeout(()=>this.removeSound(t),500)}),this.audioContext&&"running"===this.audioContext.state&&this.audioContext.suspend(),this.debug&&console.log("[Zengine] Engine stopped")}setMasterVolume(e){if(this.masterGainNode){const t=this.masterGainNode.gain.value;this.masterGainNode.gain.value=e,this.debug&&console.log("[Zengine] Master volume changed",{from:t,to:e,musicEngineVolume:.25*e})}this.musicEngine.setMasterVolume(.25*e)}}},870(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.conditions=void 0;var s=n(372);t.conditions={true:{title:"True",check:(e,t,n)=>!0},false:{title:"False",check:(e,t,n)=>!1},"account-admin":{title:"You are an admin",check:(e,t,n)=>!0===e.groups.sysop},"item-selected":{title:"An item is selected",check:(e,t,n)=>null!==t},"edit-selected":{title:"An edit is selected",check:(e,t,n)=>"edit"===s.Queue.groups[null==t?void 0:t.type]},"logevent-selected":{title:"A logentry is selected",check:(e,t,n)=>"logevent"===s.Queue.groups[null==t?void 0:t.type]},revertable:{title:"Current item is revertable",check:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"===s.Queue.groups[i]}},pending:{title:"Current item is pending review",check:(e,t,n)=>!!e.queue.pending.has(t.id)},"user-registered":{title:"Selected user is registered",check:(e,t,n)=>!1===t.user.anon},"user-ip":{title:"Selected user is an IP address",check:(e,t,n)=>!0===t.user.ip},"user-temp":{title:"Selected user is a temporary account",check:(e,t,n)=>!0===t.user.temp},"user-empty-talk":{title:"Selected user's talk page is empty",check:(e,t,n)=>void 0===t.user.talk},"user-blocked":{title:"Selected user is blocked",check:(e,t,n)=>!0===t.user.blocked},"user-edit-count":{title:"Selected user's edit count is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"count",title:"Edit count",type:"number",default:0}],check:(e,t,n)=>{const s=-1===t.user.editcount?1/0:t.user.editcount||0,i=Number(n.count);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"user-final-warning":{title:"Selected user at final warning level",check:(e,t,n)=>"4"===t.user.warning||"4im"===t.user.warning},"user-has-warnings":{title:"Selected user has no warnings",check:(e,t,n)=>"0"!==t.user.warning},"edit-pending":{title:"Edit is pending",check:(e,t,n)=>e.queue.pending.has(null==t?void 0:t.id)},"edit-minor":{title:"Edit is marked as minor",check:(e,t,n)=>!0===t.minor},"edit-size":{title:"Edit size is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"size",title:"Size",type:"number",default:0}],check:(e,t,n)=>{const s=t.sizediff||0,i=Number(n.size);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"abs-edit-size":{title:"Absolute edit size is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"size",title:"Size",type:"number",min:0,default:0}],check:(e,t,n)=>{const s=Math.abs(t.sizediff||0),i=Number(n.size);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"edit-ores-score":{title:"Edit ORES score is",parameters:(e,t)=>[{id:"condition",title:"Condition",type:"choice",options:["<","≤","=","≥",">"],default:"="},{id:"score",title:"Score",type:"number",min:0,max:1,default:0}],check:(e,t,n)=>{const s=t.ores_score||0,i=Number(n.score);switch(n.condition){case"<":return s<i;case"≤":return s<=i;case"=":return s===i;case"≥":return s>=i;case">":return s>i;default:return!1}}},"user-highlighted":{title:"Selected user is highlighted",check:(e,t,n)=>e.store.highlight.users.has(t.user.name)},"user-whitelisted":{title:"Selected user is whitelisted",check:(e,t,n)=>e.store.whitelist.users.has(t.user.name)},"page-highlighted":{title:"Selected page is highlighted",check:(e,t,n)=>e.store.highlight.pages.has(t.page.title)},"page-whitelisted":{title:"Selected page is whitelisted",check:(e,t,n)=>e.store.whitelist.pages.has(t.page.title)},"page-watched":{title:"Selected page is watched",check:(e,t,n)=>!0===t.page.watched},"tag-highlighted":{title:"Selected edit has a highlighted tag",check:(e,t,n)=>{for(const n of t.tags)if(e.store.highlight.tags.has(n))return!0;return!1}},"tag-whitelisted":{title:"Selected edit has a whitelisted tag",check:(e,t,n)=>{for(const n of t.tags)if(e.store.whitelist.tags.has(n))return!0;return!1}},"in-recent-queue":{title:"In recent changes queue",check:(e,t,n)=>"recent"===e.queue.current.type},"in-pending-queue":{title:"In pending changes queue",check:(e,t,n)=>"pending"===e.queue.current.type},"in-user-queue":{title:"In user creations queue",check:(e,t,n)=>"users"===e.queue.current.type},"in-watchlist-queue":{title:"In watchlist queue",check:(e,t,n)=>"watchlist"===e.queue.current.type}}},9808(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.validateShortcut=t.controls=t.buildShortcut=void 0;const n=t.controls=new Set(["!","@","#","$","%","^","&","*","(",")","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","-","=","[","]","\\",";","'",",",".","/","_","+","{","}","|",":",'"',"<",">","?"," ","arrowleft","arrowup","arrowdown","arrowright"]);t.buildShortcut=e=>{const t=[];["ctrl","shift","alt"].forEach(n=>{e[`${n}Key`]&&t.push(n)});const s=e.key.toLowerCase();return n.has(s)&&t.push(s),t.join("+")};t.validateShortcut=e=>{const t=e.toLowerCase().split("+");if(0===t.length)return!1;const s=new Set;for(const e of t){if(s.has(e))return!1;if(s.add(e),"ctrl"!==e&&"shift"!==e&&"alt"!==e&&!n.has(e))return!1}return t.some(e=>"ctrl"!==e&&"shift"!==e&&"alt"!==e)}},985(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.events=void 0;var s=n(372),i=n(7054),a=n(955),r=n(863),o=n(5643);t.events={"next-item":{title:"Go to next item",icon:"fas fa-arrow-right",script:(e,t,n)=>(e.queue.next(),{valid:!0})},"previous-item":{title:"Go to previous item",icon:"fas fa-arrow-left",script:(e,t,n)=>(e.queue.previous(),{valid:!0})},"clear-queue":{title:"Clear queue",icon:"fas fa-trash-can",valid:(e,t,n)=>"pending"===e.queue.current.type?{valid:!1,reason:"Pending edits queue cannot be cleared."}:{valid:!0},script:(e,t,n)=>(e.queue.clear(e.queue.current.type),{valid:!0})},"next-queue":{title:"Go to next queue",icon:"fas fa-forward",script:(e,t,n)=>{const i=s.Queue.types.map(t=>({name:t,...e.store.settings.queue[t]}));i.sort((e,t)=>e.order-t.order);const a=i.findIndex(t=>t.name===e.queue.current.type);return e.queue.switch(i[(a+1)%i.length].name),{valid:!0}}},"previous-queue":{title:"Go to previous queue",icon:"fas fa-forward",script:(e,t,n)=>{const i=s.Queue.types.map(t=>({name:t,...e.store.settings.queue[t]}));i.sort((e,t)=>e.order-t.order);const a=i.findIndex(t=>t.name===e.queue.current.type);return e.queue.switch(i[(a-1+i.length)%i.length].name),{valid:!0}}},"accept-pending-edit":{title:"Accept pending edit",icon:"fas fa-check",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Accepting pending edit",valid:(e,t,n)=>e.rights.review?e.queue.pending.has(t.id)?{valid:!0}:{valid:!1,reason:"Pending edit can only be accepted when a pending edit is selected."}:{valid:!1,reason:"You do not have permission to review pending changes."},script:async(e,t,n)=>{const s=e.queue.pending.get(t.id);if(!s)return{valid:!1,reason:"Pending edit not found."};const i=`${s.count||""} pending revision${1===s.count?"":"s"}`,a=Object.entries(s.users||{}).map(t=>[e.api.user(t[0]),t[1]]);a.sort((e,t)=>t[1]-e[1]);const r=Math.max(a.reduce((e,t)=>{const n=t[0].length;return e[0]+n<=250?[e[0]+n,e[1]+1]:e},[0,0])[1],1);let o="";const l=a.length;if(l>r){const e=a.slice(0,r).map(e=>e[0]),t=l-e.length;o=`${e.join(", ")}, and ${t} other${1===t?"":"s"}`}else o=(e=>{switch(e.length){case 0:case 1:return e[0]||"";case 2:return`${e[0]} and ${e[1]}`;default:return`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`}})(a.map(e=>e[0]));return await e.api.acceptPendingEdit(t.pending.revid,e.api.summary(`Accepted ${i} by ${o}`,n.summary))},successful:(e,t,n)=>{e.store.statistics.pending_changes_reviewed.accepted++}},"reject-pending-edit":{title:"Reject pending edit",icon:"fas fa-xmark",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Rejecting pending edit",valid:(e,t,n)=>e.rights.review?e.queue.pending.has(t.id)?{valid:!0}:{valid:!1,reason:"Pending edit can only be rejected when a pending edit is selected."}:{valid:!1,reason:"You do not have permission to review pending changes."},script:async(e,t,n)=>{const s=e.queue.pending.get(t.id);if(!s)return{valid:!1,reason:"Pending edit not found."};const i=`${s.count||""} pending revision${1===s.count?"":"s"}`,a=Object.entries(s.users||{}).map(t=>[e.api.user(t[0]),t[1]]);a.sort((e,t)=>t[1]-e[1]);const r=Math.max(a.reduce((e,t)=>{const n=t[0].length;return e[0]+n<=250?[e[0]+n,e[1]+1]:e},[0,0])[1],1);let o="";const l=a.length;if(l>r){const e=a.slice(0,r).map(e=>e[0]),t=l-e.length;o=`${e.join(", ")}, and ${t} other${1===t?"":"s"}`}else o=(e=>{switch(e.length){case 0:case 1:return e[0]||"";case 2:return`${e[0]} and ${e[1]}`;default:return`${e.slice(0,-1).join(", ")}, and ${e[e.length-1]}`}})(a.map(e=>e[0]));return await e.api.rejectPendingEdit(t.id,s.prior,t.page.title,e.api.summary(`Rejected ${i} by ${o} to [[Special:Diff/${s.prior}|last stable revision]]`,n.summary))},successful:(e,t,n)=>{e.store.statistics.pending_changes_reviewed.rejected++}},revert:{title:"Revert and auto warn/report",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]}],progress:"Reverting edit",valid:(e,t,n)=>{let i=t.type;if("abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i])return{valid:!1,reason:"Edit can only be reverted when an edit is selected."};return"summary"in(0,a.getWarningFromLookup)(n.warning)?{valid:!0}:{valid:!1,reason:"Selected warning template does not support reverting."}},script:async(e,t,n)=>{var r;const l=(0,a.getWarningFromLookup)(n.warning);if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Reverting yourself","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to revert their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to revert the edit on it?`)||null!==(r=t.tags)&&void 0!==r&&r.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to revert it?"))return{valid:!1,reason:"Revert cancelled by user."};const d=await(async()=>await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted edits by ${e.api.user(t.user.name)}`,l.summary)))();if(!d.valid)return d;switch(e.store.statistics.reverts_made.total++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}let c;const u=await(async()=>{const n=`User talk:${t.user.name}`,i=e.util.monthSectionName(),a=(await e.api.getPagesContent([n]))[n]||"",r=e.util.getPageSections(a);let o="new";const d=r.length;for(let e=0;e<d;e++)r[e].title===i&&(o=e+1);let u;c=e.queue.getWarningLevel(a),u="string"==typeof l.auto?l.auto:"function"==typeof l.auto?l.auto(t,c):l.auto[c];const p=l.templates.find(e=>e.name===u.toString());if(!p)return{valid:!0};let g="Message about ";"edit"===s.Queue.groups[t.type]?g+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?g+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:g+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:g+=`[[${t.page.title}]]`;let h="";h="new"===o?`{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)`:`${r[o-1].heading}\n${r[o-1].content}\n\n{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)`;const m=await e.api.editSection(n,o,i,h,e.api.summary(g,`${l.name} (${p.name})`));if(m.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(u)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,u),e.store.statistics.warnings_issued.total++,u){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return m})();if(!u.valid)return u;if(("4"===c||"4im"===c)&&l.reportable&&e.store.settings.auto_report.enabled&&e.store.settings.auto_report.for.has(n.warning)){if(!(await(async()=>await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}}))()).valid)return{valid:!0};e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}return{valid:!0}}},"warn-and-report":{title:"Auto warn/report",icon:"fas fa-exclamation-triangle",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]}],progress:"Warning user",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be warned when an item is selected."},script:async(e,t,n)=>{var r;const l=(0,a.getWarningFromLookup)(n.warning);if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Warning yourself","You are about to warn yourself. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to warn them?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`)||null!==(r=t.tags)&&void 0!==r&&r.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?"))return{valid:!1,reason:"Warn cancelled by user."};let d;const c=await(async()=>{const n=`User talk:${t.user.name}`,i=e.util.monthSectionName(),a=(await e.api.getPagesContent([n]))[n]||"",r=e.util.getPageSections(a);let o="new";const c=r.length;for(let e=0;e<c;e++)r[e].title===i&&(o=e+1);let u;d=e.queue.getWarningLevel(a),u="string"==typeof l.auto?l.auto:"function"==typeof l.auto?l.auto(t,d):l.auto[d];const p=l.templates.find(e=>e.name===u.toString());if(!p)return{valid:!0};let g="Message about ";"edit"===s.Queue.groups[t.type]?g+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?g+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:g+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:g+=`[[${t.page.title}]]`;let h="";h="new"===o?`{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)`:`${r[o-1].heading}\n${r[o-1].content}\n\n{{subst:${p.template}|${t.page.title}|${p.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)`;const m=await e.api.editSection(n,o,i,h,e.api.summary(g,`${l.name} (${p.name})`));if(m.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(u)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,u),e.store.statistics.warnings_issued.total++,u){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return m})();if(!c.valid)return c;if(("4"===d||"4im"===d)&&l.reportable&&e.store.settings.auto_report.enabled&&e.store.settings.auto_report.for.has(n.warning)){if(!(await(async()=>await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; Vandalism past final warning [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}}))()).valid)return{valid:!0};e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}return{valid:!0}}},"warn-user":{title:"Warn user",icon:"fas fa-exclamation-triangle",parameters:(e,t)=>[{id:"warning",title:"Warning template",type:"choice",options:Object.keys(a.warningsLookup),default:Object.keys(a.warningsLookup)[0]},{dependencies:["warning"],id:"level",title:"Warning level",type:"choice",options:e=>["auto",...a.warningsLookup[e.warning].templates.filter(e=>void 0===e.generic).map(e=>e.name)],default:"auto"}],continuity:!0,progress:"Issuing warning to user",valid:(e,t,n)=>{var s;return t?"auto"!==n.level&&null===(null===(s=(0,a.getWarningFromLookup)(n.warning))||void 0===s?void 0:s.templates[n.level])?{valid:!1,reason:"Selected warning template does not support automatic level selection."}:{valid:!0}:{valid:!1,reason:"User can only be warned when an item is selected."}},script:async(e,t,n)=>{var i;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Warning yourself","You are about to warn yourself. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to warn them?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to warn the user about the edit on it?`)||null!==(i=t.tags)&&void 0!==i&&i.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to warn the user about it?"))return{valid:!1,reason:"Warning cancelled by user."};const r=(0,a.getWarningFromLookup)(n.warning),o=`User talk:${t.user.name}`,l=e.util.monthSectionName(),d=(await e.api.getPagesContent([o]))[o]||"",c=e.util.getPageSections(d);let u="new";const p=c.length;for(let e=0;e<p;e++)c[e].title===l&&(u=e+1);let g;g="auto"===n.level?"string"==typeof r.auto?r.auto:"function"==typeof r.auto?r.auto(t,e.queue.getWarningLevel(d)):r.auto[e.queue.getWarningLevel(d)]:n.level;const h=r.templates.find(e=>e.name===g.toString());if(!h)return"auto"!==n.level?{valid:!1,reason:"Selected warning template does not support the specified level."}:{valid:!0};let m="Message about ";"edit"===s.Queue.groups[t.type]?m+=`[[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`:"abuselog"===t.type?t.revid?m+=`[[Special:Diff/${t.revid}|your edit]] on [[${t.page.title}]]`:m+=`[[Special:AbuseLog/${t.id}|your contribution]] on [[${t.page.title}]]`:m+=`[[${t.page.title}]]`;let v="";v="new"===u?`{{subst:${h.template}|${t.page.title}|${h.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)`:`${c[u-1].heading}\n${c[u-1].content}\n\n{{subst:${h.template}|${t.page.title}|${h.generic||""}}} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)`;const f=await e.api.editSection(o,u,l,v,e.api.summary(m,`${r.name} (${h.name})`));if(f.valid){e.queue.talks.set(t.user.name,!0);const n=["0","1","2","3","4","4im"];switch(n.indexOf(g)>n.indexOf(t.user.warning||"0")&&e.queue.warnings.set(t.user.name,g),e.store.statistics.warnings_issued.total++,g){case"1":e.store.statistics.warnings_issued.level_1++;break;case"2":e.store.statistics.warnings_issued.level_2++;break;case"3":e.store.statistics.warnings_issued.level_3++;break;case"4":e.store.statistics.warnings_issued.level_4++;break;case"4im":e.store.statistics.warnings_issued.level_4im++}}return f}},"rollback-edit":{title:"Rollback edit",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Rolling back edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be rolled back when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Rollbacking own edit","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to rollback it?"))return{valid:!1,reason:"Rollback cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted edits${i}`,n.summary))},successful:(e,t,n)=>{switch(e.store.statistics.reverts_made.total++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}}},"rollback-goodfaith-edit":{title:"Rollback good faith edit",icon:"fas fa-undo-alt",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Rolling back good faith edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be rolled back when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Rollbacking own edit","You are about to revert your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to rollback their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to rollback the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to rollback it?"))return{valid:!1,reason:"Rollback cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.rollbackEdit(t.page.title,t.user.name,e.api.summary(`Reverted [[Wp:AGF|Good faith]] edits${i}`,n.summary))},successful:(e,t,n)=>{switch(e.store.statistics.reverts_made.total++,e.store.statistics.reverts_made.good_faith++,t.type){case"recent":e.store.statistics.reverts_made.from_recent_changes++;break;case"pending":e.store.statistics.reverts_made.from_pending_changes++;break;case"watchlist":e.store.statistics.reverts_made.from_watchlist++;break;case"abuselog":e.store.statistics.reverts_made.from_abuse_log++;break;default:e.store.statistics.reverts_made.from_loaded_edits++}}},"undo-edit":{title:"Undo edit",icon:"fas fa-undo",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Undoing edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be undone when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{var s;if(await e.gui.settings.waitForClose(),t.user.name===e.api.username&&!1===await e.gui.dialog.confirm("Undoing own edit","You are about to undo your own edit. Are you sure you want to proceed?")||e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to undo their edit?`)||e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to undo the edit on it?`)||null!==(s=t.tags)&&void 0!==s&&s.some(t=>e.store.whitelist.tags.has(t))&&!1===await e.gui.dialog.confirm("Edit is whitelisted","This edit has one or more whitelisted tags. Are you sure you want to undo it?"))return{valid:!1,reason:"Undo cancelled by user."};const i="Yes"===n.hide_username?"":` by ${e.api.user(t.user.name)}`;return await e.api.undoEdit(t.page.title,t.id,e.api.summary(`Undid revision ${e.api.revision(t.id)}${i}`,n.summary))}},"restore-edit":{title:"Restore edit",icon:"fas fa-redo",parameters:(e,t)=>[{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Restoring edit",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit can only be restored when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>await e.api.restoreEdit(t.page.title,t.id,e.api.summary(`Restored revision ${e.api.revision(t.id)} by ${e.api.user(t.user.name)}`,n.summary))},"send-message-to-user-talk":{title:"Send message to user talk page",icon:"fas fa-comment",parameters:(e,t)=>[{id:"heading",title:"Section heading",type:"text"},{id:"message",title:"Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC))",type:"text"}],progress:"Sending message to user talk page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Message can only be sent when an item is selected."},script:async(e,t,n)=>await e.api.editSection(`User talk:${t.user.name}`,"new",n.heading,n.message,e.api.summary(`Message from ${e.api.username}: ${n.heading}`))},"send-message-to-page-talk":{title:"Send message to page talk page",icon:"fas fa-comment",parameters:(e,t)=>[{id:"heading",title:"Section heading",type:"text"},{id:"message",title:"Message (sign with [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC))",type:"text"}],progress:"Sending message to page talk page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Message can only be sent when an item is selected."},script:async(e,t,n)=>{const s=t.page.title.split(":");let i="Talk";s.length>1&&(i=s[0].toLowerCase().includes("talk")?s[0]:`${s[0]} talk`);const a=`${i}:${1===s.length?s[0]:s.slice(1).join(":")}`;return await e.api.editSection(a,"new",n.heading,n.message,e.api.summary(`Message from ${e.api.username}: ${n.heading}`))}},"report-user-to-aiv":{title:"Report user to AIV",icon:"fas fa-flag",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Vandalism past final warning","Vandalism-only account","Vandalism after recent release of block","Spambot or compromised account","Long-term abuse"],default:"Vandalism past final warning"},{id:"summary",title:"Summary (optional)",type:"text"}],continuity:!0,progress:"Reporting user to AIV",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be reported when an item is selected."},script:async(e,t,n)=>t.user.name===e.api.username?{valid:!1,reason:"You cannot report yourself, silly!"}:(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to report them?`)?{valid:!1,reason:"User report cancelled by user."}:await e.api.areUsersBlocked([t.user.name])[t.user.name]?{valid:!1,reason:"User cannot be reported because they are blocked."}:await e.api.append(i.WikiShield.config.pages.AIV,null,(0,o.fullTrim)(`\n * {{vandal|${t.user.name}}} &ndash; ${n.reason}${n.summary?`: ${n.summary}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${e.api.user(t.user.name)}`),n=>{var s;const i=null===(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))||void 0===s?void 0:s.content;return{valid:!(null!=i&&i.includes(`{{vandal|${t.user.name}}`)||null!=i&&i.includes(`{{IPVandal|${t.user.name}}`)),reason:"User has already been reported to AIV."}})),successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.AIV++}},"report-user-to-uaa":{title:"Report user to UAA",icon:"fas fa-user-slash",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Disruptive username","Offensive username","Promotional username","Misleading username"],default:"Disruptive username"},{id:"summary",title:"Summary (optional)",type:"text"}],continuity:!0,progress:"Reporting user to UAA",valid:(e,t,n)=>t?t.user.anon?{valid:!1,reason:"User cannot be reported because they are anonymous."}:{valid:!0}:{valid:!1,reason:"User can only be reported when an item is selected."},script:async(e,t,n)=>{if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot report yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to report them?`))return{valid:!1,reason:"User report cancelled by user."};if(await e.api.areUsersBlocked([t.user.name])[t.user.name])return{valid:!1,reason:"User cannot be reported because they are blocked."};const s="Offensive username"===n.reason?"offensive username":e.api.user(t.user.name);return await e.api.append(i.WikiShield.config.pages.UAA,null,(0,o.fullTrim)(`\n * {{user-uaa|${t.user.name}}} &ndash; ${n.reason}${n.summary?`: ${n.summary}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)\n `),e.api.summary(`Reporting ${s}`),n=>{var s;return{valid:!(null!==(s=e.util.getPageSections(n).find(e=>"User-reported"===e.title))&&void 0!==s&&s.content.includes(`{{user-uaa|${t.user.name}}`)),reason:"User has already been reported to UAA."}})},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.UAA++}},"request-page-protection":{title:"Request page protection",icon:"fas fa-shield-alt",parameters:(e,t)=>[{id:"level",title:"Protection level",type:"choice",options:[...e.api.hasPendingChanges?["Pending changes protection"]:[],"Semi-protection","Extended-confirmed protection","Full protection","Move protection","Template protection"],default:"Semi-protection"},{id:"reason",title:"Reason",type:"choice",options:["Generic","Persistent vandalism","Disruptive editing","Edit warring","BLP violations","Sockpuppetry","Arbitration enforcement"],default:"Generic"},{id:"duration",title:"Duration",type:"choice",options:["Temporary","Indefinite"],default:"Temporary"},{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Requesting page protection",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Page protection can only be requested for edits."}:{valid:!0}},script:async(e,t,n)=>{if(await e.gui.settings.waitForClose(),e.store.whitelist.pages.has(t.page.title)&&!1===await e.gui.dialog.confirm("Page is whitelisted",`The page <a href="https://${e.server}/wiki/${encodeURIComponent(t.page.title)}" target="_blank">${t.page.title}</a> is whitelisted. Are you sure you want to request protection for it?`))return{valid:!1,reason:"Page protection request cancelled by user."};const s="Generic"===n.reason?n.summary:`${n.reason} &ndash; ${n.summary}`;return await e.api.append(i.WikiShield.config.pages.RFPP,null,`\n${(0,o.fullTrim)(`\n === [[${t.page.title}]] ===\n * {{pagelinks|${t.page.title}}}\n '''${n.duration} ${n.level.toLowerCase()}'''${s?`: ${s}`:""} [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting ${n.level} protection for [[${t.page.title}]]`),n=>({valid:!e.util.getPageSections(n).some(e=>e.title===`[[${t.page.title}]]`),reason:"Page protection has already been requested for this page."}))},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.RFPP++}},"request-global-block":{title:"Request global block",icon:"fas fa-ban",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Generic","Long-term abuse","Cross-wiki abuse","Spam / spambot","Compromised account"],default:"Generic"},{id:"summary",title:"Summary (optional)",type:"text"}],progress:"Requesting global block",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Global block can only be requested when an item is selected."},script:async(e,t,n)=>{var s;if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot request a global block for yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to request a global block for them?`))return{valid:!1,reason:"Global block request cancelled by user."};if(await e.api.isUserGloballyLocked(t.user.name))return{valid:!1,reason:"User is globally locked."};const a="Generic"===n.reason?n.summary:`${n.reason}. ${n.summary}`,r=(await e.api.getPagesContent([i.WikiShield.config.pages.SRG],!0,"meta.wikimedia.org"))[i.WikiShield.config.pages.SRG]||"",l=e.util.getPageSections(r);return await e.api.append(i.WikiShield.config.pages.SRG,Number(null===(s=Object.entries(l).find(([,e])=>2===e.level&&"Requests for global (un)block"===e.title))||void 0===s?void 0:s[0])+1||void 0,`\n${(0,o.fullTrim)(`\n === Global block for ${t.user.name} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{Luxotool|${t.user.name}}}\n ${a?`${a} `:""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting global block for ${e.api.user(t.user.name)}`),n=>{let s=!1,i=[];for(const t of e.util.getPageSections(n))if(2===t.level){if("Requests for global (un)block"===t.title)s=!0;else if(s)break}else s&&3===t.level&&i.push(t);return i=i.filter(e=>!e.content.match(/^{{Status\|not done}}/i)),{valid:!i.some(n=>{const s=n.content;return!!s.match(new RegExp(`{{Luxotool\\|(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}}}`,"i"))||!!s.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(?:\\|hidename=1)?(?:\\||})`,"i"))}),reason:"User has already been requested for global block."}},!1,"meta.wikimedia.org")},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.global_block++}},"request-global-lock":{title:"Request global lock",icon:"fas fa-lock",parameters:(e,t)=>[{id:"reason",title:"Reason",type:"choice",options:["Generic","Long-term abuse","Cross-wiki abuse","Abusive-username","Spam / spambot","Compromised account"],default:"Generic"},{id:"summary",title:"Summary (optional)",type:"text"},{id:"hide_username",title:"Hide username",type:"choice",options:["Yes","No"],default:"No"}],progress:"Requesting global lock",valid:(e,t,n)=>t?t.user.anon?{valid:!1,reason:"Global lock cannot be requested for anonymous users."}:{valid:!0}:{valid:!1,reason:"Global lock can only be requested when an item is selected."},script:async(e,t,n)=>{var s;if(t.user.name===e.api.username)return{valid:!1,reason:"You cannot request a global lock for yourself, silly!"};if(await e.gui.settings.waitForClose(),e.store.whitelist.users.has(t.user.name)&&!1===await e.gui.dialog.confirm("User is whitelisted",`The user <a href="https://${e.server}/wiki/User:${encodeURIComponent(t.user.name)}" target="_blank">${t.user.name}</a> is whitelisted. Are you sure you want to request a global lock for them?`))return{valid:!1,reason:"Global lock request cancelled by user."};if(await e.api.isUserGloballyLocked(t.user.name))return{valid:!1,reason:"User is already globally locked."};const a="Generic"===n.reason?n.summary:`${n.reason}. ${n.summary}`,r="Yes"===n.hide_username?"":` for ${e.api.centralAuthUser(t.user.name)}`,l=(await e.api.getPagesContent([i.WikiShield.config.pages.SRG],!0,"meta.wikimedia.org"))[i.WikiShield.config.pages.SRG]||"",d=e.util.getPageSections(l);return await e.api.append(i.WikiShield.config.pages.SRG,Number(null===(s=Object.entries(d).find(([,e])=>2===e.level&&"Requests for global (un)lock and (un)hiding"===e.title))||void 0===s?void 0:s[0])+1||void 0,`\n${(0,o.fullTrim)(`\n === Global lock${r} ===\n {{Status|}} \x3c!-- Do not remove this template --\x3e\n * {{LockHide|${t.user.name}${"Yes"===n.hide_username?"|hidename=1":""}}}\n ${a?`${a} `:""} <small>([[:en:WP:WikiShield|WikiShield]])</small> [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)\n `)}`,e.api.summary(`Requesting global lock${r}`),n=>{let s=!1,i=[];for(const t of e.util.getPageSections(n))if(2===t.level){if("Requests for global (un)lock and (un)hiding"===t.title)s=!0;else if(s)break}else s&&3===t.level&&i.push(t);return i=i.filter(e=>!e.content.match(/^{{Status\|not done}}/i)),{valid:!i.some(n=>{const s=n.content;return!!s.match(new RegExp(`{{LockHide\\|(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(\\|hidename=1)?}}`,"i"))||!!s.match(new RegExp(`{{MultiLock\\|(?:[^|}]*\\|)*(?:\\d+=)?\\s*${e.util.escapeRegex(t.user.name)}(?:\\|hidename=1)?(?:\\||})`,"i"))}),reason:"User has already been requested for global lock."}},!1,"meta.wikimedia.org")},successful:(e,t,n)=>{e.store.statistics.reports_filed.total++,e.store.statistics.reports_filed.global_lock++}},"thank-user":{title:"Thank user",icon:"fas fa-handshake",progress:"Thanking user",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"User can only be thanked when an edit is selected."}:{valid:!0}},script:async(e,t,n)=>{const s=e.api.summary(`Thank you for [[Special:Diff/${t.id}|your edit]] on [[${t.page.title}]]`),i=`User talk:${t.user.name}`;if(t.user.temp){const n=await e.api.thankRevision(t.id);return(n.valid||e.store.settings.talk_page_thanks_for_temporary_users.enabled)&&void 0===(await e.api.pagesExist(i))[i]&&await e.api.editSection(i,"new","Thank you!","{{subst:Thanks-autosign}}",s),n}return t.user.ip?await e.api.editSection(i,"new","Thank you!","{{subst:Thanks-autosign}}",s):await e.api.thankRevision(t.id)},successful:(e,t,n)=>{e.store.statistics.edits_reviewed.thanked++}},"welcome-user":{title:"Welcome user",icon:"fas fa-paper-plane",parameters:(e,t)=>[{id:"template",title:"Template",type:"choice",options:Object.keys(r.welcomes),default:Object.keys(r.welcomes)[0]}],progress:"Welcoming user",valid:(e,t,n)=>t?void 0!==t.user.talk?{valid:!1,reason:"User cannot be welcomed because their talk page is not empty."}:{valid:!0}:{valid:!1,reason:"User can only be welcomed when an item is selected."},script:async(e,t,n)=>await(async()=>{const s=`User talk:${t.user.name}`;if(void 0!==(await e.api.pagesExist([s]))[s])return{valid:!1,reason:"User cannot be welcomed because their talk page is not empty."};let i=r.welcomes[n.template];if(!i)return{valid:!1,reason:"Selected welcome template does not exist."};const a=new Set([i]);for(;"function"==typeof(null===(o=i)||void 0===o?void 0:o.template);){var o,l;if(i=r.welcomes[i.template(e,t)],a.has(i))return null!==(l=void e.gui.dialog.toast("REPORT TO DEVELOPER","Uh oh! Something has gone <i>cat</i>astrophically wrong. Please report this to a developer, and include the error code below:<br><br><code>WELCOME_TEMPLATE_LOOP</code>","dev",-1))&&void 0!==l?l:{valid:!1};if(!i)return{valid:!1,reason:"Selected welcome template does not exist."};a.add(i)}const d=`{{subst:${i.template}}}${i.sign?" [[User:LuniZunie|LuniZunie]] ([[User talk:LuniZunie|talk]]) 17:15, 25 May 2026 (UTC)":""}`;return await e.api.append(s,null,d,e.api.summary("Welcome to Wikipedia!"))})(),successful:(e,t,n)=>{e.store.statistics.users_welcomed.total++,e.queue.talks.set(t.user.name,!0),e.gui.renderQueue()}},"watch-page":{title:"Watch page",icon:"fas fa-eye",progress:"Watching page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be watched when an item is selected."},script:async(e,t,n)=>await e.api.watchPage(t.page.title,e.util.utcString(e.util.expiryToDate(e.store.settings.expiry.watchlist))),successful:(e,t,n)=>{e.store.statistics.watchlist.watched++,e.queue.watchlist.set(t.page.title,!0)}},"unwatch-page":{title:"Unwatch page",icon:"fas fa-eye-slash",progress:"Unwatching page",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be unwatched when an item is selected."},script:async(e,t,n)=>await e.api.unwatchPage(t.page.title),successful:(e,t,n)=>{e.store.statistics.watchlist.unwatched++,e.queue.watchlist.set(t.page.title,!1)}},"whitelist-user":{title:"Add user to whitelist",icon:"fas fa-user-check",progress:"Adding user to whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be added to whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.users.set(t.user.name,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.whitelist.users).valueOf()]),e.store.statistics.items_whitelisted.total++,e.store.statistics.items_whitelisted.users++,e.gui.renderQueue(),{valid:!0})},"unwhitelist-user":{title:"Remove user from whitelist",icon:"fas fa-user-minus",progress:"Removing user from whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be removed from whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.users.delete(t.user.name),e.gui.renderQueue(),{valid:!0})},"whitelist-page":{title:"Add page to whitelist",icon:"fas fa-check",progress:"Adding page to whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be added to whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.pages.set(t.page.title,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.whitelist.pages).valueOf()]),e.store.statistics.items_whitelisted.total++,e.store.statistics.items_whitelisted.pages++,e.gui.renderQueue(),{valid:!0})},"unwhitelist-page":{title:"Remove page from whitelist",icon:"fas fa-minus",progress:"Removing page from whitelist",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be removed from whitelist when an item is selected."},script:(e,t,n)=>(e.store.whitelist.pages.delete(t.page.title),e.gui.renderQueue(),{valid:!0})},"highlight-user":{title:"Add user to highlighted users",icon:"fas fa-star",progress:"Adding user to highlighted users",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be added to highlighted users when an item is selected."},script:(e,t,n)=>(e.store.highlight.users.set(t.user.name,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.highlight.users).valueOf()]),e.store.statistics.items_highlighted.total++,e.store.statistics.items_highlighted.users++,e.gui.renderQueue(),{valid:!0})},"unhighlight-user":{title:"Remove user from highlighted users",icon:"fas fa-user-minus",progress:"Removing user from highlighted users",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User can only be removed from highlighted users when an item is selected."},script:(e,t,n)=>(e.store.highlight.users.delete(t.user.name),e.gui.renderQueue(),{valid:!0})},"highlight-page":{title:"Add page to highlighted pages",icon:"fas fa-star",progress:"Adding page to highlighted pages",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be added to highlighted pages when an item is selected."},script:(e,t,n)=>(e.store.highlight.pages.set(t.page.title,[Date.now(),e.util.expiryToDate(e.store.settings.expiry.highlight.pages).valueOf()]),e.store.statistics.items_highlighted.total++,e.store.statistics.items_highlighted.pages++,e.gui.renderQueue(),{valid:!0})},"unhighlight-page":{title:"Remove page from highlighted pages",icon:"fas fa-minus",progress:"Removing page from highlighted pages",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be removed from highlighted pages when an item is selected."},script:(e,t,n)=>(e.store.highlight.pages.delete(t.page.title),e.gui.renderQueue(),{valid:!0})},"refresh-user-contributions":{title:"Refresh user contributions",icon:"fas fa-rotate",progress:"Refreshing user contributions",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User contributions can only be refreshed when an item is selected."},script:async(e,t,n)=>{try{var s;document.querySelector("#refresh-page-history").classList.add("refreshing");const n=(await e.api.parseUsers([t.user.name]))[0].user;return e.queue.talks.set(t.user.name,n.talk),e.queue.contributions.set(t.user.name,n.contributions),e.queue.blocked.set(t.user.name,n.blocked),e.queue.blocks.set(t.user.name,n.blocks),t.user.edits=Math.max(n.edits,(null===(s=n.contributions)||void 0===s?void 0:s.length)||0),t.user.warning=e.queue.getWarningLevel(n.talk||""),t.user.warnings=e.queue.getWarningHistory(n.talk||""),delete t.user.cached_contributions,e.gui.renderQueue(),e.queue.current.item===t&&e.gui.newCurrentItem(t),{valid:!0}}catch(e){return console.error(e),{valid:!1,reason:"An error occurred while fetching user contributions."}}}},"refresh-page-history":{title:"Refresh page history",icon:"fas fa-rotate",progress:"Refreshing page history",valid:(e,t,n)=>t?"users"===t.type?{valid:!1,reason:"Page history cannot be refreshed for user creations."}:{valid:!0}:{valid:!1,reason:"Page history can only be refreshed when an item is selected."},script:async(e,t,n)=>{try{document.querySelector("#refresh-page-history").classList.add("refreshing");const[n,s]=await Promise.all([e.api.getHistory(t.page.title),e.api.getPagesDetails(t.page.title)]),i=s[t.page.title];return e.queue.histories.set(t.page.title,n),t.page.metadata=i.metadata,t.page.categories=i.categories,t.page.protection=i.protection,delete t.page.cached_history,e.gui.renderQueue(),e.queue.current.item===t&&e.gui.newCurrentItem(t),{valid:!0}}catch(e){return console.error(e),{valid:!1,reason:"An error occurred while fetching page history."}}}},"open-user-page":{title:"Open user page",icon:"fas fa-circle-user",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`User:${t.user.name}`)),{valid:!0})},"open-user-talk":{title:"Open user talk page",icon:"fas fa-comment",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User talk page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`User talk:${t.user.name}`)),{valid:!0})},"open-user-contributions":{title:"Open user contributions",icon:"fas fa-list",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User contributions can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`Special:Contributions/${t.user.name}`)),{valid:!0})},"open-user-filter-log":{title:"Open user filter log",icon:"fas fa-filter",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"User filter log can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`?title=Special:AbuseLog&wpSearchUser=${encodeURIComponent(t.user.name)}`,!0)),{valid:!0})},"open-page":{title:"Open page",icon:"fas fa-file",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(t.page.title)),{valid:!0})},"open-page-talk":{title:"Open page talk",icon:"fas fa-comments",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page talk can only be opened when an item is selected."},script:(e,t,n)=>{const s=t.page.title.split(":");let i="Talk";s.length>1&&(i=s[0].toLowerCase().includes("talk")?s[0]:`${s[0]} talk`);const a=e.page(`${i}:${1===s.length?s[0]:s.slice(1).join(":")}`);return e.open(a),{valid:!0}}},"open-page-history":{title:"Open page history",icon:"fas fa-clock-rotate-left",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Page history can only be opened when an item is selected."},script:(e,t,n)=>(e.open(e.page(`Special:PageHistory/${t.page.title}`)),{valid:!0})},"open-revision":{title:"Open revision",icon:"fas fa-file-lines",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Revision can only be opened for edits."}:{valid:!0}},script:(e,t,n)=>(e.open(e.page(`Special:Permalink/${t.id}`)),{valid:!0})},"open-diff":{title:"Open diff",icon:"fas fa-code-compare",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Diff can only be opened for edits."}:{valid:!0}},script:(e,t,n)=>(e.open(e.page(`Special:Diff/${t.id}`)),{valid:!0})},"copy-link":{title:"Copy link",icon:"fas fa-link",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Link can only be copied when an item is selected."},script:(e,t,n)=>{if("edit"===t.group)navigator.clipboard.writeText(e.page(`?diff=${t.id}`,!0));else if("logevent"===t.group)navigator.clipboard.writeText(e.page(`?title=Special:Log&logid=${t.id}`,!0));else{if("abuselog"!==t.group)return e.gui.dialog.toast("Cannot copy link","Please report this issue to a developer, including the error code below:<br><br><code>UNKNOWN_ITEM_GROUP_FOR_LINK_COPY</code>","error",3e3),{valid:!1};t.revid?navigator.clipboard.writeText(e.page(`?diff=${t.revid}`,!0)):navigator.clipboard.writeText(e.page(`?title=Special:AbuseLog/${t.id}`,!0))}return e.gui.dialog.toast("Link copied","The link has been copied to your clipboard.","success",3e3),{valid:!0}}},"open-revert-menu":{title:"Open revert menu",icon:"fas fa-undo",valid:(e,t,n)=>{let i=t.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Revert menu is only available for edits."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector('[data-menu="revert"]'),i=document.querySelector("#revert-menu");if(i.innerHTML="",e.gui.createWarnMenu("reverts",i,t),s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-warn-menu":{title:"Open warn menu",icon:"fas fa-exclamation-triangle",valid:(e,t,n)=>t?{valid:!0}:{valid:!1,reason:"Warning menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="warn"]'),i=document.querySelector("#warn-menu");if(i.innerHTML="",e.gui.createWarnMenu("warnings",i,t),s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-user-menu":{title:"Open user menu",icon:"fas fa-flag",valid:(e,t,n)=>e.queue.current.item?{valid:!0}:{valid:!1,reason:"User menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="user"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-page-menu":{title:"Open page menu",icon:"fas fa-flag",valid:(e,t,n)=>e.queue.current.item?{valid:!0}:{valid:!1,reason:"Page menu is only available when an item is selected."},script:(e,t,n)=>{const s=document.querySelector('[data-menu="page"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"open-edit-menu":{title:"Open edit menu",icon:"fas fa-flag",valid:(e,t,n)=>{let i=e.queue.current.item.type;return"abuselog"===i&&t.revid&&(i="edit"),"edit"!==s.Queue.groups[i]?{valid:!1,reason:"Edit menu is only available for edits."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector('[data-menu="edit"]');if(s){const t=s.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${s.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(e.gui.closeMenus(),n.classList.add("show"),t.classList.add("active"),e.gui.positionBottomMenu(s,n)))}return{valid:!0}}},"switch-to-recent-queue":{title:"Switch to recent changes queue",icon:"fas fa-stopwatch",valid:(e,t,n)=>e.store.settings.queue.recent.enabled?{valid:!0}:{valid:!1,reason:"Recent changes queue is not enabled."},script:(e,t,n)=>(e.queue.switch("recent"),{valid:!0})},"switch-to-pending-queue":{title:"Switch to pending changes queue",icon:"fas fa-flag",valid:(e,t,n)=>e.store.settings.queue.pending.enabled?e.rights.review?e.api.hasPendingChanges?{valid:!0}:{valid:!1,reason:"The pending changes extension is not enabled on this wiki."}:{valid:!1,reason:"You do not have permission to review pending changes."}:{valid:!1,reason:"Pending changes queue is not enabled."},script:(e,t,n)=>(e.queue.switch("pending"),{valid:!0})},"switch-to-watchlist-queue":{title:"Switch to watchlist queue",icon:"fas fa-book-bookmark",valid:(e,t,n)=>e.store.settings.queue.watchlist.enabled?{valid:!0}:{valid:!1,reason:"Watchlist queue is not enabled."},script:(e,t,n)=>(e.queue.switch("watchlist"),{valid:!0})},"switch-to-users-queue":{title:"Switch to user creation logs queue",icon:"fas fa-user-plus",valid:(e,t,n)=>e.store.settings.queue.users.enabled?{valid:!0}:{valid:!1,reason:"User creation logs queue is not enabled."},script:(e,t,n)=>(e.queue.switch("users"),{valid:!0})},"switch-to-abuselog-queue":{title:"Switch to abuse log queue",icon:"fas fa-filter-circle-xmark",valid:(e,t,n)=>e.store.settings.queue.abuselog.enabled?{valid:!0}:{valid:!1,reason:"Abuse log queue is not enabled."},script:(e,t,n)=>(e.queue.switch("abuselog"),{valid:!0})},"toggle-zen-mode":{title:"Toggle zen mode",icon:"fas fa-spa",script:(e,t,n)=>{var s;return e.store.settings.zen.enabled=!e.store.settings.zen.enabled,null===(s=document.querySelector("#zen-mode-enable"))||void 0===s||s.classList.toggle("active",e.store.settings.zen.enabled),e.gui.updateZenMode(),{valid:!0}}},"toggle-consecutive-edits":{title:"Toggle consecutive edits",icon:"fas fa-users",valid:(e,t,n)=>{const s=e.queue.current.type;return"recent"!==s&&"watchlist"!==s?{valid:!1,reason:"Consecutive edits can only be viewed in the recent changes or watchlist queues."}:{valid:!0}},script:(e,t,n)=>{const s=document.querySelector("#consecutive-edits-tab");return s.classList.contains("hidden")||(s.classList.contains("selected")?document.querySelector("latest-edits-tab").click():s.click()),{valid:!0}}}}},8921(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.EventManager=void 0;var s=n(985),i=n(870),a=n(5564);t.EventManager=class{constructor(e){this.ws=e,this.events=s.events,this.conditions=i.conditions}button(e,t){const n=this.ws;e.addEventListener("click",e=>(e=>{n.gui.selectedMenu=null;const s=n.queue.current.item,i={};for(const o of(null===(a=(r=n.gui.events.events[t]).parameters)||void 0===a?void 0:a.call(r,n,s))||[]){var a,r;"external"===o.id&&(i[o.id]=(null==e?void 0:e.altKey)||!1)}n.execute({actions:[{name:t,params:i}]})})(e))}submenu(e,t){var n,s;const i=this.events[t];e.dataset.eventName=t;const r=this.ws.queue.current,o=`${r.type}:${null===(n=r.item)||void 0===n?void 0:n.id}`,l={};if(e.dataset.eventId===o)for(const t of(null===(d=i.parameters)||void 0===d?void 0:d.call(i,this.ws,this.ws.queue.current.item))||[]){var d;const n=e.querySelector(`[data-paramid="${t.id}"]`);l[t.id]="checkbox"===n.type?n.checked:n.value}else e.dataset.eventId=o;e.innerHTML="";const c=document.createElement("div");c.classList.add("bottom-subcontent-title"),c.textContent=i.title,e.appendChild(c);const u=new Map,p={},g=(0,a.sortDependencies)((null===(s=i.parameters)||void 0===s?void 0:s.call(i,this.ws,this.ws.queue.current.item))||[]);for(const t of g){const n=document.createElement("div");n.classList.add("bottom-subcontent-input-title"),n.textContent=t.title,e.appendChild(n);const s={};for(const e of null!==(h=t.dependencies)&&void 0!==h?h:[]){var h;s[e]=p[e]}const i="function"==typeof t.default?t.default(s):t.default;let a=null;switch(t.type){case"choice":{const n=document.createElement("select");n.dataset.paramid=t.id,e.appendChild(n);const r="function"==typeof t.options?t.options(s):t.options;for(const e of null!=r?r:[]){const t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),a=()=>{const e={};for(const n of null!==(s=t.dependencies)&&void 0!==s?s:[]){var s;e[n]=p[n]}const i=n.value,a="function"==typeof t.options?t.options(e):t.options;n.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}if(a.includes(i))n.value=i;else{const s="function"==typeof t.default?t.default(e):t.default;n.value=s,p[t.id]=s}},n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}break;case"text":{const n=document.createElement("input");n.type="text",n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}break;case"boolean":{const n=document.createElement("input");n.type="checkbox",n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.checked=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.checked=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.checked;for(const e of u.get(t.id)||[])e()})}break;case"duration":{const n=document.createElement("duration-input");n.dataset.paramid=t.id,e.appendChild(n),void 0!==l[t.id]?(n.value=l[t.id],p[t.id]=l[t.id]):"default"in t&&(n.value=i,p[t.id]=i),n.addEventListener("change",()=>{p[t.id]=n.value;for(const e of u.get(t.id)||[])e()})}}if("function"==typeof a)for(const e of null!==(m=t.dependencies)&&void 0!==m?m:[]){var m;u.has(e)||u.set(e,[]),u.get(e).push(a)}}const v=document.createElement("button");v.classList.add("bottom-subcontent-button"),v.textContent="Submit",e.appendChild(v),v.addEventListener("click",()=>{const n={};for(const t of g){const s=e.querySelector(`[data-paramid="${t.id}"]`);n[t.id]=s.value}this.ws.execute({actions:[{name:t,params:n}]}),this.ws.gui.closeMenus()})}}},372(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Queue=void 0;var s=n(2852),i=n(2595),a=n(6400);function r(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function o(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){return e.get(d(e,t))}function d(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var c=new WeakMap,u=new WeakSet;class p{static areSameGroup(e,t){return this.groups[e]===this.groups[t]}constructor(e){var t,n;r(t=this,n=u),n.add(t),function(e,t,n){r(e,t),t.set(e,n)}(this,c,Promise.resolve()),this.ws=e,this.queues=Object.fromEntries(["void",...p.types].map(t=>[t,{type:t,item:null,previous:null,queue:[],hold:[],repeats:{},history:new i.Stack(100),memory:new s.Memory({size:1e3}),last:{timestamp:e.util.utcString(new Date),id:0}}])),this.cache={simple:new s.Memory({size:1e3}),full:new s.Memory({size:250})},this.current=this.queues[p.types[0]],this.pending=new Map,this.watchlist=new s.Memory({size:1e3}),this.talks=new s.Memory({size:500}),this.warnings=new s.Memory({size:1e3,timeout:864e5}),this.noWelcome=new s.Memory({timeout:36e5}),this.histories=new s.Memory({size:1e3}),this.contributions=new s.Memory({size:1e3}),this.blocks=new s.Memory({size:1e3}),this.blocked=new s.Memory({size:1e4}),this.playedSound={mention:new s.Memory({timeout:6e4})},this.bypass=new s.Memory({timeout:36e5,size:1e4}),this.backoff=2e3}switch(e){var t;this.current.type!==e&&("pending"===this.current.type&&(this.queues.pending.queue=this.queues.pending.queue.filter(e=>this.pending.has(e.id))),document.querySelector("#clear-queue").classList.toggle("hidden","pending"===e),this.current=this.queues[e],this.current.queue.some(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)})||(this.current.item=this.current.queue[0]||null),this.ws.gui.renderQueue(),this.ws.gui.newCurrentItem(this.current.item),document.querySelectorAll("#queue-tabs > .queue-tab.selected").forEach(e=>e.classList.remove("selected")),null===(t=document.querySelector(`#queue-tab-${e}`))||void 0===t||t.classList.add("selected"))}async fetch(){try{const i=this.ws.store.settings.queue;if(i.pending.enabled&&this.ws.rights.review){const e=(await this.ws.api.feeds(null,{ns:"*",full:!0})).pending;this.pending.clear(),Object.values(e).forEach(e=>this.pending.set(e.revid,e)),await this.outdated("pending")}const a=await this.ws.api.feeds(i.recent.enabled?{ns:this.ws.store.settings.namespaces.join("|"),since:this.queues.recent.last.timestamp}:null,i.pending.enabled&&this.ws.rights.review?{ns:"*",full:!1}:null,i.users.enabled?{ns:"*",since:this.queues.users.last.timestamp}:null,i.watchlist.enabled?{ns:"*",since:this.queues.watchlist.last.timestamp}:null,i.abuselog.enabled?{ns:this.ws.store.settings.namespaces.join("|"),since:this.queues.abuselog.last.timestamp}:null),r=this.ws.store.whitelist;for(const i of p.types){var e;const o=this.queues[i].last.id;let l=null!==(e=a[i])&&void 0!==e?e:[];const d=l.reduce((e,t)=>Math.max(e,t.timestamp),0);switch(d&&(this.queues[i].last.timestamp=this.ws.util.utcString(new Date(d))),p.groups[i]){case"edit":{const e=e=>e.revid>o;l="recent"===i?l.filter(t=>e(t)&&!r.pages.has(t.title)):l.filter(e)}break;case"abuselog":l=l.filter(e=>e.id>o);break;case"logevent":l=l.filter(e=>e.logid>o)}l=l.concat(this.queues[i].hold),l.length>25?this.queues[i].hold=l.splice(25).reverse():this.queues[i].hold=[];let c=!1;switch(i){case"recent":{const e=new Set;for(const n of l)for(const s of this.queues[i].queue){var t;e.has(s)||s.id!==(null===(t=this.current.item)||void 0===t?void 0:t.id)&&n.title===s.page.title&&s.id<n.revid&&e.add(s)}for(const t of e){const e=this.queues[i].queue.indexOf(t);e>-1&&(this.queues[i].queue.splice(e,1),this.ws.gui.removeQueueItem(i,t.id))}c=e.size>0}break;case"pending":for(const e of this.queues[i].queue){var n;if((null===(n=this.current.item)||void 0===n?void 0:n.id)!==e.id&&!this.pending.has(e.id)){const t=this.queues[i].queue.indexOf(e);t>-1&&(this.queues[i].queue.splice(t,1),this.ws.gui.removeQueueItem(i,e.id),c=!0)}}break;case"users":l=l.filter(e=>!e.temp);break;case"watchlist":{const e=new Set;for(const t of l)for(const n of this.queues[i].queue){var s;e.has(n)||n.id!==(null===(s=this.current.item)||void 0===s?void 0:s.id)&&(t.title===n.page.title&&n.id<t.revid?e.add(n):n.page.watched||e.add(n))}if(0===l.length)for(const t of this.queues[i].queue)t.page.watched||e.add(t);for(const t of e){const e=this.queues[i].queue.indexOf(t);e>-1&&(this.queues[i].queue.splice(e,1),this.ws.gui.removeQueueItem(i,t.id))}c=e.size>0}}if(0!==l.length)switch(p.groups[i]){case"edit":{this.queues[i].last.id=l.reduce((e,t)=>Math.max(e,t.revid),0);const e=this.ws.store.highlight,t=t=>{var n;return e.users.has(t.user)||e.pages.has(t.title)||(null===(n=t.tags)||void 0===n?void 0:n.some(t=>e.tags.has(t)))};l=l.filter(e=>{var n;return!r.users.has(e.user)&&!(null!==(n=e.tags)&&void 0!==n&&n.some(e=>r.tags.has(e)))&&(!this.bypass.has(e.user)||t(e))});const n={};let[s,a]=await Promise.allSettled(["recent"===i?this.ws.api.getEditCounts(l.map(e=>e.user).filter(e=>!this.bypass.has(e))):Promise.resolve([]),this.ws.api.getORES(l.filter(e=>{var t;if(null===(t=e.oresscores)||void 0===t||!t.length)return!0;n[e.revid]=e.oresscores},this.ws.store.settings.queue.ores_bias).map(e=>e.revid))]);"rejected"===s.status&&console.error("Edit counts failed:",s.reason),s="fulfilled"===s.status?s.value:{},"rejected"===a.status&&console.error("ORES failed:",a.reason),a="fulfilled"===a.status?a.value:{};for(const[e,t]of Object.entries(await this.ws.api.extractORES(n,this.ws.store.settings.queue.ores_bias)))a[e]=t;const o=this.queues[i].repeats,d=[];if("recent"===i){const e=this.ws.store.settings.queue.min_ores,n=this.ws.store.settings.queue.max_edits;l.forEach(r=>{var l,c;if(isNaN(a[r.revid])&&(o[r.revid]||0)<3)return o[r.revid]=(o[r.revid]||0)+1,this.queues[i].hold.push(r);delete o[r.revid];const u=null!==(l=null!==(c=s[r.user])&&void 0!==c?c:this.bypass.get(r.user))&&void 0!==l?l:0;u>n?(this.bypass.set(r.user,u),t(r)&&d.push(r)):((a[r.revid]||0)>=e||t(r))&&d.push(r)})}else l.forEach(e=>{if(isNaN(a[e.revid])&&(o[e.revid]||0)<3)return o[e.revid]=(o[e.revid]||0)+1,this.queues[i].hold.push(e);delete o[e.revid],d.push(e)});await this.add(i,d)}break;case"logevent":{let e=0;const t=new Set,n=[];l.forEach(s=>{t.has(s.logid)||(t.add(s.logid),s.logid>e&&(e=s.logid),n.push(s))}),this.queues[i].last.id=e,await this.add(i,n)}break;case"abuselog":{const e=l.filter(e=>null===e.editcount);let t={};e.length>0&&(t=await this.ws.api.getEditCounts(e.map(e=>e.user)));const n=this.ws.store.settings.queue.max_edits;let s=0;const a=[];l.forEach(e=>{var i;((null!==(i=e.editcount)&&void 0!==i?i:t[e.user])||0)>n||(e.id>s&&(s=e.id),a.push(e))}),this.queues[i].last.id=s,await this.add(i,a)}}else c&&this.ws.gui.renderQueue(this.queues[i].queue,this.current.edit,i)}await this.outdated(),this.backoff=p.refresh}catch(e){console.error(e),this.backoff=Math.min(2*this.backoff,12e4)}setTimeout(()=>this.fetch(),this.backoff)}async outdated(){{const e=[];for(const t of this.queues.pending.queue)t!==this.current.item&&(this.pending.has(t.id)||e.push(t));if(e.length>0)for(const t of e){const e=this.queues.pending.queue.indexOf(t);e>-1&&(this.queues.pending.queue.splice(e,1),this.ws.gui.removeQueueItem("pending",t.id))}}const e=new Set,t=["recent","watchlist","abuselog"];for(const n of t)this.queues[n].queue.forEach(t=>{("abuselog"!==n||t.revid)&&e.add(t.page.title)});const n=await this.ws.api.getLatestIds([...e]);for(const e of t){const t=[];for(const s of this.queues[e].queue){let i=s.id;if("abuselog"===e){if(!s.revid)continue;i=s.revid}const a=n[s.page.title];a&&a>i&&t.push([s.id,i])}if(t.length>0)for(const[n,i]of t){var s;const t="abuselog"===e?"revid":"id";if(i===(null===(s=this.queues[e].item)||void 0===s?void 0:s[t]))continue;const a=this.queues[e].queue.findIndex(e=>e[t]===i);a>-1&&(this.queues[e].queue.splice(a,1),this.ws.gui.removeQueueItem(e,n))}}this.ws.gui.renderQueue()}async add(e,t){const n={edit:"revid",logevent:"logid",abuselog:"id"}[p.groups[e]];(t=t.filter(t=>!this.queues[e].memory.has(t[n]))).forEach(t=>this.queues[e].memory.add(t[n]));const s=t.length;if(0===s)return;const i={ores:!1,mention:!1},a=await this.generate(e,t,!1);switch(p.groups[e]){case"edit":{const n=this.ws.store.settings.audio.ores_alert.threshold;for(let r=0;r<s;r++){t[r];const s=a[r];this.queues[e].queue.push(s),"recent"===e&&s.ores>=n&&(i.ores=!0),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}}break;case"logevent":for(let n=0;n<s;n++){t[n];const s=a[n];this.queues[e].queue.push(s),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}break;case"abuselog":for(let n=0;n<s;n++){t[n];const s=a[n];this.queues[e].queue.push(s),s.mentions.has&&!this.playedSound.mention.has(s.id)&&(this.playedSound.mention.add(s.id),i.mention=!0)}}this.sort(e),i.ores&&this.ws.store.settings.audio.ores_alert.enabled&&this.ws.audio.playSound(["queue","ores"]),i.mention&&this.ws.store.settings.username_highlighting.enabled&&this.ws.audio.playSound(["queue","mention"]),this.ws.gui.renderQueue(this.queues[e].queue,this.queues[e].item,e)}sort(e){var t;let n=-1;this.queues[e].item&&(n=this.queues[e].queue.findIndex(t=>t===this.queues[e].item));let s=this.queues[e].queue;n>=0&&(s=s.slice(0,n).concat(s.slice(n+1)));const i=this.ws.store.highlight,a=this.ws.store.settings.username_highlighting.enabled;switch(p.groups[e]){case"edit":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return-1;if(t.history)return 1;let n=e.ores;a&&e.mentions.has&&(n+=200),i.users.has(e.user.name)&&(n+=100),i.pages.has(e.page.title)&&(n+=75),n+=50*e.tags.filter(e=>i.tags.has(e)).length;let s=t.ores;return a&&t.mentions.has&&(s+=200),i.users.has(t.user.name)&&(s+=100),i.pages.has(t.page.title)&&(s+=75),s+=50*t.tags.filter(e=>i.tags.has(e)).length,n===s?t.id-e.id:s-n});break;case"logevent":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return 1;if(t.history)return-1;let n=100*(e.user.profanity.clamped||0);a&&e.mentions.has&&(n+=200);let s=100*(t.user.profanity.clamped||0);return a&&t.mentions.has&&(s+=200),n===s?t.id-e.id:s-n});break;case"abuselog":s=s.sort((e,t)=>{if(e.history&&t.history)return e.history-t.history;if(e.history)return 1;if(t.history)return-1;let n=0;i.users.has(e.user.name)&&(n+=100),i.pages.has(e.page.title)&&(n+=75),a&&e.mentions.has&&(n+=200);let s=0;return i.users.has(t.user.name)&&(s+=100),i.pages.has(t.page.title)&&(s+=75),a&&t.mentions.has&&(s+=200),n===s?t.id-e.id:s-n})}const r=new Set(null!==(t=this.queues[e].item)&&void 0!==t&&t.id?[this.queues[e].item.id]:[]);s=s.filter(e=>!r.has(e.id)&&(r.add(e.id),!0)),n>=0&&s.splice(n,0,this.queues[e].item),this.queues[e].queue=[...s.slice(0,this.ws.store.settings.queue.max_size)],this.queues[e].item||(this.queues[e].item=this.queues[e].queue[0])}async generate(e,t,n,s={}){var i;if(0===t.length)return[];const r=null!==(i=null==s?void 0:s.bypass)&&void 0!==i&&i,o=this.ws,l=o.api.username,d=[];switch(p.groups[e]){case"edit":{t=(t=t.filter(e=>{const t=(e=>{if(n){if(this.cache.simple.has(e))return this.cache.simple.get(e);if(this.cache.full.has(e))return this.cache.full.get(e)}else if(this.cache.full.has(e))return this.cache.full.get(e);return null})(e.revid);var s;return!t||(e.pending&&!t.pending&&(t.pending=e.pending),null!==(s=void d.push(t))&&void 0!==s&&s)})).map(e=>{var t;let n=null;return e.pending&&(n=null===(t=this.pending.get(e.revid))||void 0===t?void 0:t.prior),null!=n||(n=e.old_revid||e.parentid),{item:e,prior:n}});const s=await o.api.parseEdits(t,n,this.ws.store.settings.queue.ores_bias,r);for(const t of s){var c;const{item:s,prior:i,data:a}=t,r={comment:!1,diff:!1};if(l&&a.edit.diff){const e=document.createElement("div");e.innerHTML=a.edit.diff,e.textContent&&(r.diff=o.util.match(l,e.textContent))}this.watchlist.set(s.title,a.page.watched),this.histories.set(s.title,a.page.history),this.contributions.set(s.user,a.user.contributions),this.blocks.set(s.user,a.user.blocks),this.blocked.set(s.user,a.user.blocked);const u=["0","1","2","3","4","4im"],g=this.getWarningLevel(a.user.talk||"");u.indexOf(g)>u.indexOf(this.warnings.get(s.user)||"0")&&this.warnings.set(s.user,g);const h={page:{namespace:s.ns,title:s.title,get history(){var e;return null!==(e=o.queue.histories.get(s.title))&&void 0!==e?e:a.page.history},get watched(){var e;return null!==(e=o.queue.watchlist.get(s.title))&&void 0!==e?e:a.page.watched},metadata:a.page.metadata,categories:a.page.categories,protection:a.page.protection},user:{name:s.user,ip:o.util.isIPAddress(s.user),temp:o.util.isTempAccount(s.user),anon:o.util.isIPAddress(s.user)||o.util.isTempAccount(s.user),edits:Math.max(a.user.edits,(null===(c=a.user.contributions)||void 0===c?void 0:c.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(s.user))&&void 0!==e?e:a.user.contributions},warning:this.getWarningLevel(a.user.talk||""),warnings:this.getWarningHistory(a.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(s.user))&&void 0!==e?e:a.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(s.user))&&void 0!==e?e:a.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(s.user))&&void 0!==e?e:a.user.talk}},mentions:r,AI:{edit:null,username:null},id:s.revid,prior:i,timestamp:s.timestamp,comment:s.parsedcomment,minor:s.minor||!1,diff:a.edit.diff,sizediff:("sizediff"in s?s.sizediff:s.newlen-s.oldlen)||0,ores:a.edit.ores,tags:s.tags||[],reverts:a.page.reverts,consecutive:a.page.consecutive,propagating:!1,reviewed:!1,history:!1,pending:s.pending||!1,group:p.groups[e],type:e,simple:n,origin:s};!n&&o.AI&&(o.store.settings.AI.edit_analysis.enabled&&o.AI.analyze.edit(h).then(e=>h.AI.edit=e).catch(e=>h.AI.edit={error:e.message}).finally(()=>{var e;h.id===(null===(e=this.current.item)||void 0===e?void 0:e.id)&&o.gui.updateAIAnalysisDisplay(h.AI.edit)}),h.user.anon||o.store.whitelist.users.has(h.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(h).then(e=>{h.AI.username=e,e.flag&&this.promptUAA(h,e)}).catch(e=>h.AI.username={error:e.message})),d.push(h),n?this.cache.simple.set(s.revid,h):(this.cache.full.set(s.revid,h),this.cache.simple.has(s.revid)&&this.cache.simple.delete(s.revid))}}break;case"logevent":{const s=await o.api.parseUsers(t.map(e=>e.title.replace(/^(User|User talk):/,"")),n,r),i=await o.api.parseUsers(t.map(e=>e.user),n,r);for(let r=0;r<t.length;r++){var u,g;const c=t[r],h=s[r],m=i[r],v=c.title.replace(/^(User|User talk):/,""),f={username:!1,comment:!1};l&&v&&(f.username=o.util.match(l,v)),this.contributions.set(v,h.user.contributions),this.contributions.set(c.user,m.user.contributions),this.blocks.set(v,h.user.blocks),this.blocks.set(c.user,m.user.blocks),this.blocked.set(v,h.user.blocked),this.blocked.set(c.user,m.user.blocked);const b=["0","1","2","3","4","4im"],w=this.getWarningLevel(h.user.talk||"");b.indexOf(w)>b.indexOf(this.warnings.get(v)||"0")&&this.warnings.set(v,w);const y=this.getWarningLevel(m.user.talk||"");b.indexOf(y)>b.indexOf(this.warnings.get(c.user)||"0")&&this.warnings.set(c.user,y);const x=a.profanity.evaluate(v),k={page:{namespace:c.ns,title:c.title,history:[],get watched(){return!1},metadata:[],categories:[],protection:{}},user:{name:v,ip:o.util.isIPAddress(v),temp:o.util.isTempAccount(v),anon:o.util.isIPAddress(v)||o.util.isTempAccount(v),edits:Math.max(h.user.edits,(null===(u=h.user.contributions)||void 0===u?void 0:u.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(v))&&void 0!==e?e:h.user.contributions},warning:this.getWarningLevel(h.user.talk||""),warnings:this.getWarningHistory(h.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(v))&&void 0!==e?e:h.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(v))&&void 0!==e?e:h.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(v))&&void 0!==e?e:h.user.talk},profanity:x},performer:{name:c.user,ip:o.util.isIPAddress(c.user),temp:o.util.isTempAccount(c.user),anon:o.util.isIPAddress(c.user)||o.util.isTempAccount(c.user),edits:Math.max(m.user.edits,(null===(g=m.user.contributions)||void 0===g?void 0:g.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(c.user))&&void 0!==e?e:m.user.contributions},warning:this.getWarningLevel(m.user.talk||""),warnings:this.getWarningHistory(m.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(c.user))&&void 0!==e?e:m.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(c.user))&&void 0!==e?e:m.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(c.user))&&void 0!==e?e:m.user.talk}},mentions:f,AI:{username:null},id:c.logid,timestamp:c.timestamp,comment:c.parsedcomment,ores:x.clamped||0,filters:x.matches.map(e=>({filter:e.name,id:e.match})),propagating:!1,reviewed:!1,history:!1,group:p.groups[e],type:e,simple:n,origin:c};!n&&o.AI&&(k.user.anon||o.store.whitelist.users.has(k.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(k).then(e=>{k.AI.username=e,e.flag&&this.promptUAA(k,e)}).catch(e=>k.AI.username={error:e.message})),d.push(k)}}break;case"abuselog":{const s=await o.api.parseAbuselogs(t,n,r);for(const t of s){var h,m;const{item:s,data:i}=t,a={comment:!1,diff:!1};if(l&&i.edit.diff){const e=document.createElement("div");e.innerHTML=i.edit.diff,e.textContent&&(a.diff=o.util.match(l,e.textContent))}this.watchlist.set(s.title,i.page.watched),this.histories.set(s.title,i.page.history),this.contributions.set(s.user,i.user.contributions),this.blocks.set(s.user,i.user.blocks),this.blocked.set(s.user,i.user.blocked);const r=["0","1","2","3","4","4im"],c=this.getWarningLevel(i.user.talk||"");r.indexOf(c)>r.indexOf(this.warnings.get(s.user)||"0")&&this.warnings.set(s.user,c);const u=["disallow","warn","showcaptcha","tag","none"],g=u.length;let v=g-1;for(let e=0;e<g;e++)if(s.result.has(u[e])){v=e;break}const f={page:{namespace:s.ns,title:s.title,get history(){var e;return null!==(e=o.queue.histories.get(s.title))&&void 0!==e?e:i.page.history},get watched(){var e;return null!==(e=o.queue.watchlist.get(s.title))&&void 0!==e?e:i.page.watched},metadata:i.page.metadata,categories:i.page.categories,protection:i.page.protection},user:{name:s.user,ip:o.util.isIPAddress(s.user),temp:o.util.isTempAccount(s.user),anon:o.util.isIPAddress(s.user)||o.util.isTempAccount(s.user),edits:Math.max(i.user.edits,(null===(h=i.user.contributions)||void 0===h?void 0:h.length)||0),get contributions(){var e;return null!==(e=o.queue.contributions.get(s.user))&&void 0!==e?e:i.user.contributions},warning:this.getWarningLevel(i.user.talk||""),warnings:this.getWarningHistory(i.user.talk||""),get blocked(){var e;return null!==(e=o.queue.blocked.get(s.user))&&void 0!==e?e:i.user.blocked},get blocks(){var e;return null!==(e=o.queue.blocks.get(s.user))&&void 0!==e?e:i.user.blocks},get talk(){var e;return null!==(e=o.queue.talks.get(s.user))&&void 0!==e?e:i.user.talk}},mentions:a,AI:{edit:null,username:null},id:s.id,revid:s.revid,timestamp:s.timestamp,comment:i.parsedcomment,minor:!1,diff:i.edit.diff,sizediff:null===(m=s.diff)||void 0===m?void 0:m.size,ores:+(1-v/(g-1)).toFixed(2),filters:s.entries.map(e=>({id:(null==e?void 0:e.filter_id)||"-1",filter:null==e?void 0:e.filter}))||[],reverts:i.page.reverts,propagating:!1,reviewed:!1,history:!1,group:p.groups[e],type:e,simple:n,origin:s};!n&&o.AI&&(o.store.settings.AI.edit_analysis.enabled&&i.edit.diff&&o.AI.analyze.edit(f).then(e=>f.AI.edit=e).catch(e=>f.AI.edit={error:e.message}).finally(()=>{var e;f.id===(null===(e=this.current.item)||void 0===e?void 0:e.id)&&o.gui.updateAIAnalysisDisplay(f.AI.edit)}),f.user.anon||o.store.whitelist.users.has(f.user.name)||!o.store.settings.AI.username_analysis.enabled||o.AI.analyze.username(f).then(e=>{f.AI.username=e,e.flag&&this.promptUAA(f,e)}).catch(e=>f.AI.username={error:e.message})),d.push(f)}}}return d.forEach(e=>{if(e.comment){const t=(new DOMParser).parseFromString(e.comment,"text/html").body;t.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,n]=e.trim().split(/\s+/,2),s=new URL(t,`https://${this.ws.server}`).href;return n?`${s} ${n}`:s}).join(", ");e.setAttribute("srcset",t)}),e.comment=t.innerHTML;const n=(t.textContent||"").trim();e.has_comment=Boolean(n),!1===e.mentions.comment&&(e.mentions.comment=o.util.match(l,n)),e.mentions&&(e.mentions.has=Object.values(e.mentions).some(e=>e))}else e.has_comment=!1}),d}previous(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});if("pending"===this.current.type)return this.current.item=this.current.queue[Math.max(e-1,0)],this.ws.gui.renderQueue();if(e<=0){if(0===this.current.history.length)return;return this.current.queue.unshift(this.current.history.pop()),this.current.item=this.current.queue[0],this.ws.gui.renderQueue()}this.current.item=this.current.queue[e-1],this.ws.gui.renderQueue()}next(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});if(-1===e)return this.current.item=this.current.queue[0],this.ws.gui.renderQueue();if("pending"===this.current.type)return this.current.item=this.current.queue[Math.min(e+1,this.current.queue.length-1)],this.ws.gui.renderQueue();const t=this.current.item,n=p.groups[t.type];if(!t.reviewed&&("edit"===n||"abuselog"===n&&t.revid)){"watchlist"===t.type&&this.ws.api.markWatchlistSeen(t.page.title,t.id);const e="abuselog"===t.type?t.revid:t.id;if(["recent","watchlist","abuselog"].filter(e=>e!==t.type).forEach(t=>{this.queues[t].queue="abuselog"===t?this.queues[t].queue.filter(n=>n.revid!==e||(this.queues[t].history.push({...n,history:performance.now()}),!1)):this.queues[t].queue.filter(n=>n.id!==e||(this.queues[t].history.push({...n,history:performance.now()}),"watchlist"===t&&this.ws.api.markWatchlistSeen(n.page.title,n.id),!1))}),"abuselog"!==n){let e=this.queues.abuselog.queue.filter(e=>t.user.name===e.user.name&&t.page.title===e.page.title&&Math.abs(new Date(t.timestamp).getTime()-new Date(e.timestamp).getTime())<1e4);e.length>0&&Promise.allSettled(e.map(async e=>{let t=e.revid;return t||(t=await this.ws.api.getAbuseLogRevid(e.id)),t?(e.revid=t,{id:e.id,revid:t}):null})).then(e=>{const t=e.map(e=>"fulfilled"===e.status?e.value:null).filter(e=>e);this.queues.abuselog.queue=this.queues.abuselog.queue.filter(e=>!t.some(t=>t.revid===e.revid)),"abuselog"===this.current.type&&(t.forEach(e=>this.ws.gui.removeQueueItem("abuselog",e.id)),this.ws.gui.renderQueue(this.queues.abuselog.queue,this.queues.abuselog.item,"abuselog"))}).catch(()=>{})}}t.reviewed=!0,t&&this.ws.AI&&this.ws.AI.cancel.edit(t.id),this.current.queue.splice(e,1),this.ws.gui.removeQueueItem(this.current.type,t.id),0===this.current.queue.length?this.current.item=null:e<this.current.queue.length?this.current.item=this.current.queue[e]:this.current.item=this.current.queue[this.current.queue.length-1],t&&"edit"===p.groups[this.current.type]&&this.promptWelcome(t),this.current.history.push({...t,history:performance.now()}),this.ws.gui.renderQueue()}canGoPrevious(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});return-1===e?this.current.history.length>0:"pending"===this.current.type?e>0:0!==e||this.current.history.length>0}canGoNext(){const e=this.current.queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});return-1===e?Boolean(this.current.queue[0]):"pending"!==this.current.type||e<this.current.queue.length-1}clear(e){"pending"!==e&&(this.queues[e].item=null,this.queues[e].queue=[],this.current.type===e&&(this.ws.gui.newCurrentItem(null),this.ws.gui.clearQueueItems()))}async promptWelcome(e){if(!this.ws.store.settings.auto_welcome.enabled&&e.user.anon&&0!==(e.user.edits||0)&&void 0!==e.user.talk&&!this.noWelcome.has(e.user.name))try{var t;const n=`User talk:${e.user.name}`,s=await this.ws.api.pagesExist([n]);if(void 0!==s[n])return null!==(t=void this.talks.set(e.user.name,s[n]))&&void 0!==t?t:s[n];await this.ws.gui.settings.waitForClose();const i=await this.ws.gui.dialog.confirm("Auto-Welcome User",`Would you like to welcome <span class="confirmation-modal-username">${this.ws.util.escape(e.user.name)}</span>?<br><br>\n\t\t\t\t\t<span style="font-size: 0.9em; color: #888;">Editing: <strong>${this.ws.util.escape(e.page.title)}</strong></span>`,{username:e.user.name,hideUAA:!1});this.noWelcome.add(e.user.name),i&&this.ws.execute({actions:[{name:"welcome-user",params:{template:"Auto"}}]},void 0,void 0,e)}catch(e){console.error("Error during auto-welcome check:",e)}}promptUAA(e,t){var n,s,i;return n=c,s=this,i=l(c,this).then(()=>d(u,this,g).call(this,e,t)).catch(()=>{}),n.set(d(n,s),i),l(c,this)}async propagate(e,t){if(e.propagating)return await e.propagating;if(e.simple){let n;e.propagating=new Promise(e=>n=e);const[s]=await this.generate(e.type,[e.origin],!1,{bypass:t});s.history=e.history,Object.assign(e,s),n(),e.propagating=!1}else this.generate(e.type,[e.origin],!1,{bypass:t}).then(([t])=>{const n=e.revid;t.history=e.history,Object.assign(e,t),e.revid=n})}loadFromItem(e){const t=this.current.type;if(p.areSameGroup(t,"edit")&&("pending"!==t||"edit"!==e.type)){this.queues[t].queue=this.queues[t].queue.filter(t=>t.id!==e.id);const n=this.queues[t].queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});n>-1&&(this.queues[t].queue[n]=e)}this.queues[t].item=this.queues[t].queue.find(t=>t.id===e.id)||e,this.ws.gui.renderQueue()}async loadFromRevision(e,t){try{let n;if(this.ws.gui.updateDiffDisplay("loading"),this.cache.full.has(t))n=this.cache.full.get(t);else{let s;if(this.cache.simple.has(t)){const e=this.cache.simple.get(t);s={revid:e.id,parentid:e.prior,ns:e.page.namespace,title:e.page.title,user:e.user.name,timestamp:e.timestamp,parsedcomment:e.comment,tags:e.origin.tags,sizediff:e.sizediff,minor:e.minor}}else{const n=await this.ws.api.getRevision(e,t,!0);if(!n)throw new Error("Revision not found");s={revid:n.revid,parentid:n.parentid,ns:n.ns,title:e,user:n.user,timestamp:n.timestamp,parsedcomment:n.parsedcomment,tags:n.tags,size:n.size,oldlen:n.oldlen||0,newlen:n.size,minor:n.minor}}[n]=await this.generate("edit",[s],!1,{bypass:!0})}const s=this.current.type;if(p.areSameGroup(s,"edit")&&"pending"!==s&&"abuselog"!==s){this.queues[s].queue=this.queues[s].queue.filter(e=>e.id!==n.id);const e=this.queues[s].queue.findIndex(e=>{var t;return e.id===(null===(t=this.current.item)||void 0===t?void 0:t.id)});e>-1&&(this.queues[s].queue[e]=n)}this.queues[s].item=n,this.ws.gui.renderQueue()}catch(e){console.error("Error loading from revision:",e),document.querySelector("#diff-container").innerHTML=`<div class="error">Failed to load revision: ${this.ws.util.escape(e.message)}</div>`}}getWarningLevel(e){const t=["0","1","2","3","4","4im"];let n="0";const s=this.ws.util.monthSectionName(),i=this.ws.util.getPageSections(e);for(const e of i)if(e.title===s){const s=e.content.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/g);if(null===s)break;const i=[...s.map(e=>{const t=e.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/);return t?t[1].toString():"0"}),n].map(e=>[e,t.indexOf(e)]);n=i.sort((e,t)=>t[1]-e[1])[0][0]}return n}getWarningHistory(e){const t=[],n=this.ws.util.monthSectionName(),s=this.ws.util.getPageSections(e);for(const e of s)if(e.title===n){const n=e.content.matchAll(/<!-- Template:([\w-]+?)(\d(?:i?m)?) -->([^]+?)(?=<!-- Template:|$)/g);for(let s of n){const n=s[1],i=s[2],a=s[3],r=a.match(/(\d{2}:\d{2}.*?\d{4} \(UTC\))/);let o=r?r[1]:null;if(o&&(o=o.replace(/<[^>]*>/g,"")),o){const[,e,t,n,s]=o.match(/(\d{2}:\d{2}), (\d{1,2}) ([A-Za-z]+) (\d{4})/),i=["January","February","March","April","May","June","July","August","September","October","November","December"].indexOf(n);o=new Date(Date.UTC(s,i,t,...e.split(":"))).toUTCString()}else o=null;let l=null;const d=a.match(/\[\[User(?:[ _]talk)?:([^\]|]+)/i);d&&(l=d[1].trim());const c=a.match(/\[\[([^\]]+?)\]\]/),u=c?c[1]:null;t.push({template:n,level:i,timestamp:o,username:l,article:u,section:e.title})}}return t}}async function g(e,t){if(e.user.anon)return;if(this.ws.store.whitelist.users.has(e.user.name))return;if(!t.issues||0===t.issues.length)return;if(!t.explanation)return;const n=t.issues.map(e=>`${e.severity} ${e.policy} violation`).join(", "),s=Math.round(100*t.confidence),i=e.user.name;await this.ws.gui.settings.waitForClose();if(await this.ws.gui.dialog.confirm("Report Username to UAA",`\n\t\t\t\tThe username <span class="confirmation-modal-username">${this.ws.util.escape(i)}</span> for ${n}.<br><br>\n\t\t\t\t<strong>AI Confidence:</strong> ${s}%<br>\n\t\t\t\t<strong>Reasoning:</strong> ${t.explanation}<br>\n\t\t\t`,i)){await this.ws.gui.settings.waitForClose();const t=await this.ws.gui.dialog.UAA(e.user.name);t&&this.ws.execute({actions:[{name:"report-user-to-uaa",params:{reason:t}}]},void 0,void 0,e)}}t.Queue=p,o(p,"refresh",1e3),o(p,"types",["recent","pending","watchlist","abuselog","users"]),o(p,"groups",{void:"void",recent:"edit",pending:"edit",watchlist:"edit",edit:"edit",abuselog:"abuselog",users:"logevent"})},7054(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.WikiShield=void 0;var s=n(3241),i=n(8169),a=n(2535),r=n(4674),o=n(6151),l=n(372),d=n(8469),c=n(8678),u=n(9501),p=n(9808);function g(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function h(e,t){return e.get(m(e,t))}function m(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var v,f,b,w=new WeakMap,y=new WeakSet;class x{constructor(e,t,n,o){var c,p;g(c=this,p=y),p.add(c),function(e,t,n){g(e,t),t.set(e,n)}(this,w,{ready:[]}),this.__DEV__=o,this.started=!1,this.server=e,this.storage=new u.StorageManager,this.defaultStorage=new u.StorageManager,this.defaultStorage.load(),this.util=new s.Utility(this),this.api=new a.API(this,e,t,n),this.notifications=new r.Notifications(this),this.rights={},this.groups={},this.api.account().then(async e=>{this.rights=e.rights.reduce((e,t)=>({...e,[t]:!0}),{}),this.groups=e.groups.reduce((e,t)=>({...e,[t]:!0}),{});{const e=this.rights.review&&this.api.hasPendingChanges;document.querySelector("#queue-tab-pending").classList.toggle("hidden",!e),e||"pending"!==this.queue.current.type||this.queue.switch("recent")}await m(y,this,_).call(this),this.cleanup(),setInterval(()=>this.cleanup(),1e4),m(y,this,k).call(this,"ready")}),this.gui=new d.GUI(this),this.queue=new l.Queue(this),this.audio=new i.AudioManager(this),this.time={load:null,save:null}}get store(){return this.storage.data}disable(e,t){electron.disable(e,t)}on(e,t,n={}){return h(w,this)[e]&&h(w,this)[e].push({callback:t,options:n}),this}async init(e=null){return this.gui.build(),await this.audio.init(),await m(y,this,_).call(this,e)}async noinit(e=null){var t;const n=await m(y,this,_).call(this,e);if(null===(t=this.AI)||void 0===t||t.cancel.all(),this.store.settings.AI.enabled)if("Ollama"===this.store.settings.AI.provider)this.AI=new c.AI.providers.Ollama(this,this.store.settings.AI.Ollama);else this.AI=null;else this.AI=null;{const e=this.store.UI.queue.width;document.body.querySelector("#queue").style.width=e,document.body.querySelector("#right-container").style.width=`calc(100% - ${e})`}{const e=this.store.UI.details.width;document.body.querySelector("#right-details").style.width=e,document.body.querySelector("#right-top").style.width=e,document.body.querySelector("#main-container").style.width=`calc(100% - ${e})`}return this.gui.settings.update(),n}async start(){this.gui.start(),this.update(),this.queue.fetch(),this.started=!0}async update(){const e=performance.now();try{await this.api.account().then(e=>{this.rights=e.rights.reduce((e,t)=>({...e,[t]:!0}),{}),this.groups=e.groups.reduce((e,t)=>({...e,[t]:!0}),{})}),await this.api.getGlobalUserInfo(this.api.username).then(e=>{var t;(t=this.rights).rollback||(t.rollback=e.rights.includes("rollback"))}),this.rights.rollback||"LuniZunie"===this.api.username||this.disable("Rollback required","Your account no longer has rollback rights, which are required to use WikiShield.");{const e=this.rights.review&&this.api.hasPendingChanges;document.querySelector("#queue-tab-pending").classList.toggle("hidden",!e),e||"pending"!==this.queue.current.type||this.queue.switch("recent")}this.backup()}catch(e){console.error("Update error:",e)}setTimeout(()=>this.update(),Math.max(0,2500-(performance.now()-e)))}cleanup(){const e=Date.now();let t=!1;for(const[,n]of Object.entries(this.store.highlight))for(const[s,i]of n.entries())e>=i[1]&&(n.delete(s),t=!0);for(const[,n]of Object.entries(this.store.whitelist))for(const[s,i]of n.entries())e>=i[1]&&(n.delete(s),t=!0);t&&this.queue.current.item&&this.gui&&this.gui.renderQueue(this.queue.current.queue,this.queue.current.item)}controller(e){var t,n,s;if(this.started){if(this.gui.dialog.dialogs.active)return this.gui.dialog.controller(e);if(this.gui.settings.active)return this.gui.settings.controller(e);if(!("INPUT"===(null===(t=e.target)||void 0===t?void 0:t.tagName)||"TEXTAREA"===(null===(n=e.target)||void 0===n?void 0:n.tagName)||null!==(s=e.target)&&void 0!==s&&s.isContentEditable)&&"keydown"===e.type){if(e.repeat&&!this.store.settings.repeat_control_scripts)return;const t=(0,p.buildShortcut)(e);for(const n of this.store.control_scripts)n.keys.every(e=>e===t)&&(e.preventDefault(),this.execute(n))}}}async execute(e,t=!0,n=null,s=null){const i=(e,t)=>!e.name||("if"===e.name?this.gui.events.conditions[e.condition.name].check(this,t,e.condition.params):"if not"===e.name&&!this.gui.events.conditions[e.condition.name].check(this,t,e.condition.params));if(null===n){null!=s||(s=this.queue.current.item||1);const t=[e];let a=0;for(;t.length>0;){const e=t[0];if(i(e,s)){if(!e.actions){t.splice(0,1);continue}t.push(...e.actions)}e.name&&"if"!==e.name&&"if not"!==e.name&&this.gui.events.events[e.name].progress&&a++,t.splice(0,1)}if(a>0){let e=0;const t=new o.ProgressBar;n=(n,s)=>{const i="Done"===n?1:e/a;t.set(n,i,s),e++}}else n=e=>{}}if(i(e,s))for(const i of e.actions){if(!("name"in i))continue;const e={...i.params};for(const t of(null===(a=this.gui.events.events[i.name])||void 0===a||null===(r=a.parameters)||void 0===r?void 0:r.call(a,this,s))||[]){var a,r;t.id&&!(t.id in e)&&"default"in t&&(e[t.id]=t.default)}if("if"===i.name||"if not"===i.name)t=await this.execute(i,t,n,s);else{const a=this.gui.events.events[i.name],r=()=>{t=!1,this.audio.playSound(["action","failed"]),a.progress&&n(a.progress,!0)};try{if(t||!a.continuity){var l,d;const t=null!==(l=null===(d=a.valid)||void 0===d?void 0:d.call(a,this,s,e))&&void 0!==l?l:{valid:!0};if(t.valid){a.progress&&(n(a.progress,!1),this.audio.playSound(["action","default"])),this.store.statistics.actions_executed.total++;const t=await a.script(this,s,e);var c;if(!1===t.valid)r(),"reason"in t&&this.gui.dialog.toast("Action failed",t.reason,"error");else this.store.statistics.actions_executed.successful++,null===(c=a.successful)||void 0===c||c.call(a,this,s,e)}else r(),"reason"in t&&this.gui.dialog.toast("Action skipped",t.reason,"error")}}catch(e){r(),this.gui.dialog.toast("Please report to developer",`An error occurred while executing action "${i.name}". Check the console for details.`,"error"),console.error(`Error executing action "${i.name}":`,e.message||String(e))}}}return e.name||n("Done",!t),t}async getDEFCON(){const e="User:EnterpriseyBot/defcon",t=(await this.api.getPagesContent([e]))[e],n=t.match(/level\s*=\s*(\d+)/),s=t.match(/info\s*=\s*([\d.]+)/);return{level:n?Number(n[1]).toLocaleString():null,info:s?Number(s[1]).toLocaleString():null}}export(){this.time.save=performance.now(),this.store.statistics.session_time+=this.time.save-this.time.load;const{string:e,logs:t}=this.storage.encode();return u.StorageManager.output(t),e}backup(){this.time.save=performance.now(),this.store.statistics.session_time+=this.time.save-this.time.load,this.time.load=this.time.save;const{string:e}=this.storage.encode();return electron.localStorage.set(`WikiShield:BackupStorage-${this.api.username}`,`${Date.now()};${e}`),!0}async save(){this.backup();const e=`${Date.now()};${this.export()}`,t=this.api.username;if(window.isFinite)electron.saveAccount(t,e);else try{const n=await this.api.postWithToken({action:"options",optionname:"userjs-wikishield-storage",optionvalue:e});"success"===(null==n?void 0:n.options)||console.error(`[WikiShield] Failed to save account data for ${t}:`,n)}catch(e){console.error(`[WikiShield] Failed to save account data for ${t}:`,e)}}async load(){try{var e,t;return null!==(e=null===(t=[electron.localStorage.get(`WikiShield:BackupStorage-${this.api.username}`),(await this.api.post({action:"query",meta:"userinfo",uiprop:"options",format:"json"})).query.userinfo.options["userjs-wikishield-storage"]].reduce((e,t)=>{var n;null!=t||(t="0;e30=");let s=0,i=t;return t.includes(";")&&([s,i]=t.split(";",2),s=parseInt(s,10)),s>0&&s>(null!==(n=null==e?void 0:e.timestamp)&&void 0!==n?n:0)?{timestamp:s,data:i}:e},null))||void 0===t?void 0:t.data)&&void 0!==e?e:"e30="}catch(e){var n;return null!==(n=void console.error("Failed to load storage from wiki:",e))&&void 0!==n?n:"e30="}}page(e,t,n=!0){return`https://${this.server}/${t?`w/index.php${e}`:`wiki/${n?encodeURIComponent(e):e}`}`}open(e,t){"force"===t?t=!1:t||(t=!this.store.settings.wikipedia_popups.enabled),t?electron.openExternal(e):electron.openInBrowser(e).then(e=>{e&&requestAnimationFrame(()=>{if(this.gui.dialog.popups.push(e),!document.getElementById("popup-blocker")){const e=document.createElement("div");e.id="popup-blocker",e.innerText="Please close the popup or click anywhere on this page to continue using WikiShield.",document.body.appendChild(e),this.gui.dialog.check()}})})}}function k(e){if(h(w,this)[e])for(const n of h(w,this)[e])try{n.callback()}catch(e){}finally{var t;!0===(null===(t=n.options)||void 0===t?void 0:t.once)&&(h(w,this)[e]=h(w,this)[e].filter(e=>e!==n))}return this}async function _(e=null){const t=this.storage.decode(null!=e?e:await this.load()).logs;var n,s,i;(this.time.load=performance.now(),this.store.settings.AI.enabled)?"Ollama"===this.store.settings.AI.provider?"function"==typeof(null===(n=c.AI.providers)||void 0===n?void 0:n.Ollama)?this.AI=new c.AI.providers.Ollama(this,this.store.settings.AI.Ollama):(console.error("AI.providers.Ollama is not available. Falling back to null."),this.AI=null):(null===(s=this.AI)||void 0===s||s.cancel.all(),this.AI=null):(null===(i=this.AI)||void 0===i||i.cancel.all(),this.AI=null);return t}t.WikiShield=x,v=x,f="config",b={version:"2.0.0",changelog:{version:"6",HTML:fetch("https://raw.githubusercontent.com/LuniZunie/WikiShield-App/refs/heads/main/data/CHANGELOG.html").then(e=>e.text()).catch(()=>"<em>Could not fetch changelog.</em>")},pages:{AIV:"Wikipedia:Administrator intervention against vandalism",UAA:"Wikipedia:Usernames for administrator attention",RFPP:"Wikipedia:Requests for page protection/Increase",SRG:"Steward requests/Global"},config:{refresh:{recent:2e3,pending:2e3,watchlist:2e3,users:2e3},historyCount:10}},(f=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(f))in v?Object.defineProperty(v,f,{value:b,enumerable:!0,configurable:!0,writable:!0}):v[f]=b},4018(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.namespaces=void 0;t.namespaces=[{name:"Main",id:0,analysis_description:{edit:"",username:""}},{name:"Talk",id:1,analysis_description:{edit:"",username:""}},{name:"User",id:2,analysis_description:{edit:"Flag content unrelated to Wikipedia, such as self-promotion. If the page looks like a Wikipedia article, check that it isn't an obvious hoax, and that it is a subpage. Do not follow strict standards for these pages.",username:"Check whether the username matches the base page title. Most often, a user page should only be edited by that user. Consider alternative accounts, like User:Example creating User:Example (alt)."}},{name:"User talk",id:3,analysis_description:{edit:"",username:""}},{name:"Project",id:4,analysis_description:{edit:"",username:""}},{name:"Project talk",id:5,analysis_description:{edit:"",username:""}},{name:"File",id:6,analysis_description:{edit:"",username:""}},{name:"File talk",id:7,analysis_description:{edit:"",username:""}},{name:"MediaWiki",id:8,analysis_description:{edit:"",username:""}},{name:"MediaWiki talk",id:9,analysis_description:{edit:"",username:""}},{name:"Template",id:10,analysis_description:{edit:"",username:""}},{name:"Template talk",id:11,analysis_description:{edit:"",username:""}},{name:"Help",id:12,analysis_description:{edit:"",username:""}},{name:"Help talk",id:13,analysis_description:{edit:"",username:""}},{name:"Category",id:14,analysis_description:{edit:"",username:""}},{name:"Category talk",id:15,analysis_description:{edit:"",username:""}},{name:"Portal",id:100,analysis_description:{edit:"",username:""}},{name:"Portal talk",id:101,analysis_description:{edit:"",username:""}},{name:"Draft",id:118,analysis_description:{edit:"",username:""}},{name:"Draft talk",id:119,analysis_description:{edit:"",username:""}},{name:"MOS",id:126,analysis_description:{edit:"",username:""}},{name:"MOS talk",id:127,analysis_description:{edit:"",username:""}},{name:"TimedText",id:710,analysis_description:{edit:"",username:""}},{name:"TimedText talk",id:711,analysis_description:{edit:"",username:""}},{name:"Module",id:828,analysis_description:{edit:"Check whether the edit is meaningful Lua code. In this namespace, anything that isn't written in Lua can be safely assumed to be vandalism. Be careful about multi-line strings, as they might contain non-Lua code: check the context of the edit to make sure. Additionally, check if the edit introduces any obvious Lua syntax errors.",username:""}},{name:"Module talk",id:829,analysis_description:{edit:"",username:""}},{name:"Event",id:1728,analysis_description:{edit:"",username:""}},{name:"Event talk",id:1729,analysis_description:{edit:"",username:""}}]},6400(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.profanity=void 0;const n="\\*#\\-",s=`[${n}a4]`,i=`[${n}b6]`,a=`[${n}ck]`,r=`[${n}h]`,o=`[${n}i1y]`,l=`[${n}o0]`,d=`[${n}t7]`,c={a:s,b:i,c:a,d:`[${n}d6]`,e:`[${n}e3]`,f:`[${n}f]`,g:`[${n}g9]`,h:r,i:o,j:`[${n}j]`,k:`[${n}k]`,l:`[${n}l1]`,m:`[${n}m]`,n:`[${n}n]`,o:l,p:`[${n}p9]`,q:`[${n}q9]`,r:`[${n}r]`,s:`[${n}sz526]`,t:d,u:`[${n}uv]`,v:`[${n}vu]`,w:`[${n}w]`,x:`[${n}x]`,y:`[${n}y]`,z:`[${n}zs25]`,0:`[${n}0]`,1:`[${n}1]`,2:`[${n}2]`,3:`[${n}3]`,4:`[${n}4]`,5:`[${n}5]`,6:`[${n}6]`,7:`[${n}7]`,8:`[${n}8]`,9:`[${n}9]`};class u{constructor(e={}){this.conversion={};for(const[t,n]of Object.entries(e))for(const e of n)this.conversion[e]&&console.warn(`Profanity lookalike collision: ${e} is already mapped to ${this.conversion[e]}, remapping to ${t}`),this.conversion[e]=t}removeAccents(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}obscureReplacements(e){return e.replace(/(\/[|\\]\/|\\[|\\]\\)/g,"n").replace(/&/g,"and").replace(/zero/g,"0").replace(/one/g,"1").replace(/two/g,"2").replace(/three/g,"3").replace(/four/g,"4").replace(/five/g,"5").replace(/six/g,"6").replace(/seven/g,"7").replace(/eight/g,"8").replace(/nine/g,"9")}parseString(e,t=!1){e=t?e.replace(/[._,;:|]/g," ").replace(/\s+/g," ").toLowerCase():e.replace(/[\s._,;:|]/g,"").toLowerCase(),e=this.removeAccents(e);let n="";for(const t of e)this.conversion[t]?n+=this.conversion[t]:n+=t;return e=this.obscureReplacements(n)}analyzeObfuscation(e,t,n,s,i=!1){const a=e.substring(t,n);let r=0;if(/\s/.test(a)&&!i)return-.95;const o=this.countCaseChanges(a);if(o>0){o/Math.max(1,a.length-1)>.3&&(r+=.3)}if(/[._,;:|]/.test(a)){const e=(a.match(/[._,;:|]/g)||[]).length,t=(a.match(/[a-zA-Z0-9]/g)||[]).length;if(t>0){const n=e/t;n>.3&&(r+=Math.min(.5,.7*n))}}const l=this.checkWordBoundaries(e,t,n,s,i);r+=l;const d=this.checkSubstitution(a,s);if(d>0&&(r+=d),l<0){if(!this.isStandaloneWord(e,t,n)){this.isCamelCaseBoundary(e,t,n)?r+=.2:r-=.2}}return Math.max(-1,Math.min(1,r))}countCaseChanges(e){let t=0;for(let n=1;n<e.length;n++){const s=e[n-1],i=e[n];if(/[a-zA-Z]/.test(s)&&/[a-zA-Z]/.test(i)){s===s.toUpperCase()!==(i===i.toUpperCase())&&t++}}return t}checkWordBoundaries(e,t,n,s,i=!1){const a=t>0?e[t-1]:"",r=n<e.length?e[n]:"",o=e.substring(Math.max(0,t-8),Math.min(e.length,n+8)).toLowerCase(),l=[/WMF/,/pass(word|phrase|port|enger|ion|ive|ed|ing|es|key|code|over|by|able)/i,/class(room|mate|ified|es|ic|y|ification)/i,/grass(land|hopper|y|es)/i,/bass(ist|oon|line|es)/i,/mass(ive|acre|age|es|achusetts)/i,/assign(ment|ed|ing|s|ee|or)/i,/assess(ment|ed|ing|or|s)/i,/assemble|assembly|assertion|asset|assist|assume|assure|associate|association/i,/brass|crass|harass|morass|surpass|trespass|compass|embassy|embarrass/i,/cock(pit|tail|roach|ade|atoo|le|ney)/i,/scunthorpe|penistone|shitterton|lightwater|middlesex|sussex|essex|wessex/i,/dick(ens|inson|son|ey|ie)/i,/analyst|analytics|analyze|canal|banal/i,/therapist|therapeutic|therapy/i,/cumul(ative|us|at)|circum(stance|ference|cise|vent|navigate|scribe)/i,/butter(cup|fly|milk|scotch|fingers|nut)|buttress|button|rebuttal/i,/count(ry|er|ess|down|ing|ed|able|enance|erfeit|erpart)/i,/grape|drape|scrape|landscape|escapade/i,/shell(fish|fire|ter|ed)|eggshell|nutshell|bombshell|seashell/i,/whole(sale|some|hearted)/i,/exchange|exchequer/i,/title|titled|subtitle|entitle/i,/sextant|sextet|bisect|insect|intersect|section|sector/i,/cocktail|peacock|hancock|hitchcock|babcock|woodcock/i,/niger(ia|ian)|montenegro/i,/penisten|penetrat|penal(ty|ize|ise)|penchant|pencil|pendant|penguin|peninsula/i,/manslaughter|slaughterhouse/i,/shitake|shiitake/i,/arsenic|arsenal/i,/cummings|scumble/i,/smother|another|mother(board|land|hood)/i,/wanton|wanting|wanted|warrant/i,/trigger|bigger|digger|jigger|rigger|vigor|figure/i,/ballad|ball(room|park|istic|oon|et|ot|ard|ast)/i,/grape(fruit|vine|shot)/i,/raptor|rapport|rapid|rapier|rapture/i,/killed|killer|skill(ed|ful|s)|killjoy|kiln|kilo(gram|meter|byte|watt)/i,/bomb(ard|astic|shell|er|ing|ay)/i,/hellenic|hello|shell|othello/i,/crack(down|le|ed|ing|erjack)|firecracker/i,/jewel{1,2}/i,/skill/i];for(const e of l)if(e.test(o))return-.8;const d=/[a-zA-Z]/.test(a),c=/[a-zA-Z]/.test(r);if(d&&c){const i=e.substring(Math.max(0,t-8),t).toLowerCase(),a=e.substring(n,Math.min(e.length,n+8)).toLowerCase(),r=e.substring(Math.max(0,t-8),Math.min(e.length,n+8)).toLowerCase();return this.analyzePaddingLikelihood(i,a,s)>=.4||r.length>15&&r===r.toLowerCase()&&!/\s/.test(r)?0:-.5}if(d||c){const i=e.substring(Math.max(0,t-8),t).toLowerCase(),a=e.substring(n,Math.min(e.length,n+8)).toLowerCase();this.analyzePaddingLikelihood(i,a,s);return 0}const u=e.substring(t,n);return/\s/.test(u)&&!i?-.9:0}analyzePaddingLikelihood(e,t,n){let s=0;const i=/[bcdfghjklmnpqrstvwxyz]{3,}/i;(i.test(e)||i.test(t))&&(s+=.4);const a=t.match(/([a-z])\1{1,}/i);if(a&&a[0].length>=2){if(t.indexOf(a[0])>=t.length-3){(!/\b(ll|ss|tt|nn|mm|pp|dd|bb|gg|ff)$/i.test(a[0])||t.length<=3)&&(s+=.35)}}if(e.length<=2&&e.length>0&&(s+=.25),t.length<=3&&t.length>0){/^(er|ed|ing|ion|ly|al|ful|less|ness|ment|s)$/i.test(t)||(s+=.2)}/([qx][^u]|[jqxz]{2}|[bcdfghjklmnpqrstvwxz]{4,})/i.test(e+t)&&(s+=.3);const r=e+t;if(r.length>0){(r.match(/[aeiou]/gi)||[]).length/r.length<.2&&(s+=.3)}return Math.min(1,s)}checkSubstitution(e,t){const n=/[0-9@$!]/;if(!n.test(e))return 0;let s=0;for(const t of e)n.test(t)&&s++;const i=s/e.length;return Math.min(.3,.6*i)}isStandaloneWord(e,t,n){const s=t>0?e[t-1]:" ",i=n<e.length?e[n]:" ",a=/[\s.,;:!?()[\]{}"'`~\-_]/;return a.test(s)&&a.test(i)}isCamelCaseBoundary(e,t,n){if(0===t||n===e.length)return!1;const s=e[t-1],i=e[t],a=e[n-1],r=e[n],o=/[A-Z]/.test(i),l=/[a-z]/.test(s),d=(/[a-z]/.test(r),/[a-z]/.test(a));return!!(l&&o||d&&/[A-Z]/.test(r))}findMatchPosition(e,t,n,s){const i=e.toLowerCase();let a=-1,r=-1,o=-1;for(let n=0;n<=i.length-t.length;n++){const i=this.parseString(e.substring(n,n+t.length+10));if(i.includes(s)){const e=this.calculateSimilarity(s,i.substring(0,s.length));e>o&&(o=e,a=n,r=n+t.length)}}return{start:a,end:r}}calculateSimilarity(e,t){const n=Math.min(e.length,t.length);let s=0;for(let i=0;i<n;i++)e[i]===t[i]&&s++;return s/Math.max(e.length,t.length)}match(e){const t=this.parseString(e),n=[];for(const s of u.hits)if(s.term){const i=s.term,a=s.severity||.5,r=s.note||null,o=s.multiWord||!1;if(1===i.length&&/[^\x00-\x7F]/.test(i))continue;const l=o?this.parseString(e,!0):t,d=i.split("").reduce((e,t)=>{var n;if(o&&" "===t)return e+" *";return e+(null!==(n=c[t])&&void 0!==n?n:t)},""),u=new RegExp(d,"gi");let p;const g=this.buildPositionMap(e,o);for(;null!==(p=u.exec(l));){const t=p[0],l=p.index,d=l+t.length,c=g[l]||l,u=void 0!==g[d-1]?g[d-1]+1:d,h=this.analyzeObfuscation(e,c,u,i,o);let m=this.calculateMatchConfidence(t,i);h<-.5?m*=Math.max(.01,1+4*h):h<-.2?m*=Math.max(.05,1+2.5*h):h>.5&&(m=Math.min(1,m+.08*h));if(m>=Math.max(.05,.2-.015*i.length)){const o=e.substring(c,u);if(s.ignore&&Array.isArray(s.ignore)&&s.ignore.includes(o))continue;n.push({name:i,match:t,confidence:m,obfuscation:h,severity:a,note:r,originalSegment:o})}}}else if(s.regex){const t=e.match(new RegExp(s.regex.source,"g"));if(t)for(const e of t)n.push({name:s.name,match:e,confidence:1,obfuscation:.5,severity:s.severity||.5,note:s.note||"Pattern-based detection with high confidence. Obfuscation is moderate for formatted data.",originalSegment:e})}else s.test&&s.test(e)&&n.push({name:s.name,match:e,confidence:1,obfuscation:.5,severity:s.severity||.5,note:s.note||"Test-based detection with high confidence.",originalSegment:e});return n}buildPositionMap(e,t=!1){const n={};let s=0;for(let i=0;i<e.length;i++){const a=e[i];t?/[\s._,;:|]/.test(a)&&0!==i&&/[\s._,;:|]/.test(e[i-1])||(n[s]=i,s++):/[\s._,;:|]/.test(a)||(n[s]=i,s++)}return n}findOriginalPosition(e,t){let n=0;for(let s=0;s<e.length;s++){const i=e[s];if(!/\s/.test(i)){if(n===t)return s;n++}}return t}calculateMatchConfidence(e,t){const n=/[\*#_\-]/;let s=0,i=0,a=0,r=0;for(const t of e)n.test(t)?(i++,a++,r=Math.max(r,a)):(s++,a=0);const o=s+i;if(0===o)return 0;const l=s/o;if(l<.3)return 0;if(l<.5)return.1*l;const d=r>1?Math.max(.2,1-.2*r):1,c={};for(const t of e)n.test(t)||(c[t]=(c[t]||0)+1);let u=1;for(const e of Object.values(c))e>2&&(u*=Math.max(.4,1-.15*(e-2)));const p=o/t.length,g=p>1.5?Math.max(.2,1-.4*(p-1)):1;return Math.max(0,Math.min(1,l*d*u*g))}score(e){const t=this.match(e);let n=0;for(const e of t)n+=e.confidence;return n}evaluate(e){const t=this.match(e),n=this.parseString(e);if(0===t.length)return{finalScore:0,risk:"No",matches:[],details:{baseScore:0,weightedScore:0,severityScore:0,matchCount:0,averageConfidence:0,averageObfuscation:0,averageSeverity:0,textLength:e.length,densityPenalty:0,repetitionPenalty:0,diversityBonus:0,lengthModifier:1,highConfidenceMatches:0,mediumConfidenceMatches:0,lowConfidenceMatches:0}};let s=0,i=0,a=0,r=0,o=0,l=0;const d=new Set;for(const e of t){const t=e.severity||.5,n=e.confidence;r+=n,l+=Math.pow(n,1.5)*t,o+=e.obfuscation||0,d.add(e.name),n>=.7?s++:n>=.4?i++:a++}const c=r/t.length,u=o/t.length,p=r>0?l/r:0,g=1*s+.35*i+.08*a,h=n.length,m=t.length/Math.max(h/5,1),v=.6*Math.tanh(.3*m),f={};for(const e of n)/[a-z0-9]/.test(e)&&(f[e]=(f[e]||0)+1);let b=0;const w=Object.values(f).reduce((e,t)=>e+t,0);for(const e of Object.values(f))e>3&&(b+=Math.pow((e-3)/w,1.5));const y=Math.min(.8,2*b),x=d.size/t.length,k=x>.6?1*(x-.6):0,_=Math.max(.5,Math.min(1.5,1+Math.log10(Math.max(10,h))/10)),S=u>.4?.5*(u-.4):u<-.2?.4*Math.abs(u):0,q=t.filter(e=>e.severity>=1&&e.confidence>=.5||e.confidence>=.9).length,E=g*p*_;let L=E+.5*l+k+.8*q-(v+y+S);c<.5&&(L*=Math.max(.1,1.5*c)),L>3?L=3+1.5*Math.log10(L-2):L>1.5&&(L=1.5+.8*Math.sqrt(L-1.5)),L=Math.max(0,L);let A="No";return L>=4||q>=2?A="Critical":L>=2.5?A="High":L>=1.5?A="Medium":L>=.5&&(A="Low"),{clamped:Math.max(0,Math.min(1,L/5)),finalScore:Math.round(100*L)/100,risk:A,matches:t,details:{baseScore:Math.round(100*g)/100,weightedScore:Math.round(100*E)/100,severityScore:Math.round(100*l)/100,matchCount:t.length,uniqueMatches:d.size,averageConfidence:Math.round(100*c)/100,averageObfuscation:Math.round(100*u)/100,averageSeverity:Math.round(100*p)/100,textLength:e.length,densityPenalty:Math.round(100*v)/100,repetitionPenalty:Math.round(100*y)/100,diversityBonus:Math.round(100*k)/100,lengthModifier:Math.round(100*_)/100,obfuscationPenalty:Math.round(100*S)/100,criticalPatterns:q,highConfidenceMatches:s,mediumConfidenceMatches:i,lowConfidenceMatches:a}}}}!function(e,t,n){(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(u,"hits",[{name:"URL",regex:/(?:https?:\/\/(?:www\.)?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*(?:\/[^\s]*)?|(?:www\.)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:\/[^\s]*)?|[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.(?:com|org|net|edu|gov|mil|int|co|io|ai|app|dev|info|biz|name|pro|museum|aero|coop|jobs|mobi|travel|xxx|ac|ad|ae|af|ag|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(?:\/[^\s]*)?)/i,severity:.1,note:"URLs in usernames may indicate spam or advertising."},{name:"Phone number",regex:/(\+?\d{1,3}[-.\s]?|\(\+?\d{1,3}\)\s?)?(\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\d{4}[-.\s]?\d{3}[-.\s]?\d{3})/,severity:.3,note:"The pattern of numbers in this username resemble a phone number. Usernames containing personal information may be considered disruptive."},{name:"Email address",regex:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/,severity:.3,note:"Email addresses in usernames can indicate spam or contact sharing."},{term:"base64",severity:.2,note:"Base64 encoding may be used to obfuscate content to bypass filters."},{term:"fromhex",severity:.2,note:"Hex encoding may be used to obfuscate content to bypass filters."},{term:"1488",severity:.5,note:"Well-known Neo-Nazi symbol, however the number itself can appear in innocent contexts."},{term:"nazi",severity:1},{term:"swastika",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"卍",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"卐",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿕",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿖",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿗",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"࿘",severity:.8,note:"Symbol often associated with Nazism, however it has historical significance in other cultures."},{term:"aryan",severity:.7,note:"Associated with white supremacist ideology, though it can also be in reference to the self-designation of Indo-Iranian peoples."},{term:"fascism",severity:.5},{term:"fascist",severity:.5},{term:"facist",severity:.5},{term:"☭",severity:.5,note:"Hammer and sickle symbol, politically charged but context-dependent."},{term:"✡",severity:.4,note:"Star of David, can be used respectfully or in antisemitic contexts."},{term:"44",severity:.1,note:"Obfuscated symbol of the Nazi SS division. If appears as 'ᛋᛋ' or similar, indicates intent to reference the SS."},{term:"imbo wales",severity:.2,multiWord:!0,note:"Play on 'Jimbo Wales' name, may indicate mockery or impersonation."},{term:"sock",severity:.3,note:"May reference sockpuppet accounts but has innocent meanings."},{term:"puppet",severity:.3,note:"May reference sockpuppet accounts but has innocent meanings."},{term:"sock puppet",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"return",severity:.2,note:"Often used in usernames by sockpuppeteers."},{term:"is back",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"are back",severity:.6,multiWord:!0,note:"Often used in usernames by sockpuppeteers."},{term:"timelash",severity:1,note:'Well-known sockpuppeteer ("Timelash") on Wikipedia.'},{term:"my little",severity:.8,multiWord:!0,note:"If related to 'my little pony', indicates sockpuppeteer."},{term:"my little pony",severity:1,multiWord:!0,note:"Well-known sockpuppeteer on Wikipedia."},{term:"friendship is magic",severity:1,multiWord:!0,note:"Well-known sockpuppeteer on Wikipedia."},{term:"anal",severity:.7},{term:"anus",severity:.5},{term:"sex",severity:.3},{term:"secs",severity:.05,note:"Obfuscated form of 'sex'."},{term:"seggs",severity:.2,note:"Obfuscated form of 'sex'."},{term:"willy",severity:.2,note:"Slang for penis."},{term:"wank",severity:.6,note:"British sexual slang for masturbation."},{term:"barf",severity:.3},{term:"bastard",severity:.5},{term:"batty boy",severity:.7,multiWord:!0,note:"Homophobic slur in British/Caribbean English."},{name:"bitch",regex:new RegExp(`${i+o}(${l}|${s})?${d}?${a+r}`),severity:.7},{term:"blow job",severity:.8,multiWord:!0},{term:"blowing",severity:.2,note:"Sexual innuendo but common verb."},{term:"boner",severity:.4},{term:"boob",severity:.4},{term:"booty",severity:.3},{term:"breast",severity:.4,note:"Anatomical term, but can be used inappropriately."},{term:"butt",severity:.2},{term:"bite me",severity:.5,multiWord:!0,note:"Often has defiant or provocative connotation."},{term:"butt plug",severity:.7,multiWord:!0},{term:"bollock",severity:.5,note:"British slang for testicles."},{term:"bollox",severity:.5,note:"Variant spelling of 'bollocks'."},{term:"bollix",severity:.5,note:"Variant spelling of 'bollocks'."},{term:"clit",severity:.7},{term:"cock",severity:.7},{term:"cum",severity:.7},{term:"brain dead",severity:.5,multiWord:!0,note:"Derogatory medical reference."},{term:"bukake",severity:.7},{term:"bully",severity:.5,note:"Indicates harassment behavior."},{term:"bullies",severity:.5,note:"Indicates harassment behavior."},{term:"bullied",severity:.3,note:"May indicate victimhood or boasting."},{term:"versus",severity:.4,note:"Combat/conflict framing, but legitimate word."},{term:"bumming",severity:.5,note:"British slang for anal sex or begging."},{term:"bunghole",severity:.5},{term:"cesspool",severity:.3,note:"Derogatory term for filthy place."},{term:"cesspit",severity:.3,note:"Variant of cesspool."},{term:"dick",severity:.7},{term:"prick",severity:.7},{term:"dildo",severity:.7},{term:"censor",severity:.1,note:"May indicate anti-censorship stance."},{term:"ching",severity:.8,note:"Part of racial slur against Asians."},{term:"ching chong",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"ching chang",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"wing wong",severity:.9,multiWord:!0,note:"Racist mockery of Asian languages."},{term:"bot",severity:.4,note:"May indicate automated account claim."},{term:"ox long",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'cock's long'."},{term:"douche",severity:.5},{term:"cunt",severity:.7},{term:"cuck",severity:.4,note:"Derogatory term from manosphere."},{term:"curry munch",severity:.9,multiWord:!0,note:"Racist slur against South Asians."},{term:"crime",severity:.3,note:"Negative connotation but legitimate word."},{term:"pussy",severity:.7},{term:"deeznuts",severity:.3,note:"Crude joke phrase."},{term:"destroy",severity:.3,note:"Aggressive language."},{term:"destruction",severity:.3,note:"Aggressive language."},{term:"diaper",severity:.3,note:"Infantilization or fetish reference."},{term:"diarrhea",severity:.3},{term:"throbbing",severity:.5,note:"Sexual innuendo term."},{term:"dimwit",severity:.3},{term:"doo doo",severity:.3,multiWord:!0},{term:"dookie",severity:.3},{term:"fart",severity:.3},{term:"ejaculat",severity:.7},{term:"erect",severity:.5,note:"Sexual context or legitimate word."},{term:"erotic",severity:.5},{term:"fuck",severity:.8},{term:"phuck",severity:.8,note:'Alternative spelling of "fuck" to bypass detection.'},{term:"orgasm",severity:.7},{term:"rape",severity:1},{term:"lawsuit",severity:.3,note:"Legal threat implication."},{term:"fraud",severity:.5,note:"Accusation of criminal behavior."},{term:"tard",severity:.5,note:"Ableist slur suffix."},{term:"terror",severity:.7,note:"Violence/terrorism reference."},{term:"mike hunt",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'my cunt'."},{term:"mike ox",severity:.5,multiWord:!0,note:"Phonetic sexual innuendo for 'my cock's'."},{term:"masturbat",severity:.7},{term:"nutsack",severity:.5},{term:"ophile",severity:1,note:"Suffix for sexual predator terms like pedophile."},{term:"pedo",severity:.6},{term:"peeing",severity:.3},{term:"peanus",severity:.5,note:"Intentional misspelling of 'penis'."},{term:"penis",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"porn",severity:.7},{term:"piss",severity:.5},{term:"poop",severity:.3},{term:"prison",severity:.3,note:"Criminal context, but legitimate word."},{term:"prostitute",severity:.5,note:"Sexual work reference or insult."},{term:"queer",severity:.5,note:"Can be slur or reclaimed identity."},{term:"rectum",severity:.3,note:"Anatomical term."},{term:"report me",severity:.3,multiWord:!0,note:"Defiant/trolling phrase."},{term:"rimming",severity:.7},{term:"scrotum",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"semen",severity:.7},{term:"slut",severity:.7},{term:"sucks",severity:.3,note:"Mild profanity or legitimate verb."},{term:"sux",severity:.3,note:"Intentional misspelling of 'sucks'."},{term:"vagina",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"vadge",severity:.5,note:"Slang for vagina."},{term:"vomit",severity:.3},{term:"vulva",severity:.5,note:"Anatomical term, inappropriate in usernames."},{term:"whore",severity:.7},{term:"chink",severity:1},{term:"jew",severity:.3,note:"Legitimate religious/ethnic term but tracked for antisemitic usage patterns."},{term:"nigger",severity:1},{term:"nigga",severity:1},{term:"nigguh",severity:1,note:"Phonetic spelling of racial slur."},{term:"niglet",severity:1},{term:"pajeet",severity:.7,note:"Derogatory term for South Asians."},{term:"slave",severity:.6,note:"Dehumanizing term with historical trauma, but legitimate historical uses."},{term:"master race",severity:1,multiWord:!0,note:"Nazi supremacist ideology phrase."},{term:"inferior race",severity:1,multiWord:!0},{term:"superior race",severity:1,multiWord:!0,note:"White supremacist ideology."},{term:"racist",severity:.8},{term:"racism",severity:.7},{term:"racial",severity:.3,note:"Neutral term but tracked for context in discriminatory language."},{term:"bigot",severity:.7},{term:"fag",severity:.7},{term:"taliban",severity:.7,note:"Terrorist organization reference."},{term:"antisemit",severity:1},{term:"bleed",severity:.3,note:"Can indicate violence or be medical."},{term:"bloody",severity:.3,note:"British profanity or literal blood reference."},{term:"hell",severity:.5,note:"Religious reference used as mild profanity, but legitimate uses."},{term:"damn",severity:.3},{term:"crap",severity:.3},{term:"darn",severity:.1,note:"Mild euphemism for 'damn'."},{term:"shutup",severity:.3,note:"Rude command indicating hostility."},{term:"spastic",severity:.5,note:"Ableist slur in British English, medical term in US."},{term:"disabled",severity:.1,note:"Legitimate disability term but tracked for ableist patterns."},{term:"loser",severity:.3},{term:"abuse",severity:.5,note:"Indicates harmful behavior or accusations."},{term:"spam",severity:.3,note:"Indicates unwanted content or disruption."},{term:"abusi",severity:.5,note:"Variant of 'abuse/abusive'."},{term:"hitler",severity:1},{term:"adolf",severity:.4,note:"Common name but often used in Hitler references."},{term:"gestapo",severity:1},{term:"heil",severity:.8,note:"Nazi salute reference."},{term:"final solution",severity:1,multiWord:!0,note:"Nazi euphemism for genocide."},{term:"death camp",severity:1,multiWord:!0},{term:"concentration camp",severity:1,multiWord:!0,note:"Holocaust reference, legitimate historical use but concerning in usernames."},{term:"gas chamber",severity:1,multiWord:!0},{term:"holocaust",severity:.5,note:"Historical tragedy reference, legitimate historical use."},{term:"zionis",severity:.5,note:"Political term stem, can be antisemitic depending on context."},{term:"fuhrer",severity:1},{term:"reich",severity:.7,note:"Nazi Germany reference, though legitimate German word."},{term:"massacre",severity:.7},{term:"slaughter",severity:.7},{term:"torture",severity:.7},{term:"lynch",severity:1,note:"Racist mob killing reference, though also a surname."},{term:"killer",severity:.5},{term:"mobster",severity:.5,note:"Organized crime reference."},{term:"gangster",severity:.3,note:"Criminal reference or slang."},{term:"druglord",severity:.5,note:"Drug trafficking reference."},{term:"drugs",severity:.3,note:"General term that can be legitimate or problematic."},{term:"meth",severity:.5,note:"Reference to illegal drug, though also shorthand for 'method'."},{term:"cocaine",severity:.5},{term:"heroin",severity:.5},{term:"weed",severity:.3,note:"Marijuana reference with varying legal status, also refers to plants."},{term:"marijuana",severity:.3,note:"Cannabis reference with complex legal status."},{term:"crack",severity:.5,note:"Drug reference or legitimate verb."},{term:"amphetamine",severity:.5},{term:"benzo",severity:.3,note:"Drug abbreviation or name prefix."},{term:"benzodiazepine",severity:.5},{term:"opioid",severity:.3,note:"Drug class, medical term."},{term:"opiate",severity:.3,note:"Drug class, medical term."},{term:"ketamine",severity:.5,note:"Drug reference or medical use."},{term:"rohypnol",severity:.7,note:"Date rape drug reference."},{term:"i like",severity:.2,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"i love",severity:.3,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"i hate",severity:.5,multiWord:!0,note:"Flagged to detect inappropriate statements when combined with other terms."},{term:"young",severity:.2,note:"Age reference with legitimate uses but flagged in combination."},{term:"underage",severity:.8,note:"Age reference with concerning implications in certain contexts."},{term:"teen",severity:.3,note:"Age reference, concerning in some contexts."},{term:"adolescent",severity:.2,note:"Age term, concerning in some contexts."},{term:"preteen",severity:.4,note:"Age reference with concerning implications in certain contexts."},{term:"rapist",severity:1},{term:"raping",severity:1},{term:"incest",severity:1},{term:"cult",severity:.3,note:"Religious/social group term with negative connotation."},{term:"sekt",severity:.3,note:"German for 'sect', cult reference."},{term:"disembowel",severity:1},{term:"behead",severity:1},{term:"traitor",severity:.5,note:"Accusatory term."},{term:"genocide",severity:1},{term:"ethnic clean",severity:1,multiWord:!0,note:"Euphemism for genocide."},{term:"klan",severity:1},{term:"klux",severity:1},{term:"kkk",severity:1},{term:"kill",severity:.5,note:"Violent language, but common word."},{term:"bomb",severity:.7,note:"Terrorism/violence reference."},{term:"organi",severity:.1,note:"Word stem for organization."},{term:"blog",severity:.1,note:"External site reference."},{term:"group",severity:.1,note:"Organizational term."},{term:"compan",severity:.1,note:"Company stem, spam indicator."},{term:"associat",severity:.1,note:"Association stem."},{term:"industr",severity:.1,note:"Industry stem, spam indicator."},{term:"corporate",severity:.1,note:"Business term, spam indicator."},{term:"famil",severity:.1,note:"Family stem, group indicator."},{term:"task",severity:.1,note:"Organizational term."},{term:"alliance",severity:.1,note:"Group term."},{term:"entertain",severity:.1,note:"Entertainment stem, promotional."},{term:"public",severity:.1,note:"Common term, promotional context."},{term:"private",severity:.1,note:"Common term, organizational."},{term:"troll",severity:.3,note:"Disruptive behavior indicator."},{term:"trolol",severity:.3,note:"Trolling variant/meme."},{term:"grief",severity:.3,note:"Gaming term for harassment."},{term:"password",severity:.3,note:"Security term, suspicious in username."},{term:"admin",severity:.7,note:"Role impersonation."},{term:"sysop",severity:.4,note:"Wikipedia role impersonation."},{term:"bureaucrat",severity:.5,note:"Wikipedia role impersonation."},{term:"moderator",severity:.5,note:"Role impersonation."},{term:"staff",severity:.5,note:"Role impersonation."},{term:"developer",severity:.5,note:"Role impersonation."},{term:"owner",severity:.4,note:"Role impersonation."},{term:"founder",severity:.3,note:"Role impersonation."},{term:"wmf",severity:.2,note:"Wikimedia Foundation impersonation."},{term:"foundation",severity:.3,note:"Organizational impersonation."},{term:"unblock",severity:.1,note:"Suggests blocked user."},{term:"4chan",severity:.5,note:"Imageboard site, trolling association."},{term:"8chan",severity:.3,note:"Controversial imageboard."},{term:"reddit",severity:.3,note:"External site reference."},{term:"plague",severity:.3,note:"Disease/attack term."},{term:"skibidi",severity:.1,note:"Internet meme reference."},{term:"milf",severity:.5},{term:"dilf",severity:.5},{term:"sext",severity:.5,note:"Sending sexual messages."},{term:"thot",severity:.3,note:"Derogatory sexual slang."},{term:"rizz",severity:.1,note:"Gen Z slang for charisma."},{term:"gyatt",severity:.1,note:"Sexualized Gen Z slang."},{term:"noob",severity:.1},{term:"lyric",severity:.1,note:"Possible lyrics website spammer."},{term:"propaganda",severity:.5,note:"Misinformation term."},{term:"asshole",severity:.7},{term:"fucktard",severity:.7},{term:"retard",severity:.7},{term:"imbecile",severity:.5},{term:"moron",severity:.5},{term:"chigga",severity:1},{term:"chigger",severity:1},{term:"wigga",severity:1},{term:"wigger",severity:1},{term:"igga",severity:.7,note:"Potential variant of racial slur.",ignore:["1994","ig94"]},{term:"igger",severity:.7,note:"Potential variant of racial slur."},{term:"mother fuck",severity:.7,multiWord:!0},{term:"bull shit",severity:.6,multiWord:!0},{term:"dumb ass",severity:.5,multiWord:!0},{term:"dumb fuck",severity:.7,multiWord:!0},{term:"goon",severity:.2,multiWord:!1}]);t.profanity=new u({a:["ɑ","𝑎","𝗮","𝕒","𝖆","𝓪","𝚊","𝞪","А","а","𝔞","𝒂","𝘢","𝛼","𝒶","𝙖","𝜶","𝐚","𝖺","🄰","🅰️","🅰","Ⓐ","ⓐ","@"],b:["b","𝑏","𝗯","𝕓","𝖇","𝓫","𝚋","𝞫","Ь","в","𝔟","𝒃","𝘣","𝛃","𝒷","𝙗","𝜷","𝐛","𝖻","🄱","🅱️","🅱","Ⓑ","ⓑ"],c:["c","𝑐","𝗰","𝕔","𝖈","𝓬","𝚌","ϲ","с","𝔠","𝒄","𝘤","𝒸","𝙘","𝐜","𝖼","🄲","Ⓒ","ⓒ"],d:["d","𝑑","𝗱","𝕕","𝖉","𝓭","𝚍","𝞭","ԁ","ԃ","𝔡","𝒅","𝘥","𝛿","𝒹","𝙙","𝜹","𝐝","𝖽","𝝏","🄳","Ⓓ","ⓓ"],e:["e","𝑒","𝗲","𝕖","𝖊","𝓮","𝚎","𝞮","е","𝔢","𝒆","𝘦","𝛆","𝒺","𝙚","𝜺","𝐞","𝖾","з","𝝐","🄴","Ⓔ","ⓔ","€"],f:["f","𝑓","𝗳","𝕗","𝖋","𝓯","𝚏","𝞯","ғ","ƒ","𝔣","𝒇","𝘧","𝒻","𝙛","𝜻","𝐟","𝖿","🄵","Ⓕ","ⓕ"],g:["g","𝑔","𝗴","𝕘","𝖌","𝓰","𝚐","ɡ","Ԍ","ԍ","𝔤","𝒈","𝘨","𝙜","𝐠","𝗀","🄶","Ⓖ","ⓖ"],h:["h","𝗵","𝕙","𝖍","𝓱","𝚑","һ","н","𝔥","𝒉","𝘩","ℎ","𝒽","𝙝","𝐡","𝗁","🄷","Ⓗ","ⓗ"],i:["i","𝑖","𝗶","𝕚","𝖎","𝓲","𝚒","𝞲","і","𝔦","𝒊","𝘪","𝒾","𝙞","𝜾","𝐢","𝗂","🄸","ℹ️","ℹ","Ⓘ","ⓘ","!"],j:["j","𝑗","𝗷","𝕛","𝖏","𝓳","𝚳","ј","𝔧","𝒋","𝘫","𝒿","𝙟","𝐣","𝗃","🄹","Ⓙ","ⓙ"],k:["k","𝑘","𝗸","𝕜","𝖐","𝓴","κ","к","𝔨","𝒌","𝘬","𝓀","𝙠","𝝀","𝐤","𝗄","𝞳","𝜿","қ","🄺","Ⓚ","ⓚ"],l:["l","𝑙","𝗹","𝕝","𝖑","𝓵","ⅼ","ӏ","𝔩","𝒍","𝘭","𝓁","𝙡","𝐥","𝗅","🄻","Ⓛ","ⓛ","|"],m:["m","𝑚","𝗺","𝕞","𝖒","𝓶","𝚖","м","𝔪","𝒎","𝘮","𝓂","𝙢","𝐦","𝗆","🄼","Ⓜ️","Ⓜ","ⓜ"],n:["n","𝑛","𝗻","𝕟","𝖓","𝓷","𝚗","ո","п","𝔫","𝒏","𝘯","𝓃","𝙣","𝐧","𝗇","𝞰","𝜼","🄽","Ⓝ","ⓝ"],o:["o","𝑜","𝗼","𝕠","𝖔","𝓸","𝚘","ο","о","𝔬","𝒐","𝘰","𝙤","𝝈","𝐨","𝗈","𝜽","𝝄","𝝓","𝝑","𝝋","🄾","🅾️","🅾","Ⓞ","ⓞ"],p:["p","𝑝","𝗽","𝕡","𝖕","𝓹","𝚙","ρ","р","𝔭","𝒑","𝘱","𝓅","𝙥","𝐩","𝗉","𝝆","🄿","🅿️","🅿","Ⓟ","ⓟ"],q:["q","𝑞","𝗾","𝕢","𝖖","𝓺","𝚚","ԛ","𝔮","𝒒","𝘲","𝓆","𝙦","𝐪","𝗊","🅀","Ⓠ","ⓠ"],r:["r","𝑟","𝗿","𝕣","𝖗","𝓻","𝚛","г","𝔯","𝒓","𝘳","𝓇","𝙧","𝐫","𝗋","𝞽","🅁","Ⓡ","ⓡ"],s:["s","𝑠","𝗌","𝕤","𝖘","𝓼","𝚜","ѕ","𝔰","𝒔","𝘴","𝓈","𝙨","𝐬","🅂","Ⓢ","ⓢ","$"],t:["t","𝑡","𝗍","𝕥","𝖙","𝓽","𝚝","τ","т","𝔱","𝒕","𝘵","𝓉","𝙩","𝐭","𝝉","🅃","Ⓣ","ⓣ","+"],u:["u","𝑢","𝗎","𝕦","𝖚","𝓾","𝚞","υ","𝔲","𝒖","𝘶","𝓊","𝙪","𝐮","𝛍","🅄","Ⓤ","ⓤ"],v:["v","𝑣","𝗏","𝕧","𝖛","𝓿","𝚟","ν","𝔳","𝒗","𝘷","𝓋","𝙫","𝐯","𝞶","𝝂","𝝊","🅅","Ⓥ","ⓥ"],w:["w","𝑤","𝗐","𝕨","𝖜","𝔀","𝚠","ω","ш","𝔴","𝒘","𝘸","𝓌","𝙬","𝐰","𝝎","𝝍","🅆","Ⓦ","ⓦ"],x:["x","𝑥","𝗑","𝕩","𝖝","𝔁","𝚡","χ","х","𝔵","𝒙","𝘹","𝓍","𝙭","𝐱","𝝒","𝝌","🅇","Ⓧ","ⓧ"],y:["y","𝑦","𝗒","𝕪","𝖞","𝔂","𝚢","у","𝔶","𝒚","𝘺","𝓎","𝙮","𝐲","𝞬","𝜸","𝞴","🅈","Ⓨ","ⓨ"],z:["z","𝑧","𝗓","𝕫","𝖟","𝔃","𝚣","ζ","𝔷","𝒛","𝘻","𝓏","𝙯","𝐳","🅉","Ⓩ","ⓩ"],0:["0","𝟎","𝟬","𝟢"],1:["1","𝟏","𝟭","𝟣","①","➀","❶","➊","⓵"],2:["2","𝟐","𝟮","𝟤","②","➁","❷","➋","⓶"],3:["3","𝟑","𝟯","𝟥","③","➂","❸","➌","⓷"],4:["4","𝟒","𝟰","𝟦","④","➃","❹","➍","⓸","ᛋ"],5:["5","𝟓","𝟱","𝟧","⑤","➄","❺","➎","⓹"],6:["6","𝟔","𝟲","𝟨","⑥","➅","❻","➏","⓺"],7:["7","𝟕","𝟳","𝟩","⑦","➆","❼","➐","⓻"],8:["8","𝟖","𝟴","𝟪","⑧","➇","❽","➑","⓼"],9:["9","𝟗","𝟵","𝟫","⑨","➈","❾","➒","⓽"]})},4712(e,t){function n(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function s(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;var i=new WeakSet;function a(e,t,n=!1){const s=(new Date).toISOString();this.logs.push({type:e,timestamp:s,message:t,expected:n})}t.Logger=class{constructor(){n(this,i),this.logs=[]}getLogs(){return[...this.logs]}log(e,t){s(i,this,a).call(this,"log",e,t)}warn(e,t){s(i,this,a).call(this,"warn",e,t)}error(e,t){s(i,this,a).call(this,"error",e,t)}dev(e,t){s(i,this,a).call(this,"dev",e,t)}}},9501(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.StorageManager=void 0;var s,i,a,r=n(4712),o=n(4029);n(9458),n(7345),n(7704),n(8415);class l{static get versions(){return new Map([[0,o.Version.v0],[1,o.Version.v1],[2,o.Version.v2],[3,o.Version.v3]])}constructor(){this.reset(new r.Logger)}reset(e){return null==e||e.log("Resetting storage to default."),this.data=l.version.default,l.version.init(e,this.data),l.version.validate(),l.version.construct(),this.data}load(e={}){var t,n;const s=new r.Logger;let i=null!==(n=(t=e).version)&&void 0!==n?n:t.version=0;if(l.versions.has(i)){const t=l.version.number;for(;i!==t;){const t=l.versions.get(i+1);if(!("function"==typeof(null==t?void 0:t.constructor)&&new t instanceof o.Version)){s.dev("[MISSING_UPGRADE_METHOD] Uh oh! Something has gone wrong; this message should never appear. Please report this to the WikiShield developers."),e=this.reset(s);break}s.log(`Upgrading storage from version ${i} to ${i+1}`,!0);try{if(!t.init(s,e)){e=this.reset(s);break}(e=t.upgrade()).version=++i}catch(t){s.error(`Error upgrading storage from version ${i} to ${i+1}: ${t}`),e=this.reset(s);break}}i=e.version,s.log(`Initializing storage at version ${i}.`,!0),l.version.init(s,e),s.log(`Validating storage at version ${i}.`,!0),l.version.validate(),s.log(`Constructing storage at version ${i}.`,!0),e=l.version.construct(),s.log(`Storage loaded successfully at version ${i}.`,!0),this.data=e}else s.error(`Storage version ${i} is corrupted or unsupported.`),this.reset(s);return{data:this.data,logs:s.getLogs()}}save(){const e=new r.Logger,t=l.version.number;e.log(`Initializing storage at version ${t}.`,!0),l.version.init(e,this.data),e.log(`Deconstructing storage at version ${t}.`,!0);const n=l.version.deconstruct();return e.log(`Storage saved successfully at version ${t}.`,!0),{data:n,logs:e.getLogs()}}decode(e){try{return this.load(JSON.parse(atob(e.trim()||"e30=")))}catch(e){return this.load({})}}encode(){const{data:e,logs:t}=this.save();return{string:btoa(JSON.stringify(e)),logs:t}}static output(e,t="<unknown>",n=console){var s;const i=!e.some(e=>!e.expected);null==n||null===(s=n.log)||void 0===s||s.call(n,`[${i?" ":"X"}] WikiShield Storage Logs: ${t}`);for(const t of e){var a;let e=`[${t.expected?" ":"X"}][${t.timestamp}][Storage]`,s=t.type;"dev"===s&&(s="error",e=`#DEV# ${e}`),null==n||null===(a=n[s])||void 0===a||a.call(n,`${e} ${t.message}`)}}static okay(e,t=console){var n,s,i,a;null!=e||(e=(new l).load(l.versions.get(0).default));const r=!(null===(n=null===(s=e.logs)||void 0===s||null===(i=s.some)||void 0===i?void 0:i.call(s,e=>!e.expected))||void 0===n||n);return r||(null!==(a=void l.output(e.logs,"Storage Check",t))&&void 0!==a?a:r)}}t.StorageManager=l,s=l,i="version",a=o.Version.v3,(i=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(i))in s?Object.defineProperty(s,i,{value:a,enumerable:!0,configurable:!0,writable:!0}):s[i]=a},330(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.isURL=t.isObject=void 0;t.isObject=e=>null!==e&&"object"==typeof e&&!Array.isArray(e);t.isURL=e=>{try{return new URL(e),!0}catch(e){return!1}}},4029(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Version=void 0;var s=n(4712),i=n(330);function a(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class r{static sanitize(e,t,n=null){var s;const i=e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.loadedData);if(void 0===i)return null!==(s=void this.loadedLogger.warn(`Missing expected key path [ ${e.join(" -> ")} ] in stored data, defaulting to fallback value.`))&&void 0!==s?s:t;if("function"==typeof n){var a;const s=n(i);return void 0===s?null!==(a=void this.loadedLogger.warn(`Invalid value at key path [ ${e.join(" -> ")} ] in stored data, defaulting to fallback value.`))&&void 0!==a?a:t:s}return i}static exists(...e){return void 0!==e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.loadedData)}static deprecated(...e){var t;return!!this.exists(...e)&&(null===(t=void this.loadedLogger.warn(`Skipped deprecated key path [ ${e.join(" -> ")} ] in stored data.`,!0))||void 0===t||t)}static reset(...e){this.loadedLogger.warn(`Resetting key path [ ${e.join(" -> ")} ] in stored data to default value.`);const t=e.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.default);if(void 0===t)return void this.loadedLogger.dev(`Could not find default value for key path [ ${e.join(" -> ")} ] in stored data.`);const n=e.pop();e.reduce((e,t)=>(void 0===e[t]&&(e[t]={}),e[t]),this.loadedData)[n]=t}static restrictObject(e,...t){var n;if(!(0,i.isObject)(e))return null!==(n=void this.reset(...t))&&void 0!==n&&n;const s=Object.keys(t.reduce((e,t)=>void 0!==(null==e?void 0:e[t])?e[t]:void 0,this.default));return Object.keys(e).forEach(n=>{s.includes(n)||(this.loadedLogger.warn(`Removing unexpected key [ ${[...t,n].join(" -> ")} ] from stored data.`),delete e[n])}),!0}static get default(){return{}}static init(e,t){return this.loadedLogger=e,this.loadedData=t,!0}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");return{}}static validate(){var e;const t=this.loadedData;return this.restrictObject(t),t.version===this.number||null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e}}t.Version=r,a(r,"loadedLogger",new s.Logger),a(r,"loadedData",{}),a(r,"number",0)},9458(e,t,n){var s,i,a,r,o=n(4029);o.Version.v0=(s=class extends o.Version{static get default(){return{version:0,changelog:"0",options:{maxQueueSize:50,maxEditCount:50,minimumORESScore:0,enableSoundAlerts:!0,soundAlertORESScore:.95,enableUsernameHighlighting:!0,enableWelcomeLatin:!1,enableAutoWelcome:!1,enableEditAnalysis:!1,enableUsernameAnalysis:!1,enableAutoReporting:!0,selectedAutoReportReasons:{Vandalism:!0,"Subtle vandalism":!0,"Image vandalism":!0,Sandbox:!0,Unsourced:!0,"Unsourced (BLP)":!0,"Unsourced genre":!0,POV:!1,Commentary:!0,"AI-generated":!0,"AI-generated (talk)":!0,"MOS violation":!1,Censoring:!1,Disruption:!0,Deleting:!0,Errors:!0,"Editing tests":!0,Chatting:!1,Jokes:!0,Owning:!1,Advertising:!0,"Spam links":!0,"Personal attacks":!0,TPO:!0,"AfD removal":!0},zen:{enabled:!1,sounds:!0,watchlist:!1,notifications:!0,editCount:!1,toasts:!1},enableCloudStorage:!0,masterVolume:.5,volumes:{click:.5,notification:.5,watchlist:.5,alert:.5,whoosh:.5,warn:.5,rollback:.5,report:.5,thank:.5,protection:.5,block:.5,sparkle:.5,success:.5,error:.5},soundMappings:{click:"click",notification:"notify",watchlist:"ping",alert:"alert",whoosh:"whoosh",warn:"warn",rollback:"rollback",report:"report",thank:"thank",protection:"protection",block:"block",sparkle:"sparkle",success:"success",error:"error"},watchlistExpiry:"1 week",whitelistExpiry:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlightedExpiry:{users:"1 week",pages:"1 week",tags:"1 week"},wiki:"en",namespacesShown:[0],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:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlightUser",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:"Mentor"}}]}],selectedPalette:0,theme:"theme-light"},statistics:{reviewed:0,reverts:0,reverts:0,reports:0,warnings:0,welcomes:0,whitelisted:0,highlighted:0,blocks:0,sessionStart:Date.now()},whitelist:{users:[],pages:[],tags:[]},highlighted:{users:[],pages:[],tags:[]},queueWidth:"15vw",detailsWidth:"15vw"}}},i=s,r=0,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},7345(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(4029);g.Version.v1=(s=class extends g.Version{static get default(){return{version:1,changelog:"3",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,recent:{enabled:!0,order:0},flagged:{enabled:!0,order:1},users:{enabled:!0,order:2},watchlist:{enabled:!0,order:3}},cloud_storage:{enabled:!0},username_highlighting:{enabled:!0,fuzzy:!0},auto_welcome:{enabled:!0},expiry:{watchlist:"1 week",whitelist:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlight:{users:"1 week",pages:"1 week",tags:"1 week"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Unsourced","Unsourced (BLP)","Unsourced genre","Commentary","AI-generated","AI-generated (talk)","Censoring",,"Disruption","Deleting","Errors","Editing tests","Jokes","Advertising","Spam links","Personal attacks","TPO","AfD removal"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.notice":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},notices:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}}},UI:{theme:{palette:0},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlightUser",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:"Auto"}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");this.deprecated("options","enableWelcomeLatin"),this.deprecated("options","volumes","whoosh"),this.deprecated("options","volumes","warn"),this.deprecated("options","volumes","rollback"),this.deprecated("options","volumes","thank"),this.deprecated("options","volumes","sparkle"),this.deprecated("options","volumes","watchlist"),this.deprecated("options","volumes","success"),this.deprecated("options","volumes","error"),this.deprecated("options","soundMappings"),this.deprecated("options","wiki"),this.deprecated("options","showTemps"),this.deprecated("options","showUsers"),this.deprecated("options","sortQueueItems"),this.deprecated("options","theme"),this.deprecated("options","zen","editCount"),this.deprecated("options","zen","watchlist");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:e.settings.performance.startup},namespaces:this.sanitize(["options","namespacesShown"],e.settings.namespaces),queue:{max_size:this.sanitize(["options","maxQueueSize"],e.settings.queue.max_size),max_edits:this.sanitize(["options","maxEditCount"],e.settings.queue.max_edits),min_ores:this.sanitize(["options","minimumORESScore"],e.settings.queue.min_ores),recent:{enabled:e.settings.queue.recent.enabled,order:e.settings.queue.recent.order},flagged:{enabled:e.settings.queue.flagged.enabled,order:e.settings.queue.flagged.order},users:{enabled:e.settings.queue.users.enabled,order:e.settings.queue.users.order},watchlist:{enabled:e.settings.queue.watchlist.enabled,order:e.settings.queue.watchlist.order}},cloud_storage:{enabled:this.sanitize(["options","enableCloudStorage"],e.settings.cloud_storage.enabled)},username_highlighting:{enabled:this.sanitize(["options","enableUsernameHighlighting"],e.settings.username_highlighting.enabled),fuzzy:e.settings.username_highlighting.fuzzy},auto_welcome:{enabled:this.sanitize(["options","enableAutoWelcome"],e.settings.auto_welcome.enabled)},expiry:{watchlist:this.sanitize(["options","watchlistExpiry"],e.settings.expiry.watchlist),whitelist:{users:this.sanitize(["options","whitelistExpiry","users"],e.settings.expiry.whitelist.users),pages:this.sanitize(["options","whitelistExpiry","pages"],e.settings.expiry.whitelist.pages),tags:this.sanitize(["options","whitelistExpiry","tags"],e.settings.expiry.whitelist.tags)},highlight:{users:this.sanitize(["options","highlightedExpiry","users"],e.settings.expiry.highlight.users),pages:this.sanitize(["options","highlightedExpiry","pages"],e.settings.expiry.highlight.pages),tags:this.sanitize(["options","highlightedExpiry","tags"],e.settings.expiry.highlight.tags)}},auto_report:{enabled:this.sanitize(["options","enableAutoReporting"],e.settings.auto_report.enabled),for:this.sanitize(["options","selectedAutoReportReasons"],e.settings.auto_report.for,e=>{if((0,o.isObject)(e))return e["AI-generated"]=e["AI-Generated"],delete e["AI-Generated"],e["AI-generated (talk)"]=e["AI-Generated (talk)"],delete e["AI-Generated (talk)"],Object.keys(e).filter(t=>!0===(null==e?void 0:e[t]))})},AI:{enabled:this.sanitize(["options","enableOllamaAI"],e.settings.AI.enabled),provider:e.settings.AI.provider,edit_analysis:{enabled:this.sanitize(["options","enableEditAnalysis"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["options","enableUsernameAnalysis"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["options","ollamaServerUrl"],e.settings.AI.Ollama.server),model:this.sanitize(["options","ollamaModel"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["options","enableSoundAlerts"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["options","soundAlertORESScore"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["options","masterVolume"],e.settings.audio.volume.master),"master.startup":e.settings.audio.volume["master.startup"],"master.music":e.settings.audio.volume["master.music"],"master.music.zen_mode":e.settings.audio.volume["master.music.zen_mode"],"master.ui":e.settings.audio.volume["master.ui"],"master.ui.click":this.sanitize(["options","volumes","click"],e.settings.audio.volume["master.ui.click"]),"master.queue":e.settings.audio.volume["master.queue"],"master.queue.ores":this.sanitize(["options","volumes","alert"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":e.settings.audio.volume["master.queue.mention"],"master.notification":e.settings.audio.volume["master.notification"],"master.notification.alert":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.alert"]),"master.notification.notice":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.notice"]),"master.notification.toast":this.sanitize(["options","volumes","notification"],e.settings.audio.volume["master.notification.toast"]),"master.action":e.settings.audio.volume["master.action"],"master.action.default":e.settings.audio.volume["master.action.default"],"master.action.failed":e.settings.audio.volume["master.action.failed"],"master.action.report":this.sanitize(["options","volumes","report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["options","volumes","block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["options","volumes","protection"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["options","zen","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["options","zen","sounds"],e.settings.zen_mode.sound.enabled)},music:{enabled:e.settings.zen_mode.music.enabled},alerts:{enabled:this.sanitize(["options","zen","notifications"],e.settings.zen_mode.alerts.enabled)},notices:{enabled:this.sanitize(["options","zen","notifications"],e.settings.zen_mode.notices.enabled)},toasts:{enabled:this.sanitize(["options","zen","toasts"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:e.settings.zen_mode.badges.enabled}}},UI:{theme:{palette:this.sanitize(["options","selectedPalette"],e.UI.theme.palette)},queue:{width:this.sanitize(["queueWidth"],e.UI.queue.width)},details:{width:this.sanitize(["detailsWidth"],e.UI.details.width)}},control_scripts:this.sanitize(["options","controlScripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name){if(!(e.condition in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else switch(e.name){case"welcome":if(!(0,o.isObject)(e.params))return!0;switch(e.params.template){case"Links":e.params.template="Graphical";break;case"Latin":e.params.template="Non-Latin";break;case"Mentor":return this.loadedLogger.warn(`Skipped deprecated "Mentor" welcome template at key [${[...n,s,"params","template"].join(" -> ")}].`,!0),!1}break;case"warn":if(!(0,o.isObject)(e.params))return!0;switch(e.params.warningType){case"AI-Generated":e.params.warningType="AI-generated";break;case"AI-Generated (talk)":e.params.warningType="AI-generated (talk)"}}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:e.statistics.edits_reviewed.total,thanked:e.statistics.edits_reviewed.thanked},recent_changes_reviewed:{total:e.statistics.recent_changes_reviewed.total},pending_changes_reviewed:{total:e.statistics.pending_changes_reviewed.total,accepted:e.statistics.pending_changes_reviewed.accepted,rejected:e.statistics.pending_changes_reviewed.rejected},watchlist_changes_reviewed:{total:e.statistics.watchlist_changes_reviewed.total},users_reviewed:{total:e.statistics.users_reviewed.total},reverts_made:{total:e.statistics.reverts_made.total,good_faith:e.statistics.reverts_made.good_faith,from_recent_changes:e.statistics.reverts_made.from_recent_changes,from_pending_changes:e.statistics.reverts_made.from_pending_changes,from_watchlist:e.statistics.reverts_made.from_watchlist,from_loaded_edits:e.statistics.reverts_made.from_loaded_edits},users_welcomed:{total:e.statistics.users_welcomed.total},warnings_issued:{total:e.statistics.warnings_issued.total,level_1:e.statistics.warnings_issued.level_1,level_2:e.statistics.warnings_issued.level_2,level_3:e.statistics.warnings_issued.level_3,level_4:e.statistics.warnings_issued.level_4,level_4im:e.statistics.warnings_issued.level_4im},reports_filed:{total:e.statistics.reports_filed.total,AIV:e.statistics.reports_filed.AIV,UAA:e.statistics.reports_filed.UAA,RFPP:e.statistics.reports_filed.RFPP},watchlist:{watched:e.statistics.watchlist.watched,unwatched:e.statistics.watchlist.unwatched},items_whitelisted:{total:e.statistics.items_whitelisted.total,users:e.statistics.items_whitelisted.users,pages:e.statistics.items_whitelisted.pages,tags:e.statistics.items_whitelisted.tags},items_highlighted:{total:e.statistics.items_highlighted.total,users:e.statistics.items_highlighted.users,pages:e.statistics.items_highlighted.pages,tags:e.statistics.items_highlighted.tags},blocks_issued:{total:e.statistics.blocks_issued.total},pages_protected:{total:e.statistics.pages_protected.total},actions_executed:{total:e.statistics.actions_executed.total,successful:e.statistics.actions_executed.successful},session_time:e.statistics.session_time},highlight:{users:this.sanitize(["highlighted","users"],e.highlight.users),pages:this.sanitize(["highlighted","pages"],e.highlight.pages),tags:this.sanitize(["highlighted","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),t.version!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const g=t.settings.namespaces;Array.isArray(g)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const h=t.settings.queue;this.restrictObject(h,"settings","queue");{const m=t.settings.queue.max_size;"number"==typeof m&&Number.isInteger(m)&&m>0||this.reset("settings","queue","max_size")}{const v=t.settings.queue.max_edits;"number"==typeof v&&Number.isInteger(v)&&v>0||this.reset("settings","queue","max_edits")}{const f=t.settings.queue.min_ores;"number"==typeof f&&f>=0&&f<=1||this.reset("settings","queue","min_ores")}["recent","flagged","users","watchlist"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const b=t.settings.cloud_storage;this.restrictObject(b,"settings","cloud_storage");"boolean"!=typeof t.settings.cloud_storage.enabled&&this.reset("settings","cloud_storage","enabled")}{const w=t.settings.username_highlighting;this.restrictObject(w,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const y=t.settings.auto_welcome;this.restrictObject(y,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const x=new Set(["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"]),k=t.settings.expiry;this.restrictObject(k,"settings","expiry");{const _=t.settings.expiry.watchlist;x.has(_)||this.reset("settings","expiry","watchlist")}{const S=t.settings.expiry.whitelist;this.restrictObject(S,"settings","expiry","whitelist");{const q=t.settings.expiry.whitelist.users;x.has(q)||this.reset("settings","expiry","whitelist","users")}{const E=t.settings.expiry.whitelist.pages;x.has(E)||this.reset("settings","expiry","whitelist","pages")}{const L=t.settings.expiry.whitelist.tags;x.has(L)||this.reset("settings","expiry","whitelist","tags")}}{const A=t.settings.expiry.highlight;this.restrictObject(A,"settings","expiry","highlight");{const T=t.settings.expiry.highlight.users;x.has(T)||this.reset("settings","expiry","highlight","users")}{const C=t.settings.expiry.highlight.pages;x.has(C)||this.reset("settings","expiry","highlight","pages")}{const z=t.settings.expiry.highlight.tags;x.has(z)||this.reset("settings","expiry","highlight","tags")}}}{const M=t.settings.auto_report;this.restrictObject(M,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const $=t.settings.auto_report.for;Array.isArray($)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const O=t.settings.AI;this.restrictObject(O,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const I=t.settings.AI.edit_analysis;this.restrictObject(I,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const P=t.settings.AI.username_analysis;this.restrictObject(P,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const j=t.settings.AI.Ollama;this.restrictObject(j,"settings","AI","Ollama");{const W=t.settings.AI.Ollama.server;(0,o.isURL)(W)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const D=t.settings.audio;this.restrictObject(D,"settings","audio");{const R=t.settings.audio.ores_alert;this.restrictObject(R,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const U=t.settings.audio.ores_alert.threshold;"number"==typeof U&&U>=0&&U<=1||this.reset("settings","audio","ores_alert","threshold")}}{const N=t.settings.audio.volume;this.restrictObject(N,"settings","audio","volume");const H=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.notice","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const F of H){const V=t.settings.audio.volume[F];"number"==typeof V&&V>=0&&V<=1||this.reset("settings","audio","volume",F)}}}{const B=t.settings.zen_mode;this.restrictObject(B,"settings","zen_mode");"boolean"!=typeof B.enabled&&this.reset("settings","zen_mode","enabled");{const G=t.settings.zen_mode.sound;this.restrictObject(G,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const Q=t.settings.zen_mode.music;this.restrictObject(Q,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const Y=t.settings.zen_mode.alerts;this.restrictObject(Y,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const Z=t.settings.zen_mode.notices;this.restrictObject(Z,"settings","zen_mode","notices");"boolean"!=typeof t.settings.zen_mode.notices.enabled&&this.reset("settings","zen_mode","notices","enabled")}{const K=t.settings.zen_mode.toasts;this.restrictObject(K,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const X=t.settings.zen_mode.badges;this.restrictObject(X,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}}{const J=t.UI;this.restrictObject(J,"UI");{const ee=t.UI.theme;this.restrictObject(ee,"UI","theme");{const te=t.UI.theme.palette;"number"==typeof te&&Number.isInteger(te)&&te>=0&&te<=3||this.reset("UI","theme","palette")}}{const ne=t.UI.queue;this.restrictObject(ne,"UI","queue");{const se=t.UI.queue.width;"string"==typeof se&&se.endsWith("vw")||this.reset("UI","queue","width");const ie=parseFloat(se.slice(0,-2));"number"==typeof ie&&!isNaN(ie)&&ie>=10&&ie<=30||this.reset("UI","queue","width")}}{const ae=t.UI.details;this.restrictObject(ae,"UI","details");{const re=t.UI.details.width;"string"==typeof re&&re.endsWith("vw")||this.reset("UI","details","width");const oe=parseFloat(re.slice(0,-2));"number"==typeof oe&&!isNaN(oe)&&oe>=10&&oe<=30||this.reset("UI","details","width")}}}{const le=t.control_scripts;function de(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name){var i;if(!(e.condition in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${e.condition} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]),e.actions=de.call(this,e.actions,...t,n,"actions")}else{var a;if(!(e.name in c.events))return this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`),!1;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=null!==(a=c.events[e.name].parameters)&&void 0!==a?a:[],i=new Set;for(const a of s)i.add(a.id),"choice"===a.type&&(a.id in e.params||(this.loadedLogger.warn(`Resetting missing choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]),a.options.includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]));for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(le)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>p.controls.has(e)),t.control_scripts[n].actions=de.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const ce=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,ue=t.statistics;this.restrictObject(ue,"statistics");{const pe=t.statistics.edits_reviewed;this.restrictObject(pe,"statistics","edits_reviewed");ce(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");ce(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const ge=t.statistics.recent_changes_reviewed;this.restrictObject(ge,"statistics","recent_changes_reviewed");ce(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const he=t.statistics.pending_changes_reviewed;this.restrictObject(he,"statistics","pending_changes_reviewed");ce(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");ce(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");ce(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const me=t.statistics.watchlist_changes_reviewed;this.restrictObject(me,"statistics","watchlist_changes_reviewed");ce(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const ve=t.statistics.users_reviewed;this.restrictObject(ve,"statistics","users_reviewed");ce(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const fe=t.statistics.reverts_made;this.restrictObject(fe,"statistics","reverts_made");ce(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");ce(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");ce(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");ce(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");ce(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");ce(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const be=t.statistics.users_welcomed;this.restrictObject(be,"statistics","users_welcomed");ce(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const we=t.statistics.warnings_issued;this.restrictObject(we,"statistics","warnings_issued");ce(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");ce(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");ce(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");ce(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");ce(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");ce(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const ye=t.statistics.reports_filed;this.restrictObject(ye,"statistics","reports_filed");ce(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");ce(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");ce(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");ce(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP")}{const xe=t.statistics.watchlist;this.restrictObject(xe,"statistics","watchlist");ce(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");ce(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const ke=t.statistics.items_whitelisted;this.restrictObject(ke,"statistics","items_whitelisted");ce(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");ce(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");ce(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");ce(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const _e=t.statistics.items_highlighted;this.restrictObject(_e,"statistics","items_highlighted");ce(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");ce(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");ce(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");ce(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const Se=t.statistics.blocks_issued;this.restrictObject(Se,"statistics","blocks_issued");ce(t.statistics.blocks_issued.total)||this.reset("statistics","blocks_issued","total")}{const qe=t.statistics.pages_protected;this.restrictObject(qe,"statistics","pages_protected");ce(t.statistics.pages_protected.total)||this.reset("statistics","pages_protected","total")}{const Ee=t.statistics.actions_executed;this.restrictObject(Ee,"statistics","actions_executed");ce(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");ce(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const Le=t.statistics.session_time;"number"==typeof Le&&Le>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Ae=t.highlight;this.restrictObject(Ae,"highlight");{const Te=t.highlight.users;Array.isArray(Te)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const Ce=t.highlight.pages;Array.isArray(Ce)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const ze=t.highlight.tags;Array.isArray(ze)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const Me=t.whitelist;this.restrictObject(Me,"whitelist");{const $e=t.whitelist.users;Array.isArray($e)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const Oe=t.whitelist.pages;Array.isArray(Oe)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const Ie=t.whitelist.tags;Array.isArray(Ie)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=1,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},7704(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(4029);g.Version.v2=(s=class extends g.Version{static get default(){return{version:2,changelog:"6",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,recent:{enabled:!0,order:0},flagged:{enabled:!0,order:1},users:{enabled:!0,order:2},watchlist:{enabled:!0,order:3}},cloud_storage:{enabled:!0},username_highlighting:{enabled:!0,fuzzy:!0},wikipedia_popups:{enabled:!0},auto_welcome:{enabled:!1},expiry:{watchlist:"1 week",whitelist:{users:"indefinite",pages:"indefinite",tags:"indefinite"},highlight:{users:"1 week",pages:"1 week",tags:"1 week"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Deliberate errors","Disruptive editing","Editing tests","Commentary","Inappropriate jokes","Deleting","Unsourced","Unsourced (BLP)","Unsourced genre","Original research","Censoring","AI-generated","AI-generated (talk)","Personal attacks","Harassment","TPO",,"AfD removal","Advertising","Spam links","Inappropriate edit summary","Misleading edit summary"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.notice":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},notices:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}},repeat_control_scripts:!0},UI:{theme:{palette:0},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"nextEdit",params:{}},{name:"rollback",params:{}},{name:"warn",params:{warning:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]},{name:"highlightUser",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:"Auto"}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]},favorite:{warnings:[],reverts:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:this.sanitize(["settings","performance","startup"],e.settings.performance.startup)},namespaces:this.sanitize(["settings","namespaces"],e.settings.namespaces),queue:{max_size:this.sanitize(["settings","queue","max_size"],e.settings.queue.max_size),max_edits:this.sanitize(["settings","queue","max_edits"],e.settings.queue.max_edits),min_ores:this.sanitize(["settings","queue","min_ores"],e.settings.queue.min_ores),recent:{enabled:this.sanitize(["settings","queue","recent","enabled"],e.settings.queue.recent.enabled),order:this.sanitize(["settings","queue","recent","order"],e.settings.queue.recent.order)},flagged:{enabled:this.sanitize(["settings","queue","flagged","enabled"],e.settings.queue.flagged.enabled),order:this.sanitize(["settings","queue","flagged","order"],e.settings.queue.flagged.order)},users:{enabled:this.sanitize(["settings","queue","users","enabled"],e.settings.queue.users.enabled),order:this.sanitize(["settings","queue","users","order"],e.settings.queue.users.order)},watchlist:{enabled:this.sanitize(["settings","queue","watchlist","enabled"],e.settings.queue.watchlist.enabled),order:this.sanitize(["settings","queue","watchlist","order"],e.settings.queue.watchlist.order)}},cloud_storage:{enabled:this.sanitize(["settings","cloud_storage","enabled"],e.settings.cloud_storage.enabled)},username_highlighting:{enabled:this.sanitize(["settings","username_highlighting","enabled"],e.settings.username_highlighting.enabled),fuzzy:this.sanitize(["settings","username_highlighting","fuzzy"],e.settings.username_highlighting.fuzzy)},wikipedia_popups:{enabled:e.settings.wikipedia_popups.enabled},auto_welcome:{enabled:this.sanitize(["settings","auto_welcome","enabled"],e.settings.auto_welcome.enabled)},expiry:{watchlist:this.sanitize(["settings","expiry","watchlist"],e.settings.expiry.watchlist),whitelist:{users:this.sanitize(["settings","expiry","whitelist","users"],e.settings.expiry.whitelist.users),pages:this.sanitize(["settings","expiry","whitelist","pages"],e.settings.expiry.whitelist.pages),tags:this.sanitize(["settings","expiry","whitelist","tags"],e.settings.expiry.whitelist.tags)},highlight:{users:this.sanitize(["settings","expiry","highlight","users"],e.settings.expiry.highlight.users),pages:this.sanitize(["settings","expiry","highlight","pages"],e.settings.expiry.highlight.pages),tags:this.sanitize(["settings","expiry","highlight","tags"],e.settings.expiry.highlight.tags)}},auto_report:{enabled:this.sanitize(["settings","auto_report","enabled"],e.settings.auto_report.enabled),for:this.sanitize(["settings","auto_report","for"],e.settings.auto_report.for,e=>{if(!Array.isArray(e))return;const t=new Set(["Harassment","Inappropriate edit summary","Original research"]);return e.forEach(e=>{switch(e){case"Errors":return void t.add("Deliberate errors");case"Disruption":return void t.add("Disruptive editing");case"Jokes":return void t.add("Inappropriate jokes")}t.add(e)}),[...t]})},AI:{enabled:this.sanitize(["settings","AI","enabled"],e.settings.AI.enabled),provider:this.sanitize(["settings","AI","provider"],e.settings.AI.provider),edit_analysis:{enabled:this.sanitize(["settings","AI","edit_analysis","enabled"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["settings","AI","username_analysis","enabled"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["settings","AI","Ollama","server"],e.settings.AI.Ollama.server),model:this.sanitize(["settings","AI","Ollama","model"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["settings","audio","ores_alert","enabled"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["settings","audio","ores_alert","threshold"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["settings","audio","volume","master"],e.settings.audio.volume.master),"master.startup":this.sanitize(["settings","audio","volume","master.startup"],e.settings.audio.volume["master.startup"]),"master.music":this.sanitize(["settings","audio","volume","master.music"],e.settings.audio.volume["master.music"]),"master.music.zen_mode":this.sanitize(["settings","audio","volume","master.music.zen_mode"],e.settings.audio.volume["master.music.zen_mode"]),"master.ui":this.sanitize(["settings","audio","volume","master.ui"],e.settings.audio.volume["master.ui"]),"master.ui.click":this.sanitize(["settings","audio","volume","master.ui.click"],e.settings.audio.volume["master.ui.click"]),"master.queue":this.sanitize(["settings","audio","volume","master.queue"],e.settings.audio.volume["master.queue"]),"master.queue.ores":this.sanitize(["settings","audio","volume","master.queue.ores"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":this.sanitize(["settings","audio","volume","master.queue.mention"],e.settings.audio.volume["master.queue.mention"]),"master.notification":this.sanitize(["settings","audio","volume","master.notification"],e.settings.audio.volume["master.notification"]),"master.notification.alert":this.sanitize(["settings","audio","volume","master.notification.alert"],e.settings.audio.volume["master.notification.alert"]),"master.notification.notice":this.sanitize(["settings","audio","volume","master.notification.notice"],e.settings.audio.volume["master.notification.notice"]),"master.notification.toast":this.sanitize(["settings","audio","volume","master.notification.toast"],e.settings.audio.volume["master.notification.toast"]),"master.action":this.sanitize(["settings","audio","volume","master.action"],e.settings.audio.volume["master.action"]),"master.action.default":this.sanitize(["settings","audio","volume","master.action.default"],e.settings.audio.volume["master.action.default"]),"master.action.failed":this.sanitize(["settings","audio","volume","master.action.failed"],e.settings.audio.volume["master.action.failed"]),"master.action.report":this.sanitize(["settings","audio","volume","master.action.report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["settings","audio","volume","master.action.block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["settings","audio","volume","master.action.protect"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["settings","zen_mode","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["settings","zen_mode","sound","enabled"],e.settings.zen_mode.sound.enabled)},music:{enabled:this.sanitize(["settings","zen_mode","music","enabled"],e.settings.zen_mode.music.enabled)},alerts:{enabled:this.sanitize(["settings","zen_mode","alerts","enabled"],e.settings.zen_mode.alerts.enabled)},notices:{enabled:this.sanitize(["settings","zen_mode","notices","enabled"],e.settings.zen_mode.notices.enabled)},toasts:{enabled:this.sanitize(["settings","zen_mode","toasts","enabled"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:this.sanitize(["settings","zen_mode","badges","enabled"],e.settings.zen_mode.badges.enabled)}},repeat_control_scripts:e.settings.repeat_control_scripts},UI:{theme:{palette:this.sanitize(["UI","theme","palette"],e.UI.theme.palette)},queue:{width:this.sanitize(["UI","queue","width"],e.UI.queue.width)},details:{width:this.sanitize(["UI","details","width"],e.UI.details.width)}},control_scripts:this.sanitize(["control_scripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name){if(!(e.condition in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else if("warn"===e.name){if(!(0,o.isObject)(e.params))return!0;e.params.warning=e.params.warningType,delete e.params.warningType}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:this.sanitize(["statistics","edits_reviewed","total"],e.statistics.edits_reviewed.total),thanked:this.sanitize(["statistics","edits_reviewed","thanked"],e.statistics.edits_reviewed.thanked)},recent_changes_reviewed:{total:this.sanitize(["statistics","recent_changes_reviewed","total"],e.statistics.recent_changes_reviewed.total)},pending_changes_reviewed:{total:this.sanitize(["statistics","pending_changes_reviewed","total"],e.statistics.pending_changes_reviewed.total),accepted:this.sanitize(["statistics","pending_changes_reviewed","accepted"],e.statistics.pending_changes_reviewed.accepted),rejected:this.sanitize(["statistics","pending_changes_reviewed","rejected"],e.statistics.pending_changes_reviewed.rejected)},watchlist_changes_reviewed:{total:this.sanitize(["statistics","watchlist_changes_reviewed","total"],e.statistics.watchlist_changes_reviewed.total)},users_reviewed:{total:this.sanitize(["statistics","users_reviewed","total"],e.statistics.users_reviewed.total)},reverts_made:{total:this.sanitize(["statistics","reverts_made","total"],e.statistics.reverts_made.total),good_faith:this.sanitize(["statistics","reverts_made","good_faith"],e.statistics.reverts_made.good_faith),from_recent_changes:this.sanitize(["statistics","reverts_made","from_recent_changes"],e.statistics.reverts_made.from_recent_changes),from_pending_changes:this.sanitize(["statistics","reverts_made","from_pending_changes"],e.statistics.reverts_made.from_pending_changes),from_watchlist:this.sanitize(["statistics","reverts_made","from_watchlist"],e.statistics.reverts_made.from_watchlist),from_loaded_edits:this.sanitize(["statistics","reverts_made","from_loaded_edits"],e.statistics.reverts_made.from_loaded_edits)},users_welcomed:{total:this.sanitize(["statistics","users_welcomed","total"],e.statistics.users_welcomed.total)},warnings_issued:{total:this.sanitize(["statistics","warnings_issued","total"],e.statistics.warnings_issued.total),level_1:this.sanitize(["statistics","warnings_issued","level_1"],e.statistics.warnings_issued.level_1),level_2:this.sanitize(["statistics","warnings_issued","level_2"],e.statistics.warnings_issued.level_2),level_3:this.sanitize(["statistics","warnings_issued","level_3"],e.statistics.warnings_issued.level_3),level_4:this.sanitize(["statistics","warnings_issued","level_4"],e.statistics.warnings_issued.level_4),level_4im:this.sanitize(["statistics","warnings_issued","level_4im"],e.statistics.warnings_issued.level_4im)},reports_filed:{total:this.sanitize(["statistics","reports_filed","total"],e.statistics.reports_filed.total),AIV:this.sanitize(["statistics","reports_filed","AIV"],e.statistics.reports_filed.AIV),UAA:this.sanitize(["statistics","reports_filed","UAA"],e.statistics.reports_filed.UAA),RFPP:this.sanitize(["statistics","reports_filed","RFPP"],e.statistics.reports_filed.RFPP)},watchlist:{watched:this.sanitize(["statistics","watchlist","watched"],e.statistics.watchlist.watched),unwatched:this.sanitize(["statistics","watchlist","unwatched"],e.statistics.watchlist.unwatched)},items_whitelisted:{total:this.sanitize(["statistics","items_whitelisted","total"],e.statistics.items_whitelisted.total),users:this.sanitize(["statistics","items_whitelisted","users"],e.statistics.items_whitelisted.users),pages:this.sanitize(["statistics","items_whitelisted","pages"],e.statistics.items_whitelisted.pages),tags:this.sanitize(["statistics","items_whitelisted","tags"],e.statistics.items_whitelisted.tags)},items_highlighted:{total:this.sanitize(["statistics","items_highlighted","total"],e.statistics.items_highlighted.total),users:this.sanitize(["statistics","items_highlighted","users"],e.statistics.items_highlighted.users),pages:this.sanitize(["statistics","items_highlighted","pages"],e.statistics.items_highlighted.pages),tags:this.sanitize(["statistics","items_highlighted","tags"],e.statistics.items_highlighted.tags)},blocks_issued:{total:this.sanitize(["statistics","blocks_issued","total"],e.statistics.blocks_issued.total)},pages_protected:{total:this.sanitize(["statistics","pages_protected","total"],e.statistics.pages_protected.total)},actions_executed:{total:this.sanitize(["statistics","actions_executed","total"],e.statistics.actions_executed.total),successful:this.sanitize(["statistics","actions_executed","successful"],e.statistics.actions_executed.successful)},session_time:this.sanitize(["statistics","session_time"],e.statistics.session_time)},highlight:{users:this.sanitize(["highlight","users"],e.highlight.users),pages:this.sanitize(["highlight","pages"],e.highlight.pages),tags:this.sanitize(["highlight","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)},favorite:{warnings:e.favorite.warnings,reverts:e.favorite.reverts}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),t.version!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const g=t.settings.namespaces;Array.isArray(g)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const h=t.settings.queue;this.restrictObject(h,"settings","queue");{const m=t.settings.queue.max_size;"number"==typeof m&&Number.isInteger(m)&&m>0||this.reset("settings","queue","max_size")}{const v=t.settings.queue.max_edits;"number"==typeof v&&Number.isInteger(v)&&v>0||this.reset("settings","queue","max_edits")}{const f=t.settings.queue.min_ores;"number"==typeof f&&f>=0&&f<=1||this.reset("settings","queue","min_ores")}["recent","flagged","users","watchlist"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const b=t.settings.cloud_storage;this.restrictObject(b,"settings","cloud_storage");"boolean"!=typeof t.settings.cloud_storage.enabled&&this.reset("settings","cloud_storage","enabled")}{const w=t.settings.username_highlighting;this.restrictObject(w,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const y=t.settings.wikipedia_popups;this.restrictObject(y,"settings","wikipedia_popups");"boolean"!=typeof t.settings.wikipedia_popups.enabled&&this.reset("settings","wikipedia_popups","enabled")}{const x=t.settings.auto_welcome;this.restrictObject(x,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const k=new Set(["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"]),_=t.settings.expiry;this.restrictObject(_,"settings","expiry");{const S=t.settings.expiry.watchlist;k.has(S)||this.reset("settings","expiry","watchlist")}{const q=t.settings.expiry.whitelist;this.restrictObject(q,"settings","expiry","whitelist");{const E=t.settings.expiry.whitelist.users;k.has(E)||this.reset("settings","expiry","whitelist","users")}{const L=t.settings.expiry.whitelist.pages;k.has(L)||this.reset("settings","expiry","whitelist","pages")}{const A=t.settings.expiry.whitelist.tags;k.has(A)||this.reset("settings","expiry","whitelist","tags")}}{const T=t.settings.expiry.highlight;this.restrictObject(T,"settings","expiry","highlight");{const C=t.settings.expiry.highlight.users;k.has(C)||this.reset("settings","expiry","highlight","users")}{const z=t.settings.expiry.highlight.pages;k.has(z)||this.reset("settings","expiry","highlight","pages")}{const M=t.settings.expiry.highlight.tags;k.has(M)||this.reset("settings","expiry","highlight","tags")}}}{const $=t.settings.auto_report;this.restrictObject($,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const O=t.settings.auto_report.for;Array.isArray(O)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const I=t.settings.AI;this.restrictObject(I,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const P=t.settings.AI.edit_analysis;this.restrictObject(P,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const j=t.settings.AI.username_analysis;this.restrictObject(j,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const W=t.settings.AI.Ollama;this.restrictObject(W,"settings","AI","Ollama");{const D=t.settings.AI.Ollama.server;(0,o.isURL)(D)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const R=t.settings.audio;this.restrictObject(R,"settings","audio");{const U=t.settings.audio.ores_alert;this.restrictObject(U,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const N=t.settings.audio.ores_alert.threshold;"number"==typeof N&&N>=0&&N<=1||this.reset("settings","audio","ores_alert","threshold")}}{const H=t.settings.audio.volume;this.restrictObject(H,"settings","audio","volume");const F=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.notice","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const V of F){const B=t.settings.audio.volume[V];"number"==typeof B&&B>=0&&B<=1||this.reset("settings","audio","volume",V)}}}{const G=t.settings.zen_mode;this.restrictObject(G,"settings","zen_mode");"boolean"!=typeof G.enabled&&this.reset("settings","zen_mode","enabled");{const Q=t.settings.zen_mode.sound;this.restrictObject(Q,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const Y=t.settings.zen_mode.music;this.restrictObject(Y,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const Z=t.settings.zen_mode.alerts;this.restrictObject(Z,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const K=t.settings.zen_mode.notices;this.restrictObject(K,"settings","zen_mode","notices");"boolean"!=typeof t.settings.zen_mode.notices.enabled&&this.reset("settings","zen_mode","notices","enabled")}{const X=t.settings.zen_mode.toasts;this.restrictObject(X,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const J=t.settings.zen_mode.badges;this.restrictObject(J,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}"boolean"!=typeof t.settings.repeat_control_scripts&&this.reset("settings","repeat_control_scripts")}{const ee=t.UI;this.restrictObject(ee,"UI");{const te=t.UI.theme;this.restrictObject(te,"UI","theme");{const ne=t.UI.theme.palette;"number"==typeof ne&&Number.isInteger(ne)&&ne>=0&&ne<=3||this.reset("UI","theme","palette")}}{const se=t.UI.queue;this.restrictObject(se,"UI","queue");{const ie=t.UI.queue.width;"string"==typeof ie&&ie.endsWith("vw")||this.reset("UI","queue","width");const ae=parseFloat(ie.slice(0,-2));"number"==typeof ae&&!isNaN(ae)&&ae>=10&&ae<=30||this.reset("UI","queue","width")}}{const re=t.UI.details;this.restrictObject(re,"UI","details");{const oe=t.UI.details.width;"string"==typeof oe&&oe.endsWith("vw")||this.reset("UI","details","width");const le=parseFloat(oe.slice(0,-2));"number"==typeof le&&!isNaN(le)&&le>=10&&le<=30||this.reset("UI","details","width")}}}{const de=t.control_scripts;function ce(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name){var i;if(!(e.condition in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${e.condition} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]),e.actions=ce.call(this,e.actions,...t,n,"actions")}else{var a,r;if(!(e.name in c.events))return null!==(a=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`))&&void 0!==a&&a;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=null!==(r=c.events[e.name].parameters)&&void 0!==r?r:[],i=new Set;for(const a of s)i.add(a.id),"choice"===a.type&&(a.id in e.params||(this.loadedLogger.warn(`Resetting missing choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]),a.options.includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=a.options[0]));for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(de)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>p.controls.has(e)),t.control_scripts[n].actions=ce.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const ue=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,pe=t.statistics;this.restrictObject(pe,"statistics");{const ge=t.statistics.edits_reviewed;this.restrictObject(ge,"statistics","edits_reviewed");ue(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");ue(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const he=t.statistics.recent_changes_reviewed;this.restrictObject(he,"statistics","recent_changes_reviewed");ue(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const me=t.statistics.pending_changes_reviewed;this.restrictObject(me,"statistics","pending_changes_reviewed");ue(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");ue(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");ue(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const ve=t.statistics.watchlist_changes_reviewed;this.restrictObject(ve,"statistics","watchlist_changes_reviewed");ue(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const fe=t.statistics.users_reviewed;this.restrictObject(fe,"statistics","users_reviewed");ue(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const be=t.statistics.reverts_made;this.restrictObject(be,"statistics","reverts_made");ue(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");ue(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");ue(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");ue(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");ue(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");ue(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const we=t.statistics.users_welcomed;this.restrictObject(we,"statistics","users_welcomed");ue(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const ye=t.statistics.warnings_issued;this.restrictObject(ye,"statistics","warnings_issued");ue(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");ue(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");ue(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");ue(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");ue(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");ue(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const xe=t.statistics.reports_filed;this.restrictObject(xe,"statistics","reports_filed");ue(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");ue(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");ue(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");ue(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP")}{const ke=t.statistics.watchlist;this.restrictObject(ke,"statistics","watchlist");ue(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");ue(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const _e=t.statistics.items_whitelisted;this.restrictObject(_e,"statistics","items_whitelisted");ue(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");ue(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");ue(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");ue(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const Se=t.statistics.items_highlighted;this.restrictObject(Se,"statistics","items_highlighted");ue(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");ue(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");ue(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");ue(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const qe=t.statistics.blocks_issued;this.restrictObject(qe,"statistics","blocks_issued");ue(t.statistics.blocks_issued.total)||this.reset("statistics","blocks_issued","total")}{const Ee=t.statistics.pages_protected;this.restrictObject(Ee,"statistics","pages_protected");ue(t.statistics.pages_protected.total)||this.reset("statistics","pages_protected","total")}{const Le=t.statistics.actions_executed;this.restrictObject(Le,"statistics","actions_executed");ue(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");ue(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const Ae=t.statistics.session_time;"number"==typeof Ae&&Ae>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Te=t.highlight;this.restrictObject(Te,"highlight");{const Ce=t.highlight.users;Array.isArray(Ce)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const ze=t.highlight.pages;Array.isArray(ze)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const Me=t.highlight.tags;Array.isArray(Me)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const $e=t.whitelist;this.restrictObject($e,"whitelist");{const Oe=t.whitelist.users;Array.isArray(Oe)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const Ie=t.whitelist.pages;Array.isArray(Ie)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const Pe=t.whitelist.tags;Array.isArray(Pe)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}{const je=t.favorite;this.restrictObject(je,"favorite");{const We=t.favorite.warnings;Array.isArray(We)||this.reset("favorite","warnings"),t.favorite.warnings=t.favorite.warnings.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite warning [ ${e} ] from stored data.`),t})}{const De=t.favorite.reverts;Array.isArray(De)||this.reset("favorite","reverts"),t.favorite.reverts=t.favorite.reverts.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite revert [ ${e} ] from stored data.`),t})}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=2,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},8415(e,t,n){var s,i,a,r,o=n(330),l=n(4018),d=n(955),c=n(985),u=n(870),p=n(9808),g=n(3241),h=n(5564),m=n(8469),v=n(4029);v.Version.v3=(s=class extends v.Version{static get default(){return{version:3,changelog:"6",settings:{performance:{startup:"adaptive"},namespaces:[0],queue:{max_size:100,max_edits:50,min_ores:0,ores_bias:.5,recent:{enabled:!0,order:0},pending:{enabled:!0,order:1},users:{enabled:!1,order:2},watchlist:{enabled:!0,order:3},abuselog:{enabled:!0,order:4}},username_highlighting:{enabled:!0,fuzzy:!1},wikipedia_popups:{enabled:!0},auto_welcome:{enabled:!1},talk_page_thanks_for_temporary_users:{enabled:!0},expiry:{watchlist:"1W",whitelist:{users:"infinity",pages:"infinity",tags:"infinity"},highlight:{users:"1W",pages:"1W",tags:"1W"}},auto_report:{enabled:!0,for:["Vandalism","Subtle vandalism","Image vandalism","Sandbox","Deliberate errors","Disruptive editing","Editing tests","Commentary","Inappropriate jokes","Deleting","Unsourced","Unsourced (BLP)","Unsourced genre","Original research","Censoring","AI-generated","AI-generated (talk)","Personal attacks","Harassment","TPO","AfD removal","Advertising","Spam links","Attempt","Inappropriate edit summary","Misleading edit summary"]},AI:{enabled:!1,provider:"Ollama",edit_analysis:{enabled:!0},username_analysis:{enabled:!0},Ollama:{server:"http://localhost:11434",model:""}},audio:{ores_alert:{enabled:!0,threshold:.95},volume:{master:1,"master.startup":1,"master.music":1,"master.music.zen_mode":1,"master.ui":1,"master.ui.click":.05,"master.queue":1,"master.queue.ores":1,"master.queue.mention":1,"master.notification":1,"master.notification.alert":.7,"master.notification.message":.5,"master.notification.toast":.5,"master.action":1,"master.action.default":.6,"master.action.failed":.85,"master.action.report":1,"master.action.block":1,"master.action.protect":1}},zen_mode:{enabled:!1,sound:{enabled:!0},music:{enabled:!0},alerts:{enabled:!0},messages:{enabled:!1},toasts:{enabled:!1},badges:{enabled:!1}},accessibility:{colorblind:!1,dyslexia:!1,high_contrast:!1,reduce_motion:!1},repeat_control_scripts:!0},UI:{theme:{app:"auto",palette:"traffic"},queue:{width:"15vw"},details:{width:"15vw"}},control_scripts:[{keys:["arrowright"," "],actions:[{name:"next-item",params:{}}]},{keys:["arrowleft"],actions:[{name:"previous-item",params:{}}]},{keys:["q"],actions:[{name:"next-item",params:{}},{name:"revert",params:{warning:"Vandalism"}},{name:"highlight-user",params:{}}]},{keys:["h"],actions:[{name:"open-page-history",params:{}}]},{keys:["c"],actions:[{name:"open-user-contributions",params:{}}]},{keys:["t"],actions:[{name:"thank-user",params:{}}]},{keys:["w"],actions:[{name:"welcome-user",params:{}}]}],statistics:{edits_reviewed:{total:0,thanked:0},recent_changes_reviewed:{total:0},pending_changes_reviewed:{total:0,accepted:0,rejected:0},watchlist_changes_reviewed:{total:0},users_reviewed:{total:0},abuselogs_reviewed:{total:0},reverts_made:{total:0,good_faith:0,from_recent_changes:0,from_pending_changes:0,from_watchlist:0,from_abuselogs:0,from_loaded_edits:0},users_welcomed:{total:0},warnings_issued:{total:0,level_1:0,level_2:0,level_3:0,level_4:0,level_4im:0},reports_filed:{total:0,AIV:0,UAA:0,RFPP:0,global_blocks:0,global_locks:0},watchlist:{watched:0,unwatched:0},items_whitelisted:{total:0,users:0,pages:0,tags:0},items_highlighted:{total:0,users:0,pages:0,tags:0},blocks_issued:{total:0},pages_protected:{total:0},actions_executed:{total:0,successful:0},session_time:0},highlight:{users:[],pages:[],tags:[]},whitelist:{users:[],pages:[],tags:[]},favorite:{warnings:[],reverts:[]}}}static upgrade(){if(this.loadedData.version!==this.number-1)throw this.loadedLogger.dev(`[INVALID_UPGRADE_ATTEMPT] Attempted to upgrade from version ${this.loadedData.version} to version ${this.number}, but this upgrade method only supports upgrades from version ${this.number-1}.`),new Error("INVALID_UPGRADE_ATTEMPT");this.deprecated("settings","cloud_storage");const e=this.default;return{changelog:this.sanitize(["changelog"],e.changelog),settings:{performance:{startup:this.sanitize(["settings","performance","startup"],e.settings.performance.startup)},namespaces:this.sanitize(["settings","namespaces"],e.settings.namespaces),queue:{max_size:this.sanitize(["settings","queue","max_size"],e.settings.queue.max_size),max_edits:this.sanitize(["settings","queue","max_edits"],e.settings.queue.max_edits),min_ores:this.sanitize(["settings","queue","min_ores"],e.settings.queue.min_ores),ores_bias:e.settings.queue.ores_bias,recent:{enabled:this.sanitize(["settings","queue","recent","enabled"],e.settings.queue.recent.enabled),order:this.sanitize(["settings","queue","recent","order"],e.settings.queue.recent.order)},pending:{enabled:this.sanitize(["settings","queue","flagged","enabled"],e.settings.queue.pending.enabled),order:this.sanitize(["settings","queue","flagged","order"],e.settings.queue.pending.order)},users:{enabled:this.sanitize(["settings","queue","users","enabled"],e.settings.queue.users.enabled),order:this.sanitize(["settings","queue","users","order"],e.settings.queue.users.order)},watchlist:{enabled:this.sanitize(["settings","queue","watchlist","enabled"],e.settings.queue.watchlist.enabled),order:this.sanitize(["settings","queue","watchlist","order"],e.settings.queue.watchlist.order)},abuselog:{enabled:e.settings.queue.abuselog.enabled,order:e.settings.queue.abuselog.order}},username_highlighting:{enabled:this.sanitize(["settings","username_highlighting","enabled"],e.settings.username_highlighting.enabled),fuzzy:this.sanitize(["settings","username_highlighting","fuzzy"],e.settings.username_highlighting.fuzzy)},wikipedia_popups:{enabled:e.settings.wikipedia_popups.enabled},auto_welcome:{enabled:this.sanitize(["settings","auto_welcome","enabled"],e.settings.auto_welcome.enabled)},talk_page_thanks_for_temporary_users:{enabled:e.settings.talk_page_thanks_for_temporary_users.enabled},expiry:{watchlist:this.sanitize(["settings","expiry","watchlist"],e.settings.expiry.watchlist,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),whitelist:{users:this.sanitize(["settings","expiry","whitelist","users"],e.settings.expiry.whitelist.users,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),pages:this.sanitize(["settings","expiry","whitelist","pages"],e.settings.expiry.whitelist.pages,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),tags:this.sanitize(["settings","expiry","whitelist","tags"],e.settings.expiry.whitelist.tags,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e]))},highlight:{users:this.sanitize(["settings","expiry","highlight","users"],e.settings.expiry.highlight.users,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),pages:this.sanitize(["settings","expiry","highlight","pages"],e.settings.expiry.highlight.pages,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e])),tags:this.sanitize(["settings","expiry","highlight","tags"],e.settings.expiry.highlight.tags,e=>({none:"","1 hour":"1h","1 day":"1D","1 week":"1W","1 month":"1M","3 months":"3M","6 months":"6M",indefinite:"infinity"}[e]))}},auto_report:{enabled:this.sanitize(["settings","auto_report","enabled"],e.settings.auto_report.enabled),for:this.sanitize(["settings","auto_report","for"],e.settings.auto_report.for,e=>{if(!Array.isArray(e))return;const t=new Set(["Attempt"]);return e.forEach(e=>t.add(e)),[...t]})},AI:{enabled:this.sanitize(["settings","AI","enabled"],e.settings.AI.enabled),provider:this.sanitize(["settings","AI","provider"],e.settings.AI.provider),edit_analysis:{enabled:this.sanitize(["settings","AI","edit_analysis","enabled"],e.settings.AI.edit_analysis.enabled)},username_analysis:{enabled:this.sanitize(["settings","AI","username_analysis","enabled"],e.settings.AI.username_analysis.enabled)},Ollama:{server:this.sanitize(["settings","AI","Ollama","server"],e.settings.AI.Ollama.server),model:this.sanitize(["settings","AI","Ollama","model"],e.settings.AI.Ollama.model)}},audio:{ores_alert:{enabled:this.sanitize(["settings","audio","ores_alert","enabled"],e.settings.audio.ores_alert.enabled),threshold:this.sanitize(["settings","audio","ores_alert","threshold"],e.settings.audio.ores_alert.threshold)},volume:{master:this.sanitize(["settings","audio","volume","master"],e.settings.audio.volume.master),"master.startup":this.sanitize(["settings","audio","volume","master.startup"],e.settings.audio.volume["master.startup"]),"master.music":this.sanitize(["settings","audio","volume","master.music"],e.settings.audio.volume["master.music"]),"master.music.zen_mode":this.sanitize(["settings","audio","volume","master.music.zen_mode"],e.settings.audio.volume["master.music.zen_mode"]),"master.ui":this.sanitize(["settings","audio","volume","master.ui"],e.settings.audio.volume["master.ui"]),"master.ui.click":this.sanitize(["settings","audio","volume","master.ui.click"],e.settings.audio.volume["master.ui.click"]),"master.queue":this.sanitize(["settings","audio","volume","master.queue"],e.settings.audio.volume["master.queue"]),"master.queue.ores":this.sanitize(["settings","audio","volume","master.queue.ores"],e.settings.audio.volume["master.queue.ores"]),"master.queue.mention":this.sanitize(["settings","audio","volume","master.queue.mention"],e.settings.audio.volume["master.queue.mention"]),"master.notification":this.sanitize(["settings","audio","volume","master.notification"],e.settings.audio.volume["master.notification"]),"master.notification.alert":this.sanitize(["settings","audio","volume","master.notification.alert"],e.settings.audio.volume["master.notification.alert"]),"master.notification.message":this.sanitize(["settings","audio","volume","master.notification.notice"],e.settings.audio.volume["master.notification.message"]),"master.notification.toast":this.sanitize(["settings","audio","volume","master.notification.toast"],e.settings.audio.volume["master.notification.toast"]),"master.action":this.sanitize(["settings","audio","volume","master.action"],e.settings.audio.volume["master.action"]),"master.action.default":this.sanitize(["settings","audio","volume","master.action.default"],e.settings.audio.volume["master.action.default"]),"master.action.failed":this.sanitize(["settings","audio","volume","master.action.failed"],e.settings.audio.volume["master.action.failed"]),"master.action.report":this.sanitize(["settings","audio","volume","master.action.report"],e.settings.audio.volume["master.action.report"]),"master.action.block":this.sanitize(["settings","audio","volume","master.action.block"],e.settings.audio.volume["master.action.block"]),"master.action.protect":this.sanitize(["settings","audio","volume","master.action.protect"],e.settings.audio.volume["master.action.protect"])}},zen_mode:{enabled:this.sanitize(["settings","zen_mode","enabled"],e.settings.zen_mode.enabled),sound:{enabled:this.sanitize(["settings","zen_mode","sound","enabled"],e.settings.zen_mode.sound.enabled)},music:{enabled:this.sanitize(["settings","zen_mode","music","enabled"],e.settings.zen_mode.music.enabled)},alerts:{enabled:this.sanitize(["settings","zen_mode","alerts","enabled"],e.settings.zen_mode.alerts.enabled)},messages:{enabled:this.sanitize(["settings","zen_mode","notices","enabled"],e.settings.zen_mode.messages.enabled)},toasts:{enabled:this.sanitize(["settings","zen_mode","toasts","enabled"],e.settings.zen_mode.toasts.enabled)},badges:{enabled:this.sanitize(["settings","zen_mode","badges","enabled"],e.settings.zen_mode.badges.enabled)}},accessibility:{colorblind:e.settings.accessibility.colorblind,dyslexia:e.settings.accessibility.dyslexia,high_contrast:e.settings.accessibility.high_contrast,reduce_motion:e.settings.accessibility.reduce_motion},repeat_control_scripts:this.sanitize(["settings","repeat_control_scripts"],e.settings.repeat_control_scripts)},UI:{theme:{app:e.UI.theme.app,palette:this.sanitize(["UI","theme","palette"],e.UI.theme.palette,t=>["traffic","heat","natural","cool"][t]||e.UI.theme.palette)},queue:{width:this.sanitize(["UI","queue","width"],e.UI.queue.width)},details:{width:this.sanitize(["UI","details","width"],e.UI.details.width)}},control_scripts:this.sanitize(["control_scripts"],e.control_scripts,e=>{if(Array.isArray(e)){function t(e,...n){return e.filter((e,s)=>{if(s=+s,!(0,o.isObject)(e))return!0;if("if"===e.name||"if not"===e.name){var i,a;const r="if not"===e.name,o=()=>e.name=r?"if":"if not";switch("string"==typeof e.condition&&(e.condition={name:e.condition,params:{}}),null!==(a=(i=e.condition).params)&&void 0!==a||(i.params={}),e.condition.name){case"operatorNonAdmin":o();case"operatorAdmin":e.condition.name="account-admin";break;case"userIsHighlighted":e.condition.name="username-highlighted";break;case"userIsWhitelisted":e.condition.name="username-whitelisted";break;case"pageIsWhitelisted":e.condition.name="page-whitelisted";break;case"userIsAnon":o();case"userIsRegistered":e.codition.name="user-registered";break;case"userIsIP":e.condition.name="user-ip";break;case"userIsTemp":e.condition.name="user-temp";break;case"userHasEmptyTalkPage":e.condition.name="user-empty-talk";break;case"editIsMajor":o();case"editIsMinor":e.condition.name="edit-minor";break;case"editSizeNegative":e.condition.name="edit-size",e.condition.params={condition:"<",size:0};break;case"editSizePositive":e.condition.name="edit-size",e.condition.params={condition:">",size:0};break;case"editSizeLarge":e.condition.name="abs-edit-size",e.condition.params={condition:"≥",size:1e3};break;case"userEditCountLow":e.condition.name="user-edit-count",e.condition.params={condition:"<",count:10};break;case"userEditCountHigh":e.condition.name="user-edit-count",e.condition.params={condition:"≥",count:100};break;case"atFinalWarning":e.condition.name="user-final-warning";break;case"userNoWarnings":o();case"userHasWarnings":e.condition.name="user-has-warnings"}if(!(e.condition.name in u.conditions))return!0;if(!Array.isArray(e.actions))return!0;e.actions=t.call(this,e.actions,...n,s,"actions")}else{var r;switch(null!==(r=e.params)&&void 0!==r||(e.params={}),e.name){case"toggleZenMode":e.name="toggle-zen-mode";break;case"acceptFlaggedEdit":if(e.name="accept-pending-edit",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.reason,delete e.params.reason;break;case"rejectFlaggedEdit":if(e.name="reject-pending-edit",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.reason,delete e.params.reason;break;case"prevEdit":e.name="previous-item";break;case"nextEdit":e.name="next-item";break;case"deleteQueue":e.name="clear-queue";break;case"openRevertMenu":e.name="open-revert-menu";break;case"openWarnMenu":e.name="open-warn-menu";break;case"openUserPage":e.name="open-user-page";break;case"openUserTalk":e.name="open-user-talk";break;case"openUserContribs":e.name="open-user-contributions";break;case"openFilterLog":e.name="open-user-filter-log";break;case"openPage":e.name="open-page";break;case"openTalk":e.name="open-page-talk";break;case"openHistory":e.name="open-page-history";break;case"openRevision":e.name="open-revision";break;case"openDiff":e.name="open-diff";break;case"switchToRecentQueue":e.name="switch-to-recent-queue";break;case"switchToFlaggedQueue":e.name="switch-to-pending-queue";break;case"switchToUsersQueue":e.name="switch-to-users-queue";break;case"switchToWatchlistQueue":e.name="switch-to-watchlist-queue";break;case"watchPage":e.name="watch-page";break;case"unwatchPage":e.name="unwatch-page";break;case"whitelistUser":e.name="whitelist-user";break;case"whitelistPage":e.name="whitelist-page";break;case"unwhitelistUser":e.name="unwhitelist-user";break;case"unwhitelistPage":e.name="unwhitelist-page";break;case"highlightUser":e.name="highlight-user";break;case"highlightPage":e.name="highlight-page";break;case"unwhitelistUser":e.name="unhighlight-user";break;case"unwhitelistPage":e.name="unhighlight-page";break;case"thankUser":e.name="thank-user";break;case"warn":e.name="warn-user";break;case"rollback":if(e.name="rollback-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"rollbackGoodFaith":if(e.name="rollback-goodfaith-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"undo":if(e.name="undo-edit",!(0,o.isObject)(e.params))return!0;e.params.hide_username="No";break;case"reportToAIV":if(e.name="report-user-to-aiv",!(0,o.isObject)(e.params))return!0;e.params.reason=e.params.reportMessage,delete e.params.reportMessage,e.params.summary=e.params.comment,delete e.params.comment;break;case"reportToUAA":if(e.name="report-user-to-uaa",!(0,o.isObject)(e.params))return!0;e.params.reason=e.params.reportMessage,delete e.params.reportMessage,e.params.summary=e.params.comment,delete e.params.comment;break;case"requestProtection":if(e.name="request-page-protection",!(0,o.isObject)(e.params))return!0;e.params.summary=e.params.comment,delete e.params.comment;break;case"welcome":e.name="welcome-user";break;case"toggleConsecutive":e.name="toggle-consecutive-edits";break;case"block":return this.loadedLogger.warn(`Skipping deprecated action 'block' in control script at ${[...n,s].join(" -> ")}.`),!1;case"protect":return this.loadedLogger.warn(`Skipping deprecated action 'protect' in control script at ${[...n,s].join(" -> ")}.`),!1;case"openSettings":return this.loadedLogger.warn(`Skipping deprecated action 'openSettings' in control script at ${[...n,s].join(" -> ")}.`),!1}}return!0})}return e.forEach((e,n)=>{n=+n,(0,o.isObject)(e)&&Array.isArray(e.keys)&&Array.isArray(e.actions)&&(e.actions=t.call(this,e.actions,"control_scripts",n,"actions"))}),e}}),statistics:{edits_reviewed:{total:this.sanitize(["statistics","edits_reviewed","total"],e.statistics.edits_reviewed.total),thanked:this.sanitize(["statistics","edits_reviewed","thanked"],e.statistics.edits_reviewed.thanked)},recent_changes_reviewed:{total:this.sanitize(["statistics","recent_changes_reviewed","total"],e.statistics.recent_changes_reviewed.total)},pending_changes_reviewed:{total:this.sanitize(["statistics","pending_changes_reviewed","total"],e.statistics.pending_changes_reviewed.total),accepted:this.sanitize(["statistics","pending_changes_reviewed","accepted"],e.statistics.pending_changes_reviewed.accepted),rejected:this.sanitize(["statistics","pending_changes_reviewed","rejected"],e.statistics.pending_changes_reviewed.rejected)},watchlist_changes_reviewed:{total:this.sanitize(["statistics","watchlist_changes_reviewed","total"],e.statistics.watchlist_changes_reviewed.total)},users_reviewed:{total:this.sanitize(["statistics","users_reviewed","total"],e.statistics.users_reviewed.total)},abuselogs_reviewed:{total:e.statistics.abuselogs_reviewed.total},reverts_made:{total:this.sanitize(["statistics","reverts_made","total"],e.statistics.reverts_made.total),good_faith:this.sanitize(["statistics","reverts_made","good_faith"],e.statistics.reverts_made.good_faith),from_recent_changes:this.sanitize(["statistics","reverts_made","from_recent_changes"],e.statistics.reverts_made.from_recent_changes),from_pending_changes:this.sanitize(["statistics","reverts_made","from_pending_changes"],e.statistics.reverts_made.from_pending_changes),from_watchlist:this.sanitize(["statistics","reverts_made","from_watchlist"],e.statistics.reverts_made.from_watchlist),from_abuselogs:e.statistics.reverts_made.from_abuselogs,from_loaded_edits:this.sanitize(["statistics","reverts_made","from_loaded_edits"],e.statistics.reverts_made.from_loaded_edits)},users_welcomed:{total:this.sanitize(["statistics","users_welcomed","total"],e.statistics.users_welcomed.total)},warnings_issued:{total:this.sanitize(["statistics","warnings_issued","total"],e.statistics.warnings_issued.total),level_1:this.sanitize(["statistics","warnings_issued","level_1"],e.statistics.warnings_issued.level_1),level_2:this.sanitize(["statistics","warnings_issued","level_2"],e.statistics.warnings_issued.level_2),level_3:this.sanitize(["statistics","warnings_issued","level_3"],e.statistics.warnings_issued.level_3),level_4:this.sanitize(["statistics","warnings_issued","level_4"],e.statistics.warnings_issued.level_4),level_4im:this.sanitize(["statistics","warnings_issued","level_4im"],e.statistics.warnings_issued.level_4im)},reports_filed:{total:this.sanitize(["statistics","reports_filed","total"],e.statistics.reports_filed.total),AIV:this.sanitize(["statistics","reports_filed","AIV"],e.statistics.reports_filed.AIV),UAA:this.sanitize(["statistics","reports_filed","UAA"],e.statistics.reports_filed.UAA),RFPP:this.sanitize(["statistics","reports_filed","RFPP"],e.statistics.reports_filed.RFPP),global_blocks:e.statistics.reports_filed.global_blocks,global_locks:e.statistics.reports_filed.global_locks},watchlist:{watched:this.sanitize(["statistics","watchlist","watched"],e.statistics.watchlist.watched),unwatched:this.sanitize(["statistics","watchlist","unwatched"],e.statistics.watchlist.unwatched)},items_whitelisted:{total:this.sanitize(["statistics","items_whitelisted","total"],e.statistics.items_whitelisted.total),users:this.sanitize(["statistics","items_whitelisted","users"],e.statistics.items_whitelisted.users),pages:this.sanitize(["statistics","items_whitelisted","pages"],e.statistics.items_whitelisted.pages),tags:this.sanitize(["statistics","items_whitelisted","tags"],e.statistics.items_whitelisted.tags)},items_highlighted:{total:this.sanitize(["statistics","items_highlighted","total"],e.statistics.items_highlighted.total),users:this.sanitize(["statistics","items_highlighted","users"],e.statistics.items_highlighted.users),pages:this.sanitize(["statistics","items_highlighted","pages"],e.statistics.items_highlighted.pages),tags:this.sanitize(["statistics","items_highlighted","tags"],e.statistics.items_highlighted.tags)},blocks_issued:{total:this.sanitize(["statistics","blocks_issued","total"],e.statistics.blocks_issued.total)},pages_protected:{total:this.sanitize(["statistics","pages_protected","total"],e.statistics.pages_protected.total)},actions_executed:{total:this.sanitize(["statistics","actions_executed","total"],e.statistics.actions_executed.total),successful:this.sanitize(["statistics","actions_executed","successful"],e.statistics.actions_executed.successful)},session_time:this.sanitize(["statistics","session_time"],e.statistics.session_time)},highlight:{users:this.sanitize(["highlight","users"],e.highlight.users),pages:this.sanitize(["highlight","pages"],e.highlight.pages),tags:this.sanitize(["highlight","tags"],e.highlight.tags)},whitelist:{users:this.sanitize(["whitelist","users"],e.whitelist.users),pages:this.sanitize(["whitelist","pages"],e.whitelist.pages),tags:this.sanitize(["whitelist","tags"],e.whitelist.tags)},favorite:{warnings:this.sanitize(["favorite","warnings"],e.favorite.warnings),reverts:this.sanitize(["favorite","reverts"],e.favorite.reverts)}}}static validate(){var e;const t=this.loadedData;if(this.restrictObject(t),(null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;"string"!=typeof t.changelog&&this.reset("changelog");{const s=t.settings;this.restrictObject(s,"settings");{const i=t.settings.performance;this.restrictObject(i,"settings","performance");{const a=new Set(["always_off","adaptive","always_on"]),r=t.settings.performance.startup;a.has(r)||this.reset("settings","performance","startup")}}{const v=t.settings.namespaces;Array.isArray(v)||this.reset("settings","namespaces"),t.settings.namespaces=[...new Set(t.settings.namespaces)].filter(e=>{const t=l.namespaces.some(t=>t.id===e);return t||this.loadedLogger.warn(`Removing invalid namespace ID [ ${e} ] from stored data.`),t})}{const f=t.settings.queue;this.restrictObject(f,"settings","queue");{const b=t.settings.queue.max_size;"number"==typeof b&&Number.isInteger(b)&&b>0||this.reset("settings","queue","max_size")}{const w=t.settings.queue.max_edits;"number"==typeof w&&Number.isInteger(w)&&w>0||this.reset("settings","queue","max_edits")}{const y=t.settings.queue.min_ores;"number"==typeof y&&y>=0&&y<=1||this.reset("settings","queue","min_ores")}{const x=t.settings.queue.ores_bias;"number"==typeof x&&x>=0&&x<=1||this.reset("settings","queue","ores_bias")}["recent","pending","users","watchlist","abuselog"].forEach((e,n,s)=>{{const n=t.settings.queue[e];this.restrictObject(n,"settings","queue",e);"boolean"!=typeof t.settings.queue[e].enabled&&this.reset("settings","queue",e,"enabled");{const n=t.settings.queue[e].order;"number"==typeof n&&Number.isInteger(n)&&n>=0&&n<s.length||this.reset("settings","queue",e,"order")}}})}{const k=t.settings.username_highlighting;this.restrictObject(k,"settings","username_highlighting");"boolean"!=typeof t.settings.username_highlighting.enabled&&this.reset("settings","username_highlighting","enabled");"boolean"!=typeof t.settings.username_highlighting.fuzzy&&this.reset("settings","username_highlighting","fuzzy")}{const _=t.settings.wikipedia_popups;this.restrictObject(_,"settings","wikipedia_popups");"boolean"!=typeof t.settings.wikipedia_popups.enabled&&this.reset("settings","wikipedia_popups","enabled")}{const S=t.settings.auto_welcome;this.restrictObject(S,"settings","auto_welcome");"boolean"!=typeof t.settings.auto_welcome.enabled&&this.reset("settings","auto_welcome","enabled")}{const q=t.settings.talk_page_thanks_for_temporary_users;this.restrictObject(q,"settings","talk_page_thanks_for_temporary_users");"boolean"!=typeof t.settings.talk_page_thanks_for_temporary_users.enabled&&this.reset("settings","talk_page_thanks_for_temporary_users","enabled")}{const E=t.settings.expiry;this.restrictObject(E,"settings","expiry");{const L=t.settings.expiry.watchlist;g.expiryRegex.test(L)||this.reset("settings","expiry","watchlist")}{const A=t.settings.expiry.whitelist;this.restrictObject(A,"settings","expiry","whitelist");{const T=t.settings.expiry.whitelist.users;g.expiryRegex.test(T)||this.reset("settings","expiry","whitelist","users")}{const C=t.settings.expiry.whitelist.pages;g.expiryRegex.test(C)||this.reset("settings","expiry","whitelist","pages")}{const z=t.settings.expiry.whitelist.tags;g.expiryRegex.test(z)||this.reset("settings","expiry","whitelist","tags")}}{const M=t.settings.expiry.highlight;this.restrictObject(M,"settings","expiry","highlight");{const $=t.settings.expiry.highlight.users;g.expiryRegex.test($)||this.reset("settings","expiry","highlight","users")}{const O=t.settings.expiry.highlight.pages;g.expiryRegex.test(O)||this.reset("settings","expiry","highlight","pages")}{const I=t.settings.expiry.highlight.tags;g.expiryRegex.test(I)||this.reset("settings","expiry","highlight","tags")}}}{const P=t.settings.auto_report;this.restrictObject(P,"settings","auto_report");"boolean"!=typeof t.settings.auto_report.enabled&&this.reset("settings","auto_report","enabled");{const j=t.settings.auto_report.for;Array.isArray(j)||this.reset("settings","auto_report","for"),t.settings.auto_report.for=[...new Set(t.settings.auto_report.for)].filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid auto-report reason [ ${e} ] from stored data.`),t})}}{const W=t.settings.AI;this.restrictObject(W,"settings","AI");"boolean"!=typeof t.settings.AI.enabled&&this.reset("settings","AI","enabled");"Ollama"!==t.settings.AI.provider&&this.reset("settings","AI","provider");{const D=t.settings.AI.edit_analysis;this.restrictObject(D,"settings","AI","edit_analysis");"boolean"!=typeof t.settings.AI.edit_analysis.enabled&&this.reset("settings","AI","edit_analysis","enabled")}{const R=t.settings.AI.username_analysis;this.restrictObject(R,"settings","AI","username_analysis");"boolean"!=typeof t.settings.AI.username_analysis.enabled&&this.reset("settings","AI","username_analysis","enabled")}{const U=t.settings.AI.Ollama;this.restrictObject(U,"settings","AI","Ollama");{const N=t.settings.AI.Ollama.server;(0,o.isURL)(N)||this.reset("settings","AI","Ollama","server")}"string"!=typeof t.settings.AI.Ollama.model&&this.reset("settings","AI","Ollama","model")}}{const H=t.settings.audio;this.restrictObject(H,"settings","audio");{const F=t.settings.audio.ores_alert;this.restrictObject(F,"settings","audio","ores_alert");"boolean"!=typeof t.settings.audio.ores_alert.enabled&&this.reset("settings","audio","ores_alert","enabled");{const V=t.settings.audio.ores_alert.threshold;"number"==typeof V&&V>=0&&V<=1||this.reset("settings","audio","ores_alert","threshold")}}{const B=t.settings.audio.volume;this.restrictObject(B,"settings","audio","volume");const G=["master","master.startup","master.music","master.music.zen_mode","master.ui","master.ui.click","master.queue","master.queue.ores","master.queue.mention","master.notification","master.notification.alert","master.notification.message","master.notification.toast","master.action","master.action.default","master.action.failed","master.action.report","master.action.block","master.action.protect"];for(const Q of G){const Y=t.settings.audio.volume[Q];"number"==typeof Y&&Y>=0&&Y<=1||this.reset("settings","audio","volume",Q)}}}{const Z=t.settings.zen_mode;this.restrictObject(Z,"settings","zen_mode");"boolean"!=typeof Z.enabled&&this.reset("settings","zen_mode","enabled");{const K=t.settings.zen_mode.sound;this.restrictObject(K,"settings","zen_mode","sound");"boolean"!=typeof t.settings.zen_mode.sound.enabled&&this.reset("settings","zen_mode","sound","enabled")}{const X=t.settings.zen_mode.music;this.restrictObject(X,"settings","zen_mode","music");"boolean"!=typeof t.settings.zen_mode.music.enabled&&this.reset("settings","zen_mode","music","enabled")}{const J=t.settings.zen_mode.alerts;this.restrictObject(J,"settings","zen_mode","alerts");"boolean"!=typeof t.settings.zen_mode.alerts.enabled&&this.reset("settings","zen_mode","alerts","enabled")}{const ee=t.settings.zen_mode.messages;this.restrictObject(ee,"settings","zen_mode","messages");"boolean"!=typeof t.settings.zen_mode.messages.enabled&&this.reset("settings","zen_mode","messages","enabled")}{const te=t.settings.zen_mode.toasts;this.restrictObject(te,"settings","zen_mode","toasts");"boolean"!=typeof t.settings.zen_mode.toasts.enabled&&this.reset("settings","zen_mode","toasts","enabled")}{const ne=t.settings.zen_mode.badges;this.restrictObject(ne,"settings","zen_mode","badges");"boolean"!=typeof t.settings.zen_mode.badges.enabled&&this.reset("settings","zen_mode","badges","enabled")}}{const se=t.settings.accessibility;this.restrictObject(se,"settings","accessibility");"boolean"!=typeof t.settings.accessibility.colorblind&&this.reset("settings","accessibility","colorblind");"boolean"!=typeof t.settings.accessibility.dyslexia&&this.reset("settings","accessibility","dyslexia");"boolean"!=typeof t.settings.accessibility.high_contrast&&this.reset("settings","accessibility","high_contrast");"boolean"!=typeof t.settings.accessibility.reduce_motion&&this.reset("settings","accessibility","reduce_motion")}"boolean"!=typeof t.settings.repeat_control_scripts&&this.reset("settings","repeat_control_scripts")}{const ie=t.UI;this.restrictObject(ie,"UI");{const ae=t.UI.theme;this.restrictObject(ae,"UI","theme");{const re=t.UI.theme.app;["light","dark","auto"].includes(re)||this.reset("UI","theme","app")}t.UI.theme.palette in m.GUI.palettes||this.reset("UI","theme","palette")}{const oe=t.UI.queue;this.restrictObject(oe,"UI","queue");{const le=t.UI.queue.width;"string"==typeof le&&le.endsWith("vw")||this.reset("UI","queue","width");const de=parseFloat(le.slice(0,-2));"number"==typeof de&&!isNaN(de)&&de>=10&&de<=30||this.reset("UI","queue","width")}}{const ce=t.UI.details;this.restrictObject(ce,"UI","details");{const ue=t.UI.details.width;"string"==typeof ue&&ue.endsWith("vw")||this.reset("UI","details","width");const pe=parseFloat(ue.slice(0,-2));"number"==typeof pe&&!isNaN(pe)&&pe>=10&&pe<=30||this.reset("UI","details","width")}}}{const ge=t.control_scripts;function he(e,...t){return e.filter((e,n)=>{var s;if(n=+n,!(0,o.isObject)(e))return null!==(s=void this.loadedLogger.warn(`Removing invalid action at path [ ${[...t,n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s;if("if"===e.name||"if not"===e.name){var i,a,r,l;const s=e.condition;if(!(s.name in u.conditions))return null!==(i=void this.loadedLogger.warn(`Removing invalid condition [ ${s.name} ] at path [ ${[...t,n,"condition"].join(" -> ")} ] from stored data.`))&&void 0!==i&&i;Array.isArray(e.actions)||(this.loadedLogger.warn(`Resetting invalid actions array at path [ ${[...t,n,"actions"].join(" -> ")} ] in stored data.`),e.actions=[]);const o=(0,h.sortDependencies)(null!==(a=null===(r=(l=u.conditions[s.name]).parameters)||void 0===r?void 0:r.call(l))&&void 0!==a?a:[]),c=new Set;for(const e of o){const i={};for(const t of null!==(d=e.dependencies)&&void 0!==d?d:[]){var d;i[t]=s.params[t]}const a="function"==typeof e.default?e.default(i):e.default;if(e.id in s.params||"default"in e&&(this.loadedLogger.warn(`Resetting missing parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a),c.add(e.id),"default"in e)switch(e.type){case"choice":("function"==typeof e.options?e.options(i):e.options).includes(s.params[e.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"text":"string"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid text parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"boolean":"boolean"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a);break;case"number":"number"!=typeof s.params[e.id]&&(this.loadedLogger.warn(`Resetting invalid number parameter [ ${e.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),s.params[e.id]=a)}}for(const e of Object.keys(s.params))c.has(e)||(this.loadedLogger.warn(`Removing invalid parameter [ ${e} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete s.params[e]);e.actions=he.call(this,e.actions,...t,n,"actions")}else{var p,m,v,f;if(!(e.name in c.events))return null!==(p=void this.loadedLogger.warn(`Removing invalid action [ ${e.name} ] at path [ ${[...t,n,"name"].join(" -> ")} ] from stored data.`))&&void 0!==p&&p;(0,o.isObject)(e.params)||(this.loadedLogger.warn(`Resetting invalid params object at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params={});const s=(0,h.sortDependencies)(null!==(m=null===(v=(f=c.events[e.name]).parameters)||void 0===v?void 0:v.call(f))&&void 0!==m?m:[]),i=new Set;for(const a of s){const s={};for(const t of null!==(b=a.dependencies)&&void 0!==b?b:[]){var b;s[t]=e.params[t]}const r="function"==typeof a.default?a.default(s):a.default;if(a.id in e.params||"default"in a&&(this.loadedLogger.warn(`Resetting missing parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r),i.add(a.id),"default"in a)switch(a.type){case"choice":("function"==typeof a.options?a.options(s):a.options).includes(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid choice parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"text":"string"!=typeof e.params[a.id]&&(this.loadedLogger.warn(`Resetting invalid text parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"boolean":"boolean"!=typeof e.params[a.id]&&(this.loadedLogger.warn(`Resetting invalid boolean parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r);break;case"duration":"string"==typeof e.params[a.id]&&g.expiryRegex.test(e.params[a.id])||(this.loadedLogger.warn(`Resetting invalid duration parameter [ ${a.id} ] at path [ ${[...t,n,"params"].join(" -> ")} ] in stored data.`),e.params[a.id]=r)}}for(const s of Object.keys(e.params))i.has(s)||(this.loadedLogger.warn(`Removing invalid parameter [ ${s} ] at path [ ${[...t,n,"params"].join(" -> ")} ] from stored data.`),delete e.params[s])}return!0})}Array.isArray(ge)||this.reset("control_scripts"),t.control_scripts=t.control_scripts.filter((e,n)=>{var s;return n=+n,(0,o.isObject)(e)?(Array.isArray(e.keys)||(this.loadedLogger.warn(`Removing invalid keys array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].keys=[]),Array.isArray(e.actions)||(this.loadedLogger.warn(`Removing invalid actions array from control script at index [ ${n} ] in stored data.`),t.control_scripts[n].actions=[]),t.control_scripts[n].keys=e.keys.filter(e=>(0,p.validateShortcut)(e)),t.control_scripts[n].actions=he.call(this,e.actions,"control_scripts",n,"actions"),!0):null!==(s=void this.loadedLogger.warn(`Removing invalid control script at path [ ${["control_scripts",n].join(" -> ")} ] from stored data.`))&&void 0!==s&&s})}{const me=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0,ve=t.statistics;this.restrictObject(ve,"statistics");{const fe=t.statistics.edits_reviewed;this.restrictObject(fe,"statistics","edits_reviewed");me(t.statistics.edits_reviewed.total)||this.reset("statistics","edits_reviewed","total");me(t.statistics.edits_reviewed.thanked)||this.reset("statistics","edits_reviewed","thanked")}{const be=t.statistics.recent_changes_reviewed;this.restrictObject(be,"statistics","recent_changes_reviewed");me(t.statistics.recent_changes_reviewed.total)||this.reset("statistics","recent_changes_reviewed","total")}{const we=t.statistics.pending_changes_reviewed;this.restrictObject(we,"statistics","pending_changes_reviewed");me(t.statistics.pending_changes_reviewed.total)||this.reset("statistics","pending_changes_reviewed","total");me(t.statistics.pending_changes_reviewed.accepted)||this.reset("statistics","pending_changes_reviewed","accepted");me(t.statistics.pending_changes_reviewed.rejected)||this.reset("statistics","pending_changes_reviewed","rejected")}{const ye=t.statistics.watchlist_changes_reviewed;this.restrictObject(ye,"statistics","watchlist_changes_reviewed");me(t.statistics.watchlist_changes_reviewed.total)||this.reset("statistics","watchlist_changes_reviewed","total")}{const xe=t.statistics.users_reviewed;this.restrictObject(xe,"statistics","users_reviewed");me(t.statistics.users_reviewed.total)||this.reset("statistics","users_reviewed","total")}{const ke=t.statistics.abuselogs_reviewed;this.restrictObject(ke,"statistics","abuselogs_reviewed");me(t.statistics.abuselogs_reviewed.total)||this.reset("statistics","abuselogs_reviewed","total")}{const _e=t.statistics.reverts_made;this.restrictObject(_e,"statistics","reverts_made");me(t.statistics.reverts_made.total)||this.reset("statistics","reverts_made","total");me(t.statistics.reverts_made.good_faith)||this.reset("statistics","reverts_made","good_faith");me(t.statistics.reverts_made.from_recent_changes)||this.reset("statistics","reverts_made","from_recent_changes");me(t.statistics.reverts_made.from_pending_changes)||this.reset("statistics","reverts_made","from_pending_changes");me(t.statistics.reverts_made.from_watchlist)||this.reset("statistics","reverts_made","from_watchlist");me(t.statistics.reverts_made.from_abuselogs)||this.reset("statistics","reverts_made","from_abuselogs");me(t.statistics.reverts_made.from_loaded_edits)||this.reset("statistics","reverts_made","from_loaded_edits")}{const Se=t.statistics.users_welcomed;this.restrictObject(Se,"statistics","users_welcomed");me(t.statistics.users_welcomed.total)||this.reset("statistics","users_welcomed","total")}{const qe=t.statistics.warnings_issued;this.restrictObject(qe,"statistics","warnings_issued");me(t.statistics.warnings_issued.total)||this.reset("statistics","warnings_issued","total");me(t.statistics.warnings_issued.level_1)||this.reset("statistics","warnings_issued","level_1");me(t.statistics.warnings_issued.level_2)||this.reset("statistics","warnings_issued","level_2");me(t.statistics.warnings_issued.level_3)||this.reset("statistics","warnings_issued","level_3");me(t.statistics.warnings_issued.level_4)||this.reset("statistics","warnings_issued","level_4");me(t.statistics.warnings_issued.level_4im)||this.reset("statistics","warnings_issued","level_4im")}{const Ee=t.statistics.reports_filed;this.restrictObject(Ee,"statistics","reports_filed");me(t.statistics.reports_filed.total)||this.reset("statistics","reports_filed","total");me(t.statistics.reports_filed.AIV)||this.reset("statistics","reports_filed","AIV");me(t.statistics.reports_filed.UAA)||this.reset("statistics","reports_filed","UAA");me(t.statistics.reports_filed.RFPP)||this.reset("statistics","reports_filed","RFPP");me(t.statistics.reports_filed.global_blocks)||this.reset("statistics","reports_filed","global_blocks");me(t.statistics.reports_filed.global_locks)||this.reset("statistics","reports_filed","global_locks")}{const Le=t.statistics.watchlist;this.restrictObject(Le,"statistics","watchlist");me(t.statistics.watchlist.watched)||this.reset("statistics","watchlist","watched");me(t.statistics.watchlist.unwatched)||this.reset("statistics","watchlist","unwatched")}{const Ae=t.statistics.items_whitelisted;this.restrictObject(Ae,"statistics","items_whitelisted");me(t.statistics.items_whitelisted.total)||this.reset("statistics","items_whitelisted","total");me(t.statistics.items_whitelisted.users)||this.reset("statistics","items_whitelisted","users");me(t.statistics.items_whitelisted.pages)||this.reset("statistics","items_whitelisted","pages");me(t.statistics.items_whitelisted.tags)||this.reset("statistics","items_whitelisted","tags")}{const Te=t.statistics.items_highlighted;this.restrictObject(Te,"statistics","items_highlighted");me(t.statistics.items_highlighted.total)||this.reset("statistics","items_highlighted","total");me(t.statistics.items_highlighted.users)||this.reset("statistics","items_highlighted","users");me(t.statistics.items_highlighted.pages)||this.reset("statistics","items_highlighted","pages");me(t.statistics.items_highlighted.tags)||this.reset("statistics","items_highlighted","tags")}{const Ce=t.statistics.actions_executed;this.restrictObject(Ce,"statistics","actions_executed");me(t.statistics.actions_executed.total)||this.reset("statistics","actions_executed","total");me(t.statistics.actions_executed.successful)||this.reset("statistics","actions_executed","successful")}{const ze=t.statistics.session_time;"number"==typeof ze&&ze>=0||this.reset("statistics","session_time")}}const n=e=>{if(!Array.isArray(e)||2!==e.length)return!1;if("string"!=typeof e[0])return!1;{const t=e[1];if(!Array.isArray(t)||2!==t.length)return!1;const n=e=>"number"==typeof e&&Number.isInteger(e)&&e>=0;if(!n(t[0])||!n(t[1]))return!1}return!0};{const Me=t.highlight;this.restrictObject(Me,"highlight");{const $e=t.highlight.users;Array.isArray($e)||this.reset("highlight","users"),t.highlight.users=t.highlight.users.filter(e=>n(e))}{const Oe=t.highlight.pages;Array.isArray(Oe)||this.reset("highlight","pages"),t.highlight.pages=t.highlight.pages.filter(e=>n(e))}{const Ie=t.highlight.tags;Array.isArray(Ie)||this.reset("highlight","tags"),t.highlight.tags=t.highlight.tags.filter(e=>n(e))}}{const Pe=t.whitelist;this.restrictObject(Pe,"whitelist");{const je=t.whitelist.users;Array.isArray(je)||this.reset("whitelist","users"),t.whitelist.users=t.whitelist.users.filter(e=>n(e))}{const We=t.whitelist.pages;Array.isArray(We)||this.reset("whitelist","pages"),t.whitelist.pages=t.whitelist.pages.filter(e=>n(e))}{const De=t.whitelist.tags;Array.isArray(De)||this.reset("whitelist","tags"),t.whitelist.tags=t.whitelist.tags.filter(e=>n(e))}}{const Re=t.favorite;this.restrictObject(Re,"favorite");{const Ue=t.favorite.warnings;Array.isArray(Ue)||this.reset("favorite","warnings"),t.favorite.warnings=t.favorite.warnings.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite warning [ ${e} ] from stored data.`),t})}{const Ne=t.favorite.reverts;Array.isArray(Ne)||this.reset("favorite","reverts"),t.favorite.reverts=t.favorite.reverts.filter(e=>{const t=e in d.warningsLookup;return t||this.loadedLogger.warn(`Removing invalid favorite revert [ ${e} ] from stored data.`),t})}}return!0}static construct(){var e;const t=this.loadedData;return(null==t?void 0:t.version)!==this.number?null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e:(t.settings.auto_report.for=new Set(t.settings.auto_report.for),t.highlight.users=new Map(t.highlight.users),t.highlight.pages=new Map(t.highlight.pages),t.highlight.tags=new Map(t.highlight.tags),t.whitelist.users=new Map(t.whitelist.users),t.whitelist.pages=new Map(t.whitelist.pages),t.whitelist.tags=new Map(t.whitelist.tags),t)}static deconstruct(){var e;const t=this.loadedData;if((null==t?void 0:t.version)!==this.number)return null!==(e=void this.loadedLogger.error(`Stored data version ${null==t?void 0:t.version} does not match expected version ${this.number}.`))&&void 0!==e&&e;t.settings.auto_report.for=[...t.settings.auto_report.for],t.highlight.users=[...t.highlight.users],t.highlight.pages=[...t.highlight.pages],t.highlight.tags=[...t.highlight.tags],t.whitelist.users=[...t.whitelist.users],t.whitelist.pages=[...t.whitelist.pages],t.whitelist.tags=[...t.whitelist.tags];const n=structuredClone(t);return this.construct(),n}},i=s,r=3,(a=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(a="number"))in i?Object.defineProperty(i,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):i[a]=r,s)},955(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.getWarningFromLookup=function(e){return a[e]},t.warningsLookup=t.warnings=t.warningTemplateColors=void 0;t.warningTemplateColors={0:"grey",1:"#4169e1",2:"#ff8c00",3:"#ff4500",4:"#b22222","4im":"#000000"};const n={0:"1",1:"2",2:"3",3:"4",4:"report","4im":"report"},s=t.warnings={Vandalism:{title:"Vandalism",icon:"fas fa-skull-crossbones",description:"Warnings for different types of vandalism.",warnings:[{reportable:!0,queueType:["edit"],title:"Vandalism",name:"vandalism",icon:"fas fa-skull-crossbones",description:"Warning for general vandalism.",summary:"vandalism",auto:n,templates:[{name:"1",template:"uw-vandalism1"},{name:"2",template:"uw-vandalism2"},{name:"3",template:"uw-vandalism3"},{name:"4",template:"uw-vandalism4"},{name:"4im",template:"uw-vandalism4im"}]},{reportable:!0,queueType:["edit"],title:"Subtle vandalism",name:"subtle vandalism",icon:"fas fa-user-secret",description:"Warning for subtle vandalism.",summary:"subtle vandalism",auto:n,templates:[{name:"1",template:"uw-subtle1"},{name:"2",template:"uw-subtle2"},{name:"3",template:"uw-subtle3"},{name:"4",template:"uw-subtle4"}]},{reportable:!0,queueType:["edit"],title:"Image vandalism",name:"image vandalism",icon:"fas fa-image",description:"Warning for image vandalism.",summary:"image vandalism",auto:n,templates:[{name:"1",template:"uw-image1"},{name:"2",template:"uw-image2"},{name:"3",template:"uw-image3"},{name:"4",template:"uw-image4"},{name:"4im",template:"uw-image4im"}]},{reportable:!0,queueType:["edit"],title:"Sandbox",name:"[[WP:BADSAND|inappropriate]] sandbox use",icon:"fas fa-vial",description:"Warning for vandalism, libelous, or defamatory content added to sandbox",summary:"[[WP:BADSAND|inappropriate]] sandbox use",auto:n,templates:[{name:"1",template:"uw-sandbox1"},{name:"2",template:"uw-sandbox2"},{name:"3",template:"uw-sandbox3"},{name:"4",template:"uw-sandbox4"},{name:"4im",template:"uw-sandbox4im"}]},{reportable:!0,queueType:["edit"],title:"Deliberate errors",name:"deliberate errors",icon:"fas fa-bug",description:"Adding deliberate errors to articles.",summary:"deliberate errors",auto:n,templates:[{name:"1",template:"uw-error1"},{name:"2",template:"uw-error2"},{name:"3",template:"uw-error3"},{name:"4",template:"uw-error4"}]}]},Disruption:{title:"Disruption",icon:"fas fa-exclamation",description:"Warnings for different types of disruptive behavior.",warnings:[{reportable:!0,queueType:["edit"],title:"Disruptive editing",name:"[[WP:DE|disruptive editing]]",icon:"fas fa-exclamation",description:"Default warning for making disruptive edits but may be good faith.",summary:"[[WP:DE|disruptive editing]]",auto:n,templates:[{name:"1",template:"uw-disruptive1"},{name:"2",template:"uw-disruptive2"},{name:"3",template:"uw-disruptive3"},{name:"4",template:"uw-generic4",generic:"''Disruptive editing. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Editing tests",name:"editing tests",icon:"fas fa-flask",description:"Making test edits on live articles.",summary:"test edits",auto:n,templates:[{name:"1",template:"uw-test1"},{name:"2",template:"uw-test2"},{name:"3",template:"uw-test3"},{name:"4",template:"uw-generic4",generic:"''Test edits. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Commentary",name:"commentary",icon:"fas fa-comment-alt",description:"Adding opinion or commentary to articles.",summary:"commentary / talking in article",auto:n,templates:[{name:"1",template:"uw-talkinarticle1"},{name:"2",template:"uw-talkinarticle2"},{name:"3",template:"uw-talkinarticle3"},{name:"4",template:"uw-generic4",generic:"''Adding commentary to articles. ([[WP:WikiShield|WS]])''"}]},{reportable:!0,queueType:["edit"],title:"Inappropriate jokes",name:"inappropriate humor",icon:"fas fa-grin-squint",description:"Adding inappropriate humor to an article.",summary:"inappropriate humor",auto:n,templates:[{name:"1",template:"uw-joke1"},{name:"2",template:"uw-joke2"},{name:"3",template:"uw-joke3"},{name:"4",template:"uw-joke4"},{name:"4im",template:"uw-joke4im"}]},{reportable:!0,queueType:["edit"],title:"Deleting",name:"unexplained deletion",icon:"fas fa-trash",description:"Used when a user does not explain deletion of part of an article.",summary:"unexplained deletion",auto:n,templates:[{name:"1",template:"uw-delete1"},{name:"2",template:"uw-delete2"},{name:"3",template:"uw-delete3"},{name:"4",template:"uw-delete4"},{name:"4im",template:"uw-delete4im"}]}]},"Content Issues":{title:"Content Issues",icon:"fas fa-file-alt",description:"Warnings for different types of content issues.",warnings:[{reportable:!0,queueType:["edit"],title:"Unsourced",name:"unsourced changes",icon:"fas fa-question",description:"Warning for unsourced content.",summary:"unsourced changes",auto:n,templates:[{name:"1",template:"uw-unsourced1"},{name:"2",template:"uw-unsourced2"},{name:"3",template:"uw-unsourced3"},{name:"4",template:"uw-unsourced4"}]},{reportable:!0,queueType:["edit"],title:"Unsourced (BLP)",name:"unsourced [[WP:BLP|biographies of living persons']] changes",icon:"fas fa-person-circle-question",description:"Warning for unsourced BLP content.",summary:"unsourced [[WP:BLP|biographies of living persons']] changes",auto:n,templates:[{name:"1",template:"uw-biog1"},{name:"2",template:"uw-biog2"},{name:"3",template:"uw-biog3"},{name:"4",template:"uw-biog4"},{name:"4im",template:"uw-biog4im"}]},{reportable:!0,queueType:["edit"],title:"Unsourced genre",name:"unsourced genre changes",icon:"fas fa-music",description:"Warning for unsourced genre changes.",summary:"unsourced genre changes",auto:n,templates:[{name:"1",template:"uw-genre1"},{name:"2",template:"uw-genre2"},{name:"3",template:"uw-genre3"},{name:"4",template:"uw-genre4"}]},{reportable:!0,queueType:["edit"],title:"Original research",name:"[[WP:OR|original research]]",icon:"fas fa-lightbulb",description:"Adding original research or synthesis.",summary:"[[WP:OR|original research]]",auto:n,templates:[{name:"1",template:"uw-nor1"},{name:"2",template:"uw-nor2"},{name:"3",template:"uw-nor3"},{name:"4",template:"uw-nor4"}]},{reportable:!0,queueType:["edit"],title:"POV",name:"[[WP:NPOV|non-neutral changes]]",icon:"fas fa-balance-scale-left",description:"Adding content which violates the neutral point of view policy.",summary:"[[WP:NPOV|non-neutral changes]]",auto:n,templates:[{name:"1",template:"uw-npov1"},{name:"2",template:"uw-npov2"},{name:"3",template:"uw-npov3"},{name:"4",template:"uw-npov4"}]},{reportable:!0,queueType:["edit"],title:"Censoring",name:"[[WP:NOTCENSORED|censoring content]]",icon:"fas fa-ban",description:"Censoring topically-relevant content.",summary:"[[WP:NOTCENSORED|censoring content]]",auto:n,templates:[{name:"1",template:"uw-notcensored1"},{name:"2",template:"uw-notcensored2"},{name:"3",template:"uw-notcensored3"},{name:"4",template:"uw-notcensored4"}]},{reportable:!0,queueType:["edit"],title:"AI-generated",name:"[[WP:LLM|AI-generated content]]",icon:"fas fa-robot",description:"Adding AI-generated content.",summary:"[[WP:LLM|AI-generated content]]",auto:n,templates:[{name:"1",template:"uw-ai1"},{name:"2",template:"uw-ai2"},{name:"3",template:"uw-ai3"},{name:"4",template:"uw-ai4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==0}},{reportable:!0,queueType:["edit"],title:"AI-generated (talk)",name:"[[WP:LLM|AI-generated content]] in a discussion",icon:"fas fa-robot",description:"Writing an AI-generated comment.",summary:"[[WP:LLM|AI-generated content]] in a discussion",auto:n,templates:[{name:"1",template:"uw-aitalk1"},{name:"2",template:"uw-aitalk2"},{name:"3",template:"uw-aitalk3"},{name:"4",template:"uw-aitalk4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==1}},{reportable:!0,queueType:["edit"],title:"MOS violation",name:"[[WP:MOS|manual of style]] violation",icon:"fas fa-spell-check",description:"Not following the Manual of Style.",summary:"[[WP:MOS|manual of style]] violation",auto:n,templates:[{name:"1",template:"uw-mos1"},{name:"2",template:"uw-mos2"},{name:"3",template:"uw-mos3"},{name:"4",template:"uw-mos4"}]},{reportable:!1,queueType:["edit"],title:"English variant",name:"[[WP:ENGVAR|different English variant]]",icon:"fas fa-globe",description:"Content added in a different English variant than the rest of the article.",summary:"[[WP:ENGVAR|different English variant]]",auto:"notice",templates:[{name:"notice",template:"uw-engvar"}]},{reportable:!1,queueType:["edit"],title:"Not English",name:"non-English content",icon:"fas fa-language",description:"Content added in a language other than English.",summary:"non-English content",auto:"notice",templates:[{name:"notice",template:"uw-lang-noteng"}]}]},Conduct:{title:"Conduct",icon:"fas fa-user-shield",description:"Warnings for different types of conduct issues.",warnings:[{reportable:!0,queueType:["edit"],title:"Personal attacks",name:"[[WP:NPA|personal attacks]]",icon:"fas fa-bomb",description:"Personal attacks towards another user.",summary:"[[WP:NPA|personal attacks]]",auto:n,templates:[{name:"1",template:"uw-npa1"},{name:"2",template:"uw-npa2"},{name:"3",template:"uw-npa3"},{name:"4",template:"uw-npa4"},{name:"4im",template:"uw-npa4im"}]},{reportable:!0,queueType:["edit"],title:"Harassment",name:"[[WP:HARASS|harassment]]",icon:"fas fa-shield-alt",description:"Harassment of another user.",summary:"[[WP:HARASS|harassment]] of another user",auto:n,templates:[{name:"1",template:"uw-harass1"},{name:"2",template:"uw-harass2"},{name:"3",template:"uw-harass3"},{name:"4",template:"uw-harass4"},{name:"4im",template:"uw-harass4im"}]},{reportable:!0,queueType:["edit"],title:"TPO",name:"[[WP:TPO|removing or editing]] others' posts",icon:"fas fa-hand-paper",description:"Removing or editing others' posts.",summary:"[[WP:TPO|removing or editing]] others' posts",auto:n,templates:[{name:"1",template:"uw-tpo1"},{name:"2",template:"uw-tpo2"},{name:"3",template:"uw-tpo3"},{name:"4",template:"uw-tpo4"},{name:"4im",template:"uw-tpo4im"}]},{reportable:!0,queueType:["edit"],title:"Chatting",name:"inappropriate use of article talk pages",icon:"fas fa-comments",description:"Using article talk pages for inappropriate discussion.",summary:"inappropriate use of article talk pages",auto:n,templates:[{name:"1",template:"uw-chat1"},{name:"2",template:"uw-chat2"},{name:"3",template:"uw-chat3"},{name:"4",template:"uw-chat4"}],show(e){var t;return(null==e||null===(t=e.page)||void 0===t?void 0:t.namespace)%2==1}},{reportable:!0,queueType:["edit"],title:"Owning",name:"assuming [[WP:OWN|ownership of articles]]",icon:"fas fa-user-shield",description:"Assuming ownership of articles.",summary:"assuming [[WP:OWN|ownership of articles]]",auto:n,templates:[{name:"1",template:"uw-own1"},{name:"2",template:"uw-own2"},{name:"3",template:"uw-own3"},{name:"4",template:"uw-own4"}]},{reportable:!0,queueType:["edit"],title:"AfD removal",name:"removing AfD templates or comments",icon:"fas fa-gavel",description:"Removing AfD templates or other users' comments from AfD discussions.",summary:"removing AfD templates or comments",auto:n,templates:[{name:"1",template:"uw-afd1"},{name:"2",template:"uw-afd2"},{name:"3",template:"uw-afd3"},{name:"4",template:"uw-afd4"}]},{reportable:!1,queueType:["edit"],title:"Edit warring",name:"[[WP:EW|edit warring]]",icon:"fas fa-jet-fighter",description:"Engaging in edit warring.",summary:"[[WP:EW|edit warring]]",auto(e){var t;return+(null==e||null===(t=e.user)||void 0===t?void 0:t.edits)<500?"notice":"warning"},templates:[{name:"notice",template:"uw-ew-soft",color:"grey"},{name:"warning",template:"uw-ew",color:"#ff4500"}]},{reportable:!0,queueType:["edit"],title:"Gaming the system",name:"[[WP:GAME|gaming the system]]",icon:"fas fa-chess-knight",description:"Attempting to game Wikipedia's policies or guidelines.",summary:"[[WP:GAME|gaming the system]]",auto:n,templates:[{name:"1",template:"uw-gaming1"},{name:"2",template:"uw-gaming2"},{name:"3",template:"uw-gaming3"},{name:"4",template:"uw-gaming4"},{name:"4im",template:"uw-gaming4im"}]}]},Promotional:{title:"Promotional",icon:"fas fa-bullhorn",description:"Warnings for promotional content.",warnings:[{reportable:!0,queueType:["edit"],title:"Advertising",name:"[[WP:PROMO|advertising or promotion]]",icon:"fas fa-ad",description:"Adding advertising or promotional content.",summary:"[[WP:PROMO|advertising or promotion]]",auto:n,templates:[{name:"1",template:"uw-advert1"},{name:"2",template:"uw-advert2"},{name:"3",template:"uw-advert3"},{name:"4",template:"uw-advert4"},{name:"4im",template:"uw-advert4im"}]},{reportable:!0,queueType:["edit"],title:"Spam links",name:"adding [[WP:ELNO|inappropriate links]]",icon:"fas fa-link",description:"Adding spam or promotional links.",summary:"adding [[WP:ELNO|inappropriate links]]",auto:n,templates:[{name:"1",template:"uw-spam1"},{name:"2",template:"uw-spam2"},{name:"3",template:"uw-spam3"},{name:"4",template:"uw-spam4"},{name:"4im",template:"uw-spam4im"}]},{reportable:!1,queueType:["edit"],title:"COI Edit",name:"editing with a [[WP:COI|conflict of interest]]",icon:"fas fa-user-tie",description:"Editing with a conflict of interest.",summary:"editing with a [[WP:COI|conflict of interest]]",auto:"notice",templates:[{name:"notice",template:"uw-coi"},{name:"warning",template:"uw-coi-warn"},{name:"username",template:"uw-coi-username"}]},{reportable:!1,queueType:["logevent"],title:"COI Log",name:"apparent [[WP:COI|conflict of interest]]",icon:"fas fa-user-tie",description:"Apparent conflict of interest.",summary:"apparent [[WP:COI|conflict of interest]]",auto:"username",templates:[{name:"username",template:"uw-coi-username"}]}]},"Abuse Log":{title:"Abuse Log",icon:"fas fa-shield-virus",description:"Warnings for triggering edit filters.",warnings:[{reportable:!0,queueType:["abuselog"],title:"Attempt",name:"triggering an edit filter",icon:"fas fa-vial",description:"Triggering an edit filter.",auto:n,templates:[{name:"1",template:"uw-attempt1"},{name:"2",template:"uw-attempt2"},{name:"3",template:"uw-attempt3"},{name:"4",template:"uw-attempt4"},{name:"4im",template:"uw-attempt4im"}],show:e=>!Boolean(null==e?void 0:e.revid)}]},"Edit Summary":{title:"Edit Summary",icon:"fas fa-pen-alt",description:"Warnings for inappropriate edit summaries.",warnings:[{reportable:!1,queueType:["edit"],title:"No edit summary",name:"no [[WP:ES|edit summary]] provided",icon:"fas fa-pen-nib",description:"Making an edit without providing an edit summary.",summary:"no [[WP:ES|edit summary]] provided",auto(e){var t;return+(null==e||null===(t=e.user)||void 0===t?void 0:t.edits)<500?"newcomer":"experienced"},templates:[{name:"notice",template:"uw-es"},{name:"experienced",template:"uw-es2"}]},{reportable:!0,queueType:["edit","logevent","abuselog"],title:"Inappropriate edit summary",name:"inappropriate [[WP:ES|edit summary]]",icon:"fas fa-pen-alt",description:"Using an inappropriate edit summary.",summary:"inappropriate [[WP:ES|edit summary]]",auto:n,templates:[{name:"1",template:"uw-bes1"},{name:"2",template:"uw-bes2"},{name:"3",template:"uw-bes3"},{name:"4",template:"uw-bes4"},{name:"4im",template:"uw-bes4im"}]},{reportable:!0,queueType:["edit","logevent","abuselog"],title:"Misleading edit summary",name:"misleading [[WP:ES|edit summary]]",icon:"fas fa-mask",description:"Using a misleading edit summary.",summary:"misleading [[WP:ES|edit summary]]",auto:n,templates:[{name:"1",template:"uw-mislead1"},{name:"2",template:"uw-mislead2"},{name:"3",template:"uw-mislead3"},{name:"4",template:"uw-generic4",generic:"''Misleading edit summary. ([[WP:WikiShield|WS]])''"}]},{reportable:!1,queueType:["edit","abuselog"],title:"Minor edit abuse",name:"improper use of [[WP:ME|minor edit]] checkbox",icon:"fas fa-minus",description:"Non-minor edit marked as minor",summary:"improper use of [[WP:ME|minor edit]] checkbox",auto:"notice",templates:[{name:"notice",template:"uw-minor"}]}]}},i={};for(const[e,t]of Object.entries(s)){const e=t.warnings.length;for(let n=0;n<e;n++){const e=t.warnings[n];i[e.title]=e}}const a=t.warningsLookup=i},863(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.welcomes=void 0;const n=t.welcomes={Auto:{title:"Auto",template:e=>{}},Default:{title:"Default",template:"Welcome",sign:!0},Basic:{title:"Basic",template:"W-basic",sign:!1},"Non-Latin":{title:"Non-Latin",template:"Welcome-non-latin",sign:!0},"Vandalism fighter":{title:"Vandalism fighter",template:"Welcome-vandalism fighter",sign:!1},Personal:{title:"Personal",template:"Welcome-personal",sign:!0},Cookie:{title:"Cookie",template:"Welcome cookie",sign:!0},Kitten:{title:"Kitten",template:"Welcome kitten",sign:!1},Graphical:{title:"Graphical",template:"W-graphical",sign:!1},Screen:{title:"Screen",template:"W-screen",sign:!1},Autobiography:{title:"Autobiography",template:"Welcome-auto",sign:!0},COI:{title:"COI",template:"Welcome-COI",sign:!0}};n.Auto.template=e=>!n["Non-Latin"].hide&&/[^\u0000-\u007F]/.test(e.name)?"Non-Latin":"Default"},4153(e,t,n){var s=n(8878);void 0===window.electron?(window.isElectron=!1,window.electron={mwapiLoader:async()=>{window.dispatchEvent(new CustomEvent("mwapi-loaded",{detail:{server:window.location.host,username:mw.user.getName(),pendingChangesServers:s.MediaWikiAPI.pendingChangesServers,dev:!1}}))},mwapiLoaded:e=>window.addEventListener("mwapi-loaded",t=>{const{server:n,username:s,pendingChangesServers:i,dev:a}=t.detail;e(n,s,i,a)}),mwapi:()=>Promise.reject(new Error("Not running in Electron environment")),menuEnabler:()=>{},setBadgeCount:()=>{},sendNotification:()=>Promise.reject(new Error("Not running in Electron environment")),localStorage:{get:e=>localStorage.getItem(e),set:(e,t)=>localStorage.setItem(e,t),delete:e=>localStorage.removeItem(e)},copyToClipboard:async e=>{if(navigator.clipboard&&navigator.clipboard.writeText)await navigator.clipboard.writeText(e);else{const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}},log:e=>console.debug(e),info:e=>console.info(e),warn:e=>console.warn(e),error:e=>console.error(e),errorbox:(e,t)=>alert(`${e}\n\n${t}`),onOpenBrowser:()=>{},onOpenUrl:()=>{},onOpenNotification:()=>{},onOpenChangelog:()=>{},closePopup:e=>e.close(),openExternal:e=>window.open(e,"_blank"),openInBrowser:async e=>{const t=.8*window.screen.availWidth,n=.8*window.screen.availHeight,s=window.screenX+(window.outerWidth-t)/2,i=window.screenY+(window.outerHeight-n)/2,a=window.open(e,"myPopup",`width=${t},height=${n},left=${s},top=${i},resizable=false,scrollbars=true,menubar=false,toolbar=false,location=false,status=false`);return a.focus(),a.addEventListener("beforeunload",()=>{a.closed&&window.dispatchEvent(new CustomEvent("popup-closed",{detail:a}))}),a},onPopupClosed:e=>window.addEventListener("popup-closed",t=>e(t.detail)),onBeforeunload:()=>{},unloaded:()=>{},saveAccount:()=>{},disable:(e,t)=>{alert(`${e}\n\n${t}`),location.reload()}}):window.isElectron=!0,document.querySelectorAll("[data-electron]").forEach(e=>{"false"===e.dataset.electron&&window.isElectron?e.remove():"true"!==e.dataset.electron||window.isElectron||e.remove()})},7411(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{constructor(){super(),e(this,"handleDragStart",(e,t)=>{this.draggedIndex=e,this.placeholderIndex=e,t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e),requestAnimationFrame(()=>{this.updateDragState()})}),e(this,"handleDragOver",(e,t)=>{if(t.preventDefault(),null===this.draggedIndex||e===this.placeholderIndex)return;const n=[...this.items],s=n[this.draggedIndex];n.splice(this.draggedIndex,1),n.splice(e,0,s),this.items=n,this.draggedIndex=e,this.placeholderIndex=e,this.render()}),e(this,"handleDragEnd",()=>{this.dispatchEvent(new CustomEvent("reorder",{detail:{keys:this.items.map(e=>e.key)},bubbles:!0})),this.draggedIndex=null,this.placeholderIndex=null,this.updateDragState()}),this.items=[],this.draggedIndex=null,this.placeholderIndex=null,this.itemWrappers=[]}connectedCallback(){this.className="draggable-order-list",this.syncItemsFromChildren()}syncItemsFromChildren(){const e=Array.from(this.children);this.items=e.map((e,t)=>({child:e,key:e.dataset.key||e.getAttribute("key")||t})),this.render()}addItem(e,t){this.items.push({child:e,key:t||this.items.length}),this.render()}clearItems(){this.items=[],this.render()}updateDragState(){const e=null!==this.draggedIndex;this.classList.toggle("is-dragging",e),this.itemWrappers.forEach((e,t)=>{e.classList.toggle("dragging",this.draggedIndex===t)})}render(){this.innerHTML="",this.itemWrappers=[],this.items.forEach((e,t)=>{const n=document.createElement("div");n.className="draggable-order-item-wrapper",n.draggable=!0,n.dataset.key=e.key,n.addEventListener("dragstart",e=>this.handleDragStart(t,e)),n.addEventListener("dragover",e=>this.handleDragOver(t,e)),n.addEventListener("dragend",this.handleDragEnd),n.appendChild(e.child.cloneNode?e.child.cloneNode(!0):e.child),this.appendChild(n),this.itemWrappers.push(n)}),this.updateDragState()}}class n extends HTMLElement{static get observedAttributes(){return["name","enabled"]}constructor(){super(),e(this,"handleToggle",e=>{e.stopPropagation(),this._enabled=!this._enabled,this.updateEnabledState(),this.dispatchEvent(new CustomEvent("toggle",{detail:{enabled:this._enabled},bubbles:!0}))}),this._name="",this._enabled=!0}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"name":this._name=n||"",this.nameSpan&&(this.nameSpan.textContent=this._name);break;case"enabled":this._enabled="false"!==n&&"0"!==n,this.updateEnabledState()}}get name(){return this._name}set name(e){this.setAttribute("name",e)}get enabled(){return this._enabled}set enabled(e){this.setAttribute("enabled",e)}updateEnabledState(){this.classList.toggle("disabled",!this._enabled),this.toggle&&(this.toggle.title=this._enabled?"Click to disable":"Click to enable")}render(){this.className="draggable-order-item",this.innerHTML="",this.nameSpan=document.createElement("span"),this.nameSpan.className="draggable-order-item-name",this.nameSpan.textContent=this._name,this.toggle=document.createElement("div"),this.toggle.className="draggable-order-item-toggle",this.toggle.addEventListener("click",this.handleToggle),this.appendChild(this.nameSpan),this.appendChild(this.toggle),this.updateEnabledState()}}customElements.define("draggable-order-list",t),customElements.define("draggable-order-item",n)},7732(e,t,n){var s=n(3241);class i extends HTMLElement{constructor(){super(),this.duration={years:0,months:0,weeks:0,days:0,hours:0,minutes:0,seconds:0},this.isInfinite=!1}connectedCallback(){this.render(),this.attachEventListeners()}render(){this.innerHTML=`\n <label class="infinity-label">\n <span>Infinite Duration</span>\n </label>\n <div class="duration-inputs">\n ${[{key:"years",label:"Years"},{key:"months",label:"Months"},{key:"weeks",label:"Weeks"},{key:"days",label:"Days"},{key:"hours",label:"Hours"},{key:"minutes",label:"Minutes"},{key:"seconds",label:"Seconds"}].map(e=>`\n <label>\n <span>${e.label}</span>\n <input\n type="number"\n min="0"\n data-unit="${e.key}"\n value="0"\n step="1"\n placeholder="0"\n />\n </label>\n `).join("")}\n </div>\n `}attachEventListeners(){const e=this.querySelector(".infinity-label");e.addEventListener("click",()=>{this.isInfinite=!this.isInfinite,e.classList.toggle("selected",this.isInfinite),this.dispatchChangeEvent()}),this.querySelectorAll('input[type="number"]').forEach(e=>{e.addEventListener("input",e=>{const t=e.target.dataset.unit;this.duration[t]=parseInt(e.target.value,10)||0,this.dispatchChangeEvent()})})}dispatchChangeEvent(){this.dispatchEvent(new CustomEvent("change",{detail:this.getDurationString(),bubbles:!0}))}get value(){return this.getDurationString()}getDurationString(){if(this.isInfinite)return"infinite";let e="";const t={years:"Y",months:"M",weeks:"W",days:"D",hours:"H",minutes:"M",seconds:"S"};for(const[n,s]of Object.entries(this.duration))s>0&&(e+=`${s}${t[n]}`);return e||"0S"}set value(e){if("infinite"===e||"infinity"===e||"∞"===e){this.isInfinite=!0;const e=this.querySelector(".infinity-label");return void(e&&e.classList.add("selected"))}this.isInfinite=!1;const t=this.querySelector(".infinity-label");t&&t.classList.remove("selected");const n=s.expiryRegex.exec(e);if(n)for(const e of Object.keys(this.duration)){const t=n.groups[e];this.duration[e]=t?parseInt(t,10):0;const s=this.querySelector(`input[data-unit="${e}"]`);s&&(s.value=this.duration[e])}}}customElements.define("duration-input",i)},1914(e,t,n){n(7732),n(2784),n(5155),n(7411),n(1731)},5155(e,t){function n(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.NumericInput=void 0;class s extends HTMLElement{static get observedAttributes(){return["value","min","max","step"]}constructor(){super(),n(this,"handleMinus",()=>{const e=Number(this.inputValue),t=Math.round(100*Math.max(e-this.step,this.min))/100;this.updateValue(t)}),n(this,"handlePlus",()=>{const e=Number(this.inputValue),t=Math.round(100*Math.min(e+this.step,this.max))/100;this.updateValue(t)}),n(this,"handleInputChange",()=>{const e=this.input.value;if(isNaN(Number(e)))return void(this.input.value=this.inputValue);let t=Math.round(100*Math.min(Math.max(Number(e),this.min),this.max))/100;t=this.step>=1?Math.round(t):t,this.updateValue(t)}),n(this,"handleKeyUp",e=>{"enter"===e.key.toLowerCase()&&(this.handleInputChange(),e.target.blur())}),n(this,"handleInput",e=>{this.inputValue=e.target.value}),this.inputValue=0,this._min=-1/0,this._max=1/0,this._step=1}connectedCallback(){this.render(),this.setupEventListeners()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"value":this.inputValue=Number(n)||0,this.input&&(this.input.value=this.inputValue);break;case"min":this._min=Number(null!=n?n:-1/0);break;case"max":this._max=Number(null!=n?n:1/0);break;case"step":this._step=Number(null!=n?n:1)}}get value(){return this.inputValue}set value(e){this.setAttribute("value",e)}get min(){return this._min}get max(){return this._max}get step(){return this._step}updateValue(e){this.inputValue=e,this.input.value=e,this.dispatchEvent(new CustomEvent("change",{detail:{value:e},bubbles:!0}))}setupEventListeners(){this.minusBtn.addEventListener("click",this.handleMinus),this.plusBtn.addEventListener("click",this.handlePlus),this.input.addEventListener("input",this.handleInput),this.input.addEventListener("blur",this.handleInputChange),this.input.addEventListener("keyup",this.handleKeyUp),this.input.addEventListener("wheel",e=>{e.preventDefault(),e.deltaY<0?this.handlePlus():e.deltaY>0&&this.handleMinus()})}render(){this.className="numeric-input-container",this.minusBtn=document.createElement("span"),this.minusBtn.className="fa fa-minus numeric-input-button",this.input=document.createElement("input"),this.input.type="text",this.input.className="numeric-input",this.input.value=this.inputValue,this.input.autocomplete="off",this.plusBtn=document.createElement("span"),this.plusBtn.className="fa fa-plus numeric-input-button",this.appendChild(this.minusBtn),this.appendChild(this.input),this.appendChild(this.plusBtn)}}t.NumericInput=s,customElements.define("numeric-input",s)},2784(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{static get observedAttributes(){return["value","checked"]}constructor(){super(),e(this,"handleClick",()=>{this._value=!this._value,this.updateState(),this.dispatchEvent(new CustomEvent("change",{detail:{value:this._value,checked:this._value},bubbles:!0}))}),this._value=!1}connectedCallback(){this.render(),this.updateState()}attributeChangedCallback(e,t,n){t!==n&&("value"!==e&&"checked"!==e||(this._value="true"===n||"1"===n||""===n,this.updateState()))}get value(){return this._value}set value(e){this._value=!!e,this.setAttribute("value",this._value),this.updateState()}get checked(){return this._value}set checked(e){this.value=e}updateState(){this.classList.toggle("active",this._value)}render(){this.classList.add("settings-toggle"),this.innerHTML="";const e=document.createElement("div");e.className="toggle-switch";const t=document.createElement("div");t.className="toggle-slider",e.appendChild(t),this.appendChild(e),this.addEventListener("click",this.handleClick)}}customElements.define("toggle-input",t)},1731(){function e(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class t extends HTMLElement{static get observedAttributes(){return["title","description","value"]}constructor(){super(),e(this,"handleVolumeChange",e=>{const t=Math.max(0,Math.min(1,parseFloat(e.target.value)));this._value=t,this.slider.value=t,this.input.value=t.toFixed(2),this.dispatchEvent(new CustomEvent("change",{detail:{value:t},bubbles:!0}))}),this._title="",this._description="",this._value=.5,this._sound="",this._preview=null}connectedCallback(){this.render()}attributeChangedCallback(e,t,n){if(t!==n)switch(e){case"title":this._title=n||"",this.titleEl&&(this.titleEl.textContent=this._title);break;case"description":this._description=n||"",this.descEl&&(this.descEl.textContent=this._description);break;case"value":this._value=Math.max(0,Math.min(1,parseFloat(n))),this.slider&&(this.slider.value=this._value),this.input&&(this.input.value=this._value.toFixed(2))}}get title(){return this._title}set title(e){this.setAttribute("title",e)}get value(){return this._value}set value(e){this.setAttribute("value",e)}setPreview(e,t){this._preview={audio:e,path:t},this.render()}render(){this.className="volume-control",this.innerHTML="";const e=document.createElement("div");e.className="volume-control-header";const t=document.createElement("div");if(t.className="volume-control-info",this.titleEl=document.createElement("div"),this.titleEl.className="volume-control-title",this.titleEl.textContent=this._title,this.descEl=document.createElement("div"),this.descEl.className="volume-control-desc",this.descEl.textContent=this._description,t.appendChild(this.titleEl),t.appendChild(this.descEl),e.appendChild(t),this._preview){const t=document.createElement("button");t.className="volume-control-preview",t.title="Preview sound",t.addEventListener("click",()=>{if(t.classList.contains("playing"))return;t.classList.add("playing");const e=t.querySelector("i");e&&(e.className="fa fa-stop");const n=new AbortController;t.onclick=()=>n.abort(),this._preview.audio.stopPreviews(),this._preview.audio.playSound(this._preview.path,n.signal,!0).finally(()=>{t.onclick=null,t.classList.remove("playing"),e&&(e.className="fa fa-play")})});const n=document.createElement("i");n.className="fa fa-play",t.appendChild(n),e.appendChild(t)}this.appendChild(e);const n=document.createElement("div");n.className="volume-control-slider-container",this.slider=document.createElement("input"),this.slider.type="range",this.slider.className="volume-control-slider",this.slider.min="0",this.slider.max="1",this.slider.step="0.01",this.slider.value=this._value,this.slider.autocomplete="off",this.slider.addEventListener("input",this.handleVolumeChange),n.appendChild(this.slider),this.input=document.createElement("input"),this.input.type="number",this.input.className="volume-control-input",this.input.min="0",this.input.max="1",this.input.step="0.01",this.input.value=this._value.toFixed(2),this.input.autocomplete="off",this.input.addEventListener("input",this.handleVolumeChange),n.appendChild(this.input),this.appendChild(n)}}customElements.define("volume-control",t)},8816(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.run=r,n(4153),n(1914);var s=n(7054),i=n(9501),a=n(691);function r(){addEventListener("wheel",e=>{e.target.closest(".no-scroll")||"INPUT"===e.target.tagName&&"number"===e.target.type&&(e.stopPropagation(),e.target.value=Number(e.target.value)+(e.deltaY<0?1:-1),e.target.dispatchEvent(new Event("input")))},{passive:!0}),electron.menuEnabler(),electron.mwapiLoaded(async(e,t,n,r)=>{if(i.StorageManager.okay(null,electron)){var o;document.querySelector("#rollback-needed .request-link").href=null!==(o=await fetch("https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q7765871&props=sitelinks/urls&format=json&origin=*").then(e=>e.json()).then(t=>{var n;return(null===(n=Object.values(t.entities.Q7765871.sitelinks).find(t=>t.url.startsWith(`https://${e}/wiki/`)))||void 0===n?void 0:n.url)||null}).catch(()=>null))&&void 0!==o?o:"https://www.wikidata.org/wiki/Q7765871";const i=new s.WikiShield(e,t,n,r);electron.onOpenBrowser(()=>i.open(null,!1)),electron.onOpenUrl(e=>i.open(e,!1)),electron.onOpenNotification(e=>{const t=new URL(e);if(t.searchParams.has("markasread")){const e=i.notifications.find(null,+t.searchParams.get("markasread"));e&&i.notifications.read(e.type,e.notification)}i.open(e)}),electron.menuEnabler({browser:!0}),i.on("ready",()=>{electron.onBeforeunload(async()=>{await i.save(),electron.unloaded()}),window.addEventListener("beforeunload",async()=>await i.save());const e=new a.Killswitch(i);e.on("kill",()=>{alert("WikiShield has been temporarily disabled. Please contact the development team for more information."),window.close()}),e.on("force-update",()=>{alert("The current version of WikiShield is no longer supported. Please update to the latest version to continue using WikiShield."),window.close()}),e.on("update",()=>{electron.sendNotification({title:"WikiShield Update",body:"A new version of WikiShield is available. Please update to the latest version for the best experience."},"")}),e.on("unsafe",()=>{alert("Could not verify the integrity of WikiShield. Make sure you are connected to the internet. If the problem persists, please contact the development team."),window.close()}),e.on("okay",async()=>{addEventListener("keydown",e=>i.controller(e)),addEventListener("keyup",e=>i.controller(e)),await i.init()},{once:!0}),e.check().then(()=>e.monitor(1e4))},{once:!0})}else alert("An error has occurred with the WikiShield storage system that could lead to data loss. For that reason, WikiShield has been automatically disabled. Please report this immediately to the development team."),window.close()}),electron.mwapiLoader().catch(e=>{alert(`An error occurred while loading the WikiShield API:\n\n${e.stack||e}`),window.close()})}window.isElectron&&r()},317(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AutoScroll=function(){document.querySelectorAll(".auto-scroll").forEach(e=>{e.dataset.autoScrollInitialized||(e.parentElement.addEventListener("wheel",t=>{e.dataset.autoScrollFreeze=750,e.dataset.autoScrollLastTime=performance.now();let n=parseFloat(e.dataset.autoScrollOffset)||0;const s=Math.abs(t.deltaX),i=Math.abs(t.deltaY),a=Math.abs(t.deltaZ),r=s+i+a;if(0===r)return;let o;switch(Math.max(s,i,a)){case s:o=Math.sign(t.deltaX);break;case i:o=Math.sign(t.deltaY);break;case a:o=Math.sign(t.deltaZ)}n+=o*r,e.dataset.autoScrollOffset=n},{passive:!0}),e.dataset.autoScrollInitialized=!0);let t=parseFloat(e.dataset.autoScrollOffset)||0;if("autoScrollFreeze"in e.dataset){const n=parseFloat(e.dataset.autoScrollLastTime)||performance.now(),s=performance.now();t+=s-n,e.dataset.autoScrollOffset=t,e.dataset.autoScrollLastTime=s;const i=parseFloat(e.dataset.autoScrollFreeze);i>0?e.dataset.autoScrollFreeze=i-s+n:(delete e.dataset.autoScrollFreeze,delete e.dataset.autoScrollLastTime)}const s=parseFloat(e.dataset.autoScrollSpeed)||1;let i=parseFloat(e.dataset.autoScrollCarry)||0;i+=s;const a=Math.floor(i);e.dataset.autoScrollCarry=(i-a).toString();let r=e.querySelectorAll(":scope > .auto-scroll-item").length;if(0===r){const t=e.innerHTML;e.innerHTML="";const n=document.createElement("span");n.className="auto-scroll-item",n.innerHTML=t,e.appendChild(n),r=1}const o=e.querySelector(":scope > .auto-scroll-item"),l=getComputedStyle(o),d=o.clientWidth+(parseFloat(l.marginLeft)||0)+(parseFloat(l.marginRight)||0),c=e.clientWidth;if(d<c)return void e.querySelectorAll(":scope > .auto-scroll-item:not(:first-child)").forEach(e=>e.remove());const u=Math.ceil(c/d)+1-r;if(u>0)for(let e=0;e<u;e++){const e=o.cloneNode(!0);o.parentNode.insertBefore(e,o.nextSibling)}else if(u<0){const t=e.querySelectorAll(":scope > .auto-scroll-item");for(let e=0;e<-u;e++){var p;null===(p=t[e])||void 0===p||p.remove()}}const g=(performance.now()-t)/1e3*60*s%d;e.scrollLeft=g;const h=(e,t,n)=>{(async function(e,t,n,s=()=>!0){if(0===t)return Promise.resolve([0,0]);const i=e.scrollLeft,a=i+t,r=performance.now()+n;let o;const l=new Promise(e=>o=e),d=()=>{const l=performance.now(),c=i+Math.min(1,(l-(r-n))/n)*t;l>=r?(e.scrollLeft=a,o([0,0])):s(e,c)?(e.scrollLeft=c,requestAnimationFrame(d)):o([t-c+i,Math.max(0,r-l)])};return requestAnimationFrame(d),l})(e,t,n,(e,t)=>{var n;const s=d;return!(t>=s)||null!==(n=void(e.scrollLeft=t%s))&&void 0!==n&&n}).then(([t,n])=>{t>0&&h(e,t,n)})};s>0&&h(e,a,1e3*n)})};const n=1/60},4784(e,t){function n(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function s(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Dialog=void 0;var i=new WeakSet;function a(e){null!=e&&e.parentElement&&(e.classList.add("hidden"),setTimeout(()=>{e.parentElement&&e.remove()},300))}async function r(){if(this.dialogs.processing||0===this.dialogs.queue.length)return;this.dialogs.processing=!0;const{fn:e,resolve:t,reject:n}=this.dialogs.queue.shift();try{this.dialogs.active=!0;const n=await e();this.dialogs.active=null,t(n)}catch(e){this.dialogs.active=null,n(e)}finally{this.dialogs.processing=!1,requestAnimationFrame(()=>s(i,this,r).call(this))}}function o(e,t=!1){return new Promise((n,a)=>{t&&this.dialogs.active?e().then(n).catch(a):(this.dialogs.queue.push({fn:e,child:t,resolve:n,reject:a}),s(i,this,r).call(this))})}function l(e,t,n="",s=""){return new Promise(i=>{const a=document.createElement("div");a.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal"),a.appendChild(r);const o=document.createElement("div");o.classList.add("confirmation-modal-header"),r.appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal-title"),l.textContent=e,o.appendChild(l);const d=document.createElement("div");d.classList.add("confirmation-modal-body"),d.innerHTML=t,r.appendChild(d);const c=document.createElement("input");c.type="text",c.classList.add("confirmation-modal-input"),c.placeholder=n,c.value=s,d.appendChild(c),c.focus(),c.select();const u=document.createElement("div");u.classList.add("confirmation-modal-footer"),r.appendChild(u);const p=document.createElement("button");p.classList.add("confirmation-modal-button","confirmation-modal-button-cancel"),p.style.setProperty("--background","211, 51, 51"),p.textContent="Cancel",u.appendChild(p);const g=document.createElement("button");g.classList.add("confirmation-modal-button","confirmation-modal-button-submit"),g.style.setProperty("--background","51, 153, 211"),g.textContent="Submit",u.appendChild(g);const h=e=>{document.removeEventListener("keydown",m,!0),a.classList.add("closing"),r.classList.add("closing"),setTimeout(()=>{a.remove(),i(e)},200)},m=e=>{if("Enter"===e.key)return e.preventDefault(),e.stopPropagation(),h(c.value),!1;if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),h(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",m,!0),p.addEventListener("click",()=>h(null)),g.addEventListener("click",()=>h(c.value)),a.addEventListener("click",e=>{e.target===a&&h(null)})})}function d(e){return new Promise(t=>{const n=e=>{document.removeEventListener("keydown",s,!0),i.classList.add("closing"),a.classList.add("closing"),setTimeout(()=>{i.remove(),t(e)},200)},s=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),n(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",s,!0);const i=document.createElement("div");i.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(i);const a=document.createElement("div");a.classList.add("confirmation-modal"),i.appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal-header"),a.appendChild(r);const o=document.createElement("div");o.classList.add("confirmation-modal-title"),o.textContent="Report to UAA",r.appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal-body"),l.innerHTML="Select reason for reporting <span class='confirmation-modal-username'></span> to UAA:",a.appendChild(l),l.querySelector(".confirmation-modal-username").textContent=e;const d=document.createElement("div");d.classList.add("confirmation-modal-footer","confirmation-modal-footer-vertical"),a.appendChild(d),["Disruptive","Offensive","Promotional","Misleading"].forEach(e=>{const t=`${e} username`,s=document.createElement("button");s.classList.add("confirmation-modal-button","confirmation-modal-button-reason"),s.textContent=t,s.addEventListener("click",()=>n(t)),d.appendChild(s)});const c=document.createElement("button");c.classList.add("confirmation-modal-button","confirmation-modal-button-cancel"),c.style.setProperty("--background","211, 51, 51"),c.textContent="Cancel",c.addEventListener("click",()=>n(null)),d.appendChild(c),i.addEventListener("click",e=>{e.target===i&&n(null)})})}function c(e,t,n=null,s=!1){return new Promise(i=>{const a=e=>{document.removeEventListener("keydown",r,!0),o.classList.add("closing"),l.classList.add("closing"),setTimeout(()=>{o.remove(),i(e)},200)},r=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),a(null),!1;if("Tab"!==e.key){if("INPUT"===e.target.tagName)return;return e.preventDefault(),e.stopPropagation(),!1}};document.addEventListener("keydown",r,!0);const o=document.createElement("div");o.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(o);const l=document.createElement("div");l.classList.add("confirmation-modal"),o.appendChild(l);const d=document.createElement("div");d.classList.add("confirmation-modal-header"),l.appendChild(d);const c=document.createElement("div");c.classList.add("confirmation-modal-title"),c.textContent=e,d.appendChild(c);const u=document.createElement("div");u.classList.add("confirmation-modal-body"),u.innerHTML=t,l.appendChild(u);const p=document.createElement("div");if(p.classList.add("confirmation-modal-footer"),l.appendChild(p),n&&!s){const s=document.createElement("button");s.classList.add("confirmation-modal-button","confirmation-modal-button-uaa"),s.style.setProperty("--background","211, 51, 51"),s.textContent="Report to UAA",p.appendChild(s),s.addEventListener("click",()=>{document.removeEventListener("keydown",r,!0),o.classList.add("closing"),l.classList.add("closing"),setTimeout(async()=>{o.remove();const s=await this.UAA(n,!0);s?this.ws.execute({name:"reportToUAA",params:{reportMessage:s}},void 0,void 0,{user:{name:n}}):i(await this.confirm(e,t,n,!1,!0))},200)})}const g=document.createElement("div");g.classList.add("confirmation-modal-footer-right"),p.appendChild(g);const h=document.createElement("button");h.classList.add("confirmation-modal-button","confirmation-modal-button-no"),h.textContent="No",h.addEventListener("click",()=>a(!1)),g.appendChild(h);const m=document.createElement("button");m.classList.add("confirmation-modal-button","confirmation-modal-button-yes"),m.style.setProperty("--background","51, 102, 204"),m.textContent="Yes",m.addEventListener("click",()=>a(!0)),g.appendChild(m),o.addEventListener("click",e=>{e.target===o&&a(null)}),requestAnimationFrame(()=>m.focus())})}function u(e,t){return new Promise(async n=>{const s=document.createElement("div");s.classList.add("confirmation-modal-overlay"),document.body.querySelector("#app").appendChild(s);const i=document.createElement("div");i.classList.add("confirmation-modal"),s.appendChild(i);const a=document.createElement("div");a.classList.add("confirmation-modal-header"),a.textContent=e,i.appendChild(a);const r=document.createElement("div");r.classList.add("confirmation-modal-body"),r.innerHTML='<div class="dialog-loading">\n <div class="dialog-spinner"></div>\n <div class="dialog-loading-text">Loading...</div>\n </div>',i.appendChild(r);const o=()=>{document.removeEventListener("keydown",l,!0),s.classList.add("closing"),i.classList.add("closing"),setTimeout(()=>{s.remove(),n()},200)},l=e=>{if("Escape"===e.key)return e.preventDefault(),e.stopPropagation(),o(),!1};document.addEventListener("keydown",l,!0),s.addEventListener("click",e=>{e.target===s&&o()}),t instanceof Promise?t.then(e=>{r&&(r.innerHTML=e)}).catch(()=>{r&&(r.innerHTML="Failed to load content")}):r.innerHTML=t})}t.Dialog=class{constructor(e){n(this,i),this.ws=e,this.dialogs={processing:!1,active:null,queue:[]},this.popups=[],addEventListener("focus",()=>{this.popups.length>0&&(this.popups.forEach(e=>electron.closePopup(e)),this.popups=[],requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())}))}),electron.onPopupClosed(e=>{const t=this.popups.indexOf(e);-1!==t&&this.popups.splice(t,1),0===this.popups.length&&requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())})})}controller(e){}check(){if(0===this.popups.length)return requestAnimationFrame(()=>{var e;0===this.popups.length&&(null===(e=document.querySelector("#popup-blocker"))||void 0===e||e.remove())});requestAnimationFrame(()=>this.check())}toast(e,t,n="default",r=5e3){const o=this.ws.store.settings.zen_mode;if(o.enabled&&!o.toasts.enabled)return!1;const l=document.createElement("div");l.classList.add("toast-alert",n);const d=document.createElement("div");d.classList.add("toast-icon"),l.appendChild(d);const c=document.createElement("i");switch(c.classList.add("fa"),d.appendChild(c),n){case"success":c.classList.add("fa-check");break;case"warning":c.classList.add("fa-exclamation-triangle");break;case"error":c.classList.add("fa-xmark");break;default:c.classList.add("fa-info-circle")}const u=document.createElement("div");u.classList.add("toast-content"),l.appendChild(u);const p=document.createElement("div");p.classList.add("toast-title"),p.textContent=e,u.appendChild(p);const g=document.createElement("div");g.classList.add("toast-message"),g.textContent=t,u.appendChild(g);const h=document.createElement("div");h.classList.add("toast-close"),h.addEventListener("click",()=>{s(i,this,a).call(this,l)}),l.appendChild(h);const m=document.createElement("i");return m.classList.add("fa","fa-xmark"),h.appendChild(m),document.body.querySelector("#app").appendChild(l),setTimeout(()=>{this.ws.audio.playSound(["notification","toast"]),l.classList.add("show")},10),r>0&&setTimeout(()=>s(i,this,a).call(this,l),r),!0}input(e,t,n="",a="",r=!1){return s(i,this,o).call(this,()=>s(i,this,l).call(this,e,t,n,a),r)}UAA(e,t=!1){return s(i,this,o).call(this,()=>s(i,this,d).call(this,e),t)}confirm(e,t,n=null,a=!1,r=!1){return s(i,this,o).call(this,()=>s(i,this,c).call(this,e,t,n,a),r)}show(e,t){return s(i,this,o).call(this,()=>s(i,this,u).call(this,e,t))}}},8469(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.GUI=void 0;var s=n(4192),i=n(4041),a=n(7054),r=n(2069),o=n(4784),l=n(8921),d=n(9117),c=n(372),u=n(955),p=n(7698),g=n(317);function h(e,t){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.add(e)}function m(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var v=new WeakSet;class f{constructor(e){h(this,v),this.ws=e,this.dialog=new o.Dialog(this.ws),this.events=new l.EventManager(this.ws),this.settings=new d.Settings(this.ws),this.intervals={DEFCON:null,outdated:null},this.controllers={current:null}}async build(){this.updateDEFCON(),document.documentElement.style.colorScheme={light:"only light",auto:"light dark",dark:"only dark"}[this.ws.store.UI.theme.app]||"light dark";const e={code:["ArrowUp","ArrowUp","ArrowDown","ArrowDown","ArrowLeft","ArrowRight","ArrowLeft","ArrowRight","b","a"],index:0,function:t=>{t.key!==e.code[e.index]?e.index=t.key===e.code[0]?1:0:++e.index===e.code.length&&(e.index=0,this.ws.open("https://ws.luni.me/konami-easter-egg","force"))}};addEventListener("keydown",e.function),this.updateAccessibility(),document.querySelector("#initial").classList.remove("hidden"),document.querySelectorAll(".VERSION").forEach(e=>e.textContent=a.WikiShield.config.version),Math.random()<.01&&(document.querySelector("#wikishield-sikiwhield").textContent="SikiWhield");const t=new AbortController;let n;const s=new Promise(e=>n=e);let i;this.ws.audio.playSound(["startup"],t.signal,!1,()=>n()),await s;const r=this.ws.store.settings.performance.startup;if("always_off"!==r){const e=document.getElementById("dots-canvas"),t=e.getContext("2d"),n=Math.min(devicePixelRatio||1,2);class s{constructor(){m(this,"radius",2),this.x=Math.random()*e.width,this.y=Math.random()*e.height,this.vx=.5*(Math.random()-.5),this.vy=.5*(Math.random()-.5),this.color=s.colors[Math.random()*s.colors.length|0],this.fill=`rgba(${this.color}, 0.8)`,this.shadow=`rgba(${this.color}, 0.8)`}update(){this.x+=this.vx,this.y+=this.vy,this.x<0?this.x=e.width:this.x>e.width&&(this.x=0),this.y<0?this.y=e.height:this.y>e.height&&(this.y=0)}draw(){t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.fillStyle=this.fill,t.fill()}}m(s,"dots",[]),m(s,"target",0),m(s,"colors",["102, 126, 234","240, 147, 251","118, 75, 162","217, 70, 239"]);let a=null;const o=()=>{a||(a=requestAnimationFrame(()=>{a=null;const i=e.width,r=e.height;e.width=Math.floor(innerWidth*n),e.height=Math.floor(innerHeight*n),e.style.width=`${innerWidth}px`,e.style.height=`${innerHeight}px`,t.setTransform(1,0,0,1,0,0),t.scale(n,n);const o=e.width/(i||e.width),l=e.height/(r||e.height);if(s.dots.forEach(e=>{e.x*=o,e.y*=l}),s.target=Math.floor(innerWidth*innerHeight/7e3),s.target=Math.max(40,Math.min(250,s.target)),s.target>s.dots.length)for(let e=s.dots.length;e<s.target;e++)s.dots.push(new s);else s.target<s.dots.length&&(s.dots.length=s.target)}))};o(),addEventListener("resize",o);const l=160,d=30,c=500;let u=null,p=performance.now();const g=new Array(15).fill(1e3/60),h=()=>{{const n=performance.now(),a=n-p;p=n,g.shift(),g.push(a);const o=[...g].sort((e,t)=>e-t).slice(2,-2),l=1e3/(o.reduce((e,t)=>e+t,0)/o.length);if("adaptive"===r){if(l<d){if(null===u&&(u=n),n-u>=c)return i&&cancelAnimationFrame(i),i=null,void t.clearRect(0,0,e.width,e.height)}else u=null;l<45&&s.dots.length>60&&(s.dots.length=Math.max(60,Math.floor(.9*s.dots.length)),s.target=s.dots.length)}}t.clearRect(0,0,e.width,e.height),s.dots.forEach(e=>{e.update(),e.draw()});const n=Math.ceil(innerWidth/l),a=Math.ceil(innerHeight/l),o=new Array(n*a);for(let e=0;e<o.length;e++)o[e]=[];s.dots.forEach((e,t)=>{const s=Math.max(0,Math.min(n-1,Math.floor(e.x/l))),i=Math.max(0,Math.min(a-1,Math.floor(e.y/l)));o[i*n+s].push(t)});const m=innerWidth/2,v=innerHeight/2,f=(e,n,s,i,a)=>{const r=[0];Math.max(e,s)>innerWidth&&r.push(-innerWidth),Math.min(e,s)<0&&r.push(innerWidth);const o=[0];Math.max(n,i)>innerHeight&&o.push(-innerHeight),Math.min(n,i)<0&&o.push(innerHeight),t.lineWidth=1,t.strokeStyle=a;for(const a of r)for(const r of o)t.beginPath(),t.moveTo(e+a,n+r),t.lineTo(s+a,i+r),t.stroke()};for(let e=0;e<a;e++)for(let t=0;t<n;t++){const i=o[e*n+t];if(0!==i.length)for(let r=-1;r<=1;r++){const l=(e+r+a)%a;for(let e=-1;e<=1;e++){const a=o[l*n+(t+e+n)%n];if(0!==a.length)for(let e=0;e<i.length;e++){const t=s.dots[i[e]];for(let n=0;n<a.length;n++){const r=a[n];if(r<=i[e])continue;const o=s.dots[r];let l=t.x-o.x,d=t.y-o.y;l>m&&(l-=innerWidth),l<-m&&(l+=innerWidth),d>v&&(d-=innerHeight),d<-v&&(d+=innerHeight);const c=l*l+d*d;if(c<22500){const e=.4*(1-Math.sqrt(c)/150),n=t.color.split(","),s=o.color.split(","),i=(parseInt(n[0])+parseInt(s[0]))/2,a=(parseInt(n[1])+parseInt(s[1]))/2,r=(parseInt(n[2])+parseInt(s[2]))/2;f(t.x,t.y,t.x-l,t.y-d,`rgba(${i}, ${a}, ${r}, ${e})`)}}}}}}i=requestAnimationFrame(h)};h()}this.ws.rights.rollback||"LuniZunie"===this.ws.api.username?(document.querySelector("#rollback-needed").classList.add("hidden"),document.querySelector("#start-button").classList.remove("hidden")):(document.querySelector("#rollback-needed").classList.remove("hidden"),document.querySelector("#start-button").classList.add("hidden")),document.querySelector("#start-button").addEventListener("click",()=>{window.removeEventListener("keydown",e.function),t.abort(),this.ws.audio.playSound(["ui","click"]),i&&cancelAnimationFrame(i),this.ws.start()}),window.addEventListener("click",e=>{[...document.querySelectorAll(".tooltip.buttons")].forEach(e=>e.remove());const t=e.target.closest("[href]");if(t){const n=new URL(t.href,location.href);if(n.origin===location.origin&&n.pathname===location.pathname)return;if(t.dataset.multipleHrefs)try{const[e,n=""]=t.dataset.multipleHrefs.split(";"),s=Object.fromEntries(n.split("&").map(e=>{const[t,n]=e.split("=");return[t,decodeURIComponent(n)]}));switch(e){case"page":{const e=s.title,n=+s.id;this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Revision",i.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:Permalink/${n}`),e.altKey),t.remove()}),t.appendChild(i);const a=document.createElement("div");a.classList.add("button"),a.innerText="Diff",a.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:Diff/${n}`),e.altKey),t.remove()}),t.appendChild(a)})}break;case"page-abuse":{const e=s.title,n=+s.id;this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Details",i.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:AbuseLog/${n}`),e.altKey),t.remove()}),t.appendChild(i);const a=document.createElement("div");a.classList.add("button"),a.innerText="Examine",a.addEventListener("click",e=>{this.ws.open(this.ws.page(`Special:AbuseFilter/examine/log/${n}`),e.altKey),t.remove()}),t.appendChild(a)})}break;case"log":{const e=s.title,n=JSON.parse(s.log);this.createTooltip(t,"buttons",null,null,null,t=>{const s=document.createElement("div");s.classList.add("button"),s.innerText="Page",s.addEventListener("click",n=>{this.ws.open(this.ws.page(e),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="Log",i.addEventListener("click",s=>{const i=this.ws.page(`Special:Log/${encodeURIComponent(n.user)}?page=${encodeURIComponent(e)}&type=${n.type}&wptime=${n.timestamp}&limit=1`,!1,!1),a=this.ws.open(i,s.altKey);t.remove(),a.addEventListener("load",()=>{a.scroll({behavior:"smooth",top:a.document.body.scrollHeight})},{once:!0})}),t.appendChild(i)})}break;case"user":{const e=s.name;this.createTooltip(t,"buttons",null,null,null,t=>{const n=document.createElement("div");n.classList.add("button"),n.innerText="User talk",n.addEventListener("click",n=>{this.ws.open(this.ws.page(`User talk:${e}`),n.altKey),t.remove()}),t.appendChild(n);const s=document.createElement("div");s.classList.add("button"),s.innerText="User contribs",s.addEventListener("click",n=>{this.ws.open(this.ws.page(`Special:Contribs/${e}`),n.altKey),t.remove()}),t.appendChild(s);const i=document.createElement("div");i.classList.add("button"),i.innerText="User page",i.addEventListener("click",n=>{this.ws.open(this.ws.page(`User:${e}`),n.altKey),t.remove()}),t.appendChild(i)})}break;case"email":this.createTooltip(t,"buttons",null,null,null,e=>{const t=document.createElement("div");t.classList.add("button"),t.innerText="Emergency",t.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Emergency"),t.altKey),e.remove()}),e.appendChild(t);const n=document.createElement("div");n.classList.add("button"),n.innerText="ArbCom",n.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Arbitration Committee"),t.altKey),e.remove()}),e.appendChild(n);const s=document.createElement("div");s.classList.add("button"),s.innerText="Oversight",s.addEventListener("click",t=>{this.ws.open(this.ws.page("Special:EmailUser/Oversight"),t.altKey),e.remove()}),e.appendChild(s)})}}catch(n){this.ws.open(t.getAttribute("href"),e.altKey)}finally{e.preventDefault()}else this.ws.open(t.getAttribute("href"),e.altKey);e.preventDefault()}}),document.querySelector("#loading").classList.add("hidden")}async start(){this.intervals.DEFCON=setInterval(this.updateDEFCON.bind(this),6e4),document.querySelector("#DEFCON").addEventListener("click",e=>{this.ws.open("https://en.wikipedia.org/w/index.php?tagfilter=mw-manual-revert%7Cmw-rollback%7Cmw-undo&title=Special%3ARecentChanges&urlversion=2",e.altKey)}),this.settings.start(),document.querySelector("#app").classList.remove("hidden"),document.querySelector("#initial").classList.add("hidden"),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const n=e.closest(".bottom-tool-item"),s=document.querySelector(`#${n.dataset.menu}-menu`),i=s.classList.contains("show");switch(n.dataset.menu){case"revert":s.innerHTML="",this.createWarnMenu("reverts",s,this.ws.queue.current.item);break;case"warn":s.innerHTML="",this.createWarnMenu("warnings",s,this.ws.queue.current.item);break;case"page":{var a;const e=this.ws.queue.current.item,t=!0===(null==e||null===(a=e.page)||void 0===a?void 0:a.watched);document.querySelector("#page-watch").classList.toggle("hidden",t),document.querySelector("#page-unwatch").classList.toggle("hidden",!t)}}this.closeMenus(),i||(s.classList.add("show"),e.classList.add("active"),this.positionBottomMenu(n,s))})}),document.querySelectorAll(".submenu-trigger").forEach(e=>{let t=(0,s.generateRandomUUID)();e.addEventListener("mouseenter",()=>{t=null;const n=e.closest(".bottom-tool-menu");n&&n.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show"));const s=e.querySelector(".submenu");s&&(this.events.submenu(s,s.dataset.eventName),s.classList.add("show"),this.positionSubmenu(s,e))}),e.addEventListener("mouseleave",()=>{const n=(0,s.generateRandomUUID)();t=n,setTimeout(()=>{if(t!==n)return;const s=e.querySelector(".submenu");s&&s.classList.remove("show")},500)})}),document.querySelectorAll(".menu-option:not(.submenu-trigger)").forEach(e=>{e.addEventListener("click",()=>this.closeMenus())}),document.querySelectorAll(".submenu").forEach(e=>{e.addEventListener("click",e=>e.stopPropagation())}),document.querySelectorAll("#queue-tabs > .queue-tab").forEach(e=>this.addTooltipListener(e));{const e=["alert","message"];e.forEach(e=>{const t=document.querySelector(`#${e}s-icon`);this.addTooltipListener(t),t.addEventListener("click",()=>{const t=document.querySelector(`#${e}s-panel`);t.classList.toggle("show"),t.classList.contains("show")&&this.ws.notifications.seen(e)}),document.querySelector(`#mark-all-${e}s-read`).addEventListener("click",t=>{this.ws.notifications.read(e)})}),document.addEventListener("click",t=>{for(const n of e){const e=document.querySelector(`#${n}s-panel`),s=document.querySelector(`#${n}s-icon`);null!=e&&e.contains(t.target)||null!=s&&s.contains(t.target)||null==e||e.classList.remove("show")}t.target.closest(".bottom-tool-menu")||t.target.closest(".confirmation-modal-overlay")||this.closeMenus()})}const e=document.querySelector("#latest-edits-tab");e.addEventListener("click",()=>this.updateDiffDisplay(this.ws.queue.current.item,!1)),this.addTooltipListener(e);const t=document.querySelector("#consecutive-edits-tab");t.addEventListener("click",()=>this.updateDiffDisplay(this.ws.queue.current.item,!0)),this.addTooltipListener(t),document.querySelector("#pending-changes-container > .accept").addEventListener("click",async e=>{await this.ws.gui.settings.waitForClose();const t=await this.dialog.input("Accept Pending Changes","Enter an optional edit summary for accepting this change:","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"next-item",params:{}},{name:"accept-pending-edit",params:{summary:t}}]})}),document.querySelector("#pending-changes-container > .reject").addEventListener("click",async e=>{await this.ws.gui.settings.waitForClose();const t=await this.dialog.input("Reject Pending Changes","Enter an optional edit summary for rejecting this change:","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"next-item",params:{}},{name:"reject-pending-edit",params:{summary:t}}]})}),document.querySelectorAll("#bottom-tools [data-tooltip]").forEach(e=>this.addTooltipListener(e));{const e=document.querySelector("#queue");{const t=this.ws.store.UI.queue.width;t&&(e.style.width=t,document.querySelector("#right-container").style.width=`calc(100% - ${t})`)}const t=document.querySelector("#right-details");{const e=this.ws.store.UI.details.width;e&&(t.style.width=e,document.querySelector("#main-container").style.width=`calc(100% - ${e})`)}const n={active:null,section:null,x:null,width:null,windowWidth:null},s=(e,t,s)=>{s.preventDefault(),n.active=e,n.section=t,n.x=s.clientX,n.width=t.getBoundingClientRect().width,n.windowWidth=innerWidth},i=document.querySelector("#queue-width-adjust");i.addEventListener("pointerdown",t=>s(i,e,t));const a=document.querySelector("#details-width-adjust");a.addEventListener("pointerdown",e=>s(a,t,e)),addEventListener("pointerup",()=>{n.active===i?this.ws.store.UI.queue.width=e.style.width:n.active===a&&(this.ws.store.UI.details.width=t.style.width),n.active=null,n.section=null}),addEventListener("pointermove",e=>{if(!n.active)return;const t=e.clientX-n.x;let s;n.active===i?s=n.width+t:n.active===a&&(s=n.width-t);const r=.1*n.windowWidth,o=.3*n.windowWidth;s=Math.max(r,Math.min(o,s));const l=s/n.windowWidth*100;n.section.style.width=`${l}vw`,n.active===i?document.querySelector("#right-container").style.width=`calc(100% - ${l}vw)`:n.active===a&&(document.querySelector("#main-container").style.width=`calc(100% - ${l}vw)`)})}const n=a.WikiShield.config.changelog.version;var i,r;(n.endsWith("!")||n!==this.ws.store.changelog)&&(this.ws.store.changelog=n.replace(/!$/,""),null===(i=(r=electron).open)||void 0===i||i.call(r,"changelog"));this.addTooltipListener(document.querySelector("#settings-icon")),document.querySelectorAll("#queue-top-right > span").forEach(e=>this.addTooltipListener(e)),this.updateZenMode(),this.reorderQueues(),this.newCurrentItem(null),document.querySelector("#settings-icon").addEventListener("click",()=>{this.settings.open()}),this.events.button(document.querySelector("#clear-queue"),"clear-queue"),this.events.button(document.querySelector("#previous-item-button"),"previous-item"),this.events.button(document.querySelector("#next-item-button"),"next-item"),this.events.button(document.querySelector("#user-open-user-page"),"open-user-page"),this.events.button(document.querySelector("#user-open-user-talk"),"open-user-talk"),this.events.button(document.querySelector("#user-view-contribs"),"open-user-contributions"),this.events.button(document.querySelector("#user-view-filter-log"),"open-filter-log"),this.events.button(document.querySelector("#user-whitelist"),"whitelist-user"),this.events.button(document.querySelector("#user-unwhitelist"),"unwhitelist-user"),this.events.button(document.querySelector("#user-highlight"),"highlight-user"),this.events.button(document.querySelector("#user-unhighlight"),"unhighlight-user"),this.events.submenu(document.querySelector("#user-welcome .submenu"),"welcome-user"),this.events.submenu(document.querySelector("#user-report-aiv .submenu"),"report-user-to-aiv"),this.events.submenu(document.querySelector("#user-report-uaa .submenu"),"report-user-to-uaa"),this.events.submenu(document.querySelector("#user-request-global-block .submenu"),"request-global-block"),this.events.submenu(document.querySelector("#user-request-global-lock .submenu"),"request-global-lock"),this.events.submenu(document.querySelector("#user-new-talk-topic .submenu"),"send-message-to-user-talk"),this.events.button(document.querySelector("#page-open-page"),"open-page"),this.events.button(document.querySelector("#page-open-talk"),"open-page-talk"),this.events.button(document.querySelector("#page-watch"),"watch-page"),this.events.button(document.querySelector("#page-unwatch"),"unwatch-page"),this.events.button(document.querySelector("#page-whitelist"),"whitelist-page"),this.events.button(document.querySelector("#page-unwhitelist"),"unwhitelist-page"),this.events.button(document.querySelector("#page-highlight"),"highlight-page"),this.events.button(document.querySelector("#page-unhighlight"),"unhighlight-page"),this.events.submenu(document.querySelector("#page-request-protection .submenu"),"request-page-protection"),this.events.button(document.querySelector("#page-view-history"),"open-page-history"),this.events.submenu(document.querySelector("#page-new-talk-topic .submenu"),"send-message-to-page-talk"),this.events.button(document.querySelector("#edit-view-revision"),"open-revision"),this.events.button(document.querySelector("#edit-view-diff"),"open-diff"),this.events.button(document.querySelector("#edit-thank-user"),"thank-user"),this.events.submenu(document.querySelector("#edit-rollback .submenu"),"rollback-edit"),this.events.submenu(document.querySelector("#edit-rollback-goodfaith .submenu"),"rollback-goodfaith-edit"),this.events.submenu(document.querySelector("#edit-undo .submenu"),"undo-edit"),this.events.button(document.querySelector("#copy-link"),"copy-link"),this.events.button(document.querySelector("#refresh-user-contributions"),"refresh-user-contributions"),this.events.button(document.querySelector("#user-contributions > .footer"),"open-user-contributions"),this.events.button(document.querySelector("#refresh-page-history"),"refresh-page-history"),this.events.button(document.querySelector("#page-history > .footer"),"open-page-history"),c.Queue.types.forEach(e=>{this.events.button(document.querySelector(`#queue-tab-${e}`),`switch-to-${e}-queue`)}),this.animation(),this.update(),this.renderQueue(),electron.menuEnabler({browser:!0,settings:{preferences:!0},help:{changelog:!0}})}animation(){try{(0,g.AutoScroll)()}catch(e){console.error("Error in animation loop:",e)}requestAnimationFrame(()=>this.animation())}update(){try{const e=new Date;document.querySelectorAll("[data-time]").forEach(t=>{const n=new Date(t.dataset.time);switch(t.dataset.timeFormat){case"notification":t.textContent=this.ws.util.formatNotificationTime(n,"timeNow"in t.dataset?new Date(t.dataset.timeNow):e)+(t.dataset.timePostfix||"");break;case"duration":t.textContent=this.ws.util.formatDuration(n,"timeNow"in t.dataset?new Date(t.dataset.timeNow):e)+(t.dataset.timePostfix||"")}})}catch(e){console.error("Error updating time elements:",e)}setTimeout(()=>this.update(),1e3)}async updateDEFCON(){var e;const t=await this.ws.getDEFCON(),n=document.querySelector("#DEFCON");n.title=`DEFCON-${null!==t.level?t.level:"N/A"} (${t.info?`${t.info} revert${1===+t.info?"":"s"} per minute`:"No data"})`;const s=n.querySelector(".dot");s.className="dot",null!==t.level&&s.classList.add(`DEFCON-${t.level}`),document.querySelector(".DEFCON-RPM").textContent=null!==(e=t.info)&&void 0!==e?e:"N/A"}generateItemHTML(e,t=!1){const n=this.getORESColor(e.ores),s="sizediff"in e?this.ws.util.getChangeColor(e.sizediff):void 0,a=(0,i.CreateDOMElement)("div");{const t=(0,i.CreateDOMElement)("div",{class:"item-color",style:{"--ores-color":n},dataset:{ores:e.ores}});a.appendChild(t)}{var r,o,l;const t=(0,i.CreateDOMElement)("div",{class:"item-body",style:{"--ores-color":n,"--diff-color":s},datset:{ores:e.ores}});a.appendChild(t);{const n=(0,i.CreateDOMElement)("div",{class:"header"});t.appendChild(n);{const t=this.ws.store.highlight.pages.has(e.page.title),s=(0,i.CreateDOMElement)("span",{class:"page-title"+(t?" highlighted":""),content:e.page.title,dataset:t?{tooltip:"Page is highlighted",tooltipDelay:500}:{}});this.addTooltipListener(s),n.appendChild(s);const a=(0,i.CreateDOMElement)("i",{class:"fas fa-file-lines"});s.prepend(a)}{const t=(0,i.CreateDOMElement)("span",{class:"timestamp"});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-clock",style:{"font-size":"11px"}});t.appendChild(s);const a=(0,i.CreateDOMElement)("span",{content:this.ws.util.formatNotificationTime(new Date(e.timestamp)),dataset:{tooltip:new Date(e.timestamp).toLocaleString(),tooltipDelay:500,time:e.timestamp,timeFormat:"notification"}});this.addTooltipListener(a),t.appendChild(a)}}{var d;const n=(0,i.CreateDOMElement)("div",{class:"meta"});t.appendChild(n);const s=null!==(d=e.performer)&&void 0!==d?d:e.user;{const t=s.blocked,a=this.ws.util.expiryToDate(null==t?void 0:t.expiry),r=this.ws.store.highlight.users.has(s.name),o=void 0===s.talk,l=(0,i.CreateDOMElement)("span",{class:"user-chip"+(!1===(null==t?void 0:t.partial)?" blocked":"")+(r?" highlighted":"")+(o?" empty-talk":""),content:e.user.name,dataset:!1===(null==t?void 0:t.partial)?{tooltip:`Blocked ${a===1/0?"indefinitely":`until ${a.toLocaleString()}`} (${t.reason})`,tooltipDelay:500}:r?{tooltip:"User is highlighted",tooltipDelay:500}:o?{tooltip:"User has an empty talk page",tooltipDelay:500}:{}});this.addTooltipListener(l),n.appendChild(l);const d=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(s.anon?"user-secret":"user"),style:{"font-size":"11px"}});l.prepend(d)}{const t=(0,i.CreateDOMElement)("div",{class:"chips"});if(n.appendChild(t),"abuselog"===e.type){const n=["disallow","warn","showcaptcha","tag","none"],s=n.length;let a=s-1;for(let t=0;t<s;t++)if(e.origin.result.has(n[t])){a=t;break}const r=(0,i.CreateDOMElement)("span",{class:"ores-chip",dataset:{tooltip:`Action taken: ${n[a]}`,tooltipDelay:500}});this.addTooltipListener(r),t.appendChild(r);const o=(0,i.CreateDOMElement)("i",{class:`fas fa-${["ban","exclamation-triangle","robot","tag","check"][a]}`,style:{"font-size":"11px"}});r.prepend(o)}else{const n=(0,i.CreateDOMElement)("span",{class:"ores-chip",content:Number.isNaN(e.ores)?"-":Math.round(100*e.ores),dataset:{tooltip:"Score",tooltipDelay:500}});this.addTooltipListener(n),t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-fire",style:{"font-size":"11px"}});n.prepend(s)}{const n=(0,i.CreateDOMElement)("div",{class:"diff-chips"});if(t.appendChild(n),e.minor){const e=(0,i.CreateDOMElement)("span",{class:"minor-chip",dataset:{tooltip:"Minor edit",tooltipDelay:500}});this.addTooltipListener(e),n.appendChild(e);const t=(0,i.CreateDOMElement)("i",{class:"fas fa-m",style:{"font-size":"11px"}});e.appendChild(t)}if("sizediff"in e){const t=(0,i.CreateDOMElement)("span",{class:"diff-chip",content:Math.abs(e.sizediff).toLocaleString(),dataset:{tooltip:"Size difference",tooltipDelay:500}});if(this.addTooltipListener(t),n.appendChild(t),0!==e.sizediff){const n=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.sizediff>0?"plus":"minus"),style:{"font-size":"11px"}});t.prepend(n)}}}}}if(e.has_comment){const n=(0,i.CreateDOMElement)("div",{class:"item-comment"});t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"11px"}});n.appendChild(s);const a=(0,i.CreateDOMElement)("span",{class:"text",html:e.comment,dataset:{tooltip:e.comment,tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(a),n.appendChild(a)}const c=null!==(r=null!==(o=e.tags)&&void 0!==o?o:null===(l=e.filters)||void 0===l?void 0:l.map(e=>`${e.filter} (${"-1"===e.id?"private":e.id})`))&&void 0!==r?r:[];if(c.length>0){const e=(0,i.CreateDOMElement)("div",{class:"item-tags"});t.appendChild(e),c.forEach(t=>{const n=(0,i.CreateDOMElement)("span",{class:"tag",content:t});e.appendChild(n)})}}if(t){const e=(0,i.CreateDOMElement)("div",{class:"remove-button"});a.appendChild(e);const t=(0,i.CreateDOMElement)("i",{class:"fas fa-xmark"});e.appendChild(t)}return a.innerHTML}generateEditDetails(e,t=!1){if(!e)return void(document.querySelector("#edit-details").innerHTML="<div class='central'>Nothing selected</div>");const n="edit"===c.Queue.groups[e.type]?this.ws.queue.pending.get(e.id):null,s=document.querySelector("#edit-details");s.style.setProperty("--diff-color","sizediff"in e?this.ws.util.getChangeColor(e.sizediff):void 0),s.innerHTML="";{const t=(0,i.CreateDOMElement)("div",{class:"header"});s.appendChild(t);{const n=this.ws.store.highlight.pages.has(e.page.title),s=(0,i.CreateDOMElement)("span",{class:"page-title"+(n?" highlighted":""),dataset:n?{tooltip:"Page is highlighted",tooltipDelay:500}:{}});this.addTooltipListener(s),t.appendChild(s);const a=(0,i.CreateDOMElement)("i",{class:"fas fa-file-lines"});let r;switch(s.appendChild(a),c.Queue.groups[e.type]){case"edit":r="page";break;case"logevent":r="log";break;case"abuselog":r="page-abuse"}const o=(0,i.CreateDOMElement)("a",{content:e.page.title,dataset:{multipleHrefs:`${r};title=${encodeURIComponent(e.page.title)}&${"log"===r?`log=${JSON.stringify(e)}`:`id=${e.id}`}`,tooltip:e.page.title,tooltipDelay:500},attributes:{href:null}});this.addTooltipListener(o),s.appendChild(o)}{var a;const s=(0,i.CreateDOMElement)("div",{class:"meta"});t.appendChild(s);const l=null!==(a=e.performer)&&void 0!==a?a:e.user;{var o;const e=Object.keys(null!==(o=null==n?void 0:n.users)&&void 0!==o?o:{}).filter(e=>e!==l.name),t=l.blocked,a=this.ws.util.expiryToDate(null==t?void 0:t.expiry),d=this.ws.store.highlight.users.has(l.name),c=void 0===l.talk,u=(0,i.CreateDOMElement)("span",{class:"user-chip"+(!1===(null==t?void 0:t.partial)?" blocked":"")+(d?" highlighted":"")+(c?" empty-talk":""),dataset:!1===(null==t?void 0:t.partial)?{tooltip:`Blocked ${a===1/0?"indefinitely":`until ${a.toLocaleString()}`} (${t.reason})`,tooltipDelay:500}:d?{tooltip:"User is highlighted",tooltipDelay:500}:c?{tooltip:"User has an empty talk page",tooltipDelay:500}:{}});this.addTooltipListener(u),s.appendChild(u);const p=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.length>0?"users":l.anon?"user-secret":"user")});u.appendChild(p);const g=(0,i.CreateDOMElement)("a",{content:l.name,dataset:{multipleHrefs:`user;name=${encodeURIComponent(l.name)}`,tooltip:l.name,tooltipDelay:500},attributes:{href:null}});if(this.addTooltipListener(g),u.appendChild(g),e.length>0){const t=(0,i.CreateDOMElement)("span",{class:"other-users",content:` and ${e.length} ${r.Text.pluralize("other",e.length)}`,dataset:{tooltip:e.join(", "),tooltipDelay:500}});this.addTooltipListener(t),u.appendChild(t)}}}}{var l;const a=(0,i.CreateDOMElement)("div",{class:"subheader"});if(s.appendChild(a),(null==n?void 0:n.count)>1||t&&(null===(l=e.consecutive)||void 0===l?void 0:l.count)>1){const t=(0,i.CreateDOMElement)("div",{class:"item-comment"});a.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comments",style:{"font-size":"11px"}});t.appendChild(s);const o=null!=n?n:e.consecutive,l=(0,i.CreateDOMElement)("span",{class:"text",content:`${o.count} ${r.Text.pluralize("edit",o.count)} over the course of `,dataset:{tooltip:o.edits.map(e=>{const t=(0,i.CreateDOMElement)("div",{style:{display:"flex","flex-direction":"column",gap:"6px"}});{const n=(0,i.CreateDOMElement)("div",{style:{display:"flex","align-items":"center",gap:"6px",width:"100%","justify-content":"space-between","font-size":"13px"}});t.appendChild(n);{const t=(0,i.CreateDOMElement)("span",{style:{display:"flex","align-items":"center",gap:"4px","font-weight":"500"},content:e.user});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.anon?"user-secret":"user"),style:{"font-size":"11px",opacity:"0.7"}});t.prepend(s)}{const t=(0,i.CreateDOMElement)("span",{style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",opacity:"0.75"},content:this.ws.util.formatNotificationTime(new Date(e.timestamp)),dataset:{time:e.timestamp,timeFormat:"notification"}});n.appendChild(t);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-clock",style:{"font-size":"10px",opacity:"0.7"}});t.prepend(s)}}{const n=(0,i.CreateDOMElement)("div",{style:{display:"flex","align-items":"flex-start",gap:"4px","font-size":"12px",opacity:"0.85",padding:"2px 0"},content:e.comment||"No edit summary"});t.appendChild(n);const s=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"10px",opacity:"0.7","flex-shrink":"0","margin-top":"2px"}});n.prepend(s)}return t.outerHTML}).join("<br>"),tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(l),t.appendChild(l);const d=(0,i.CreateDOMElement)("span",{class:"time",content:this.ws.util.formatDuration(new Date(o.timestamp.old),new Date(o.timestamp.new)),dataset:{tooltip:`${new Date(o.timestamp.old).toLocaleString()}&mdash;${new Date(o.timestamp.new).toLocaleString()}`,tooltipHtml:!0,tooltipDelay:500,time:o.timestamp.old,timeNow:o.timestamp.new,timeFormat:"duration"}});this.addTooltipListener(d),t.appendChild(d)}else if(e.has_comment){const t=(0,i.CreateDOMElement)("div",{class:"item-comment"});a.appendChild(t);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-comment",style:{"font-size":"11px"}});t.appendChild(n);const s=(0,i.CreateDOMElement)("span",{class:"text",html:e.comment,dataset:{tooltip:e.comment,tooltipHtml:!0,tooltipDelay:500}});this.addTooltipListener(s),t.appendChild(s)}else{const e=(0,i.CreateDOMElement)("div",{class:"item-comment none",content:"No edit summary"});a.appendChild(e)}{const t=(0,i.CreateDOMElement)("div",{class:"meta"});if(a.appendChild(t),e.minor){const e=(0,i.CreateDOMElement)("span",{class:"minor-chip",dataset:{tooltip:"Minor edit",tooltipDelay:500}});this.addTooltipListener(e),t.appendChild(e);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-m",style:{"font-size":"11px"}});e.appendChild(n)}if("sizediff"in e){const n=(0,i.CreateDOMElement)("span",{class:"diff-chip",content:Math.abs(e.sizediff).toLocaleString(),dataset:{tooltip:"Size difference",tooltipDelay:500}});if(this.addTooltipListener(n),t.appendChild(n),0!==e.sizediff){const t=(0,i.CreateDOMElement)("i",{class:"fas fa-"+(e.sizediff>0?"plus":"minus"),style:{"font-size":"11px"}});n.prepend(t)}}}}}renderQueue(e=null,t=null,n=null){var s,a,r;if(document.querySelector("#previous-item-button").classList.toggle("disabled",!this.ws.queue.canGoPrevious()),document.querySelector("#next-item-button").classList.toggle("disabled",!this.ws.queue.canGoNext()),null!=e||(e=this.ws.queue.current.queue),null!=t||(t=this.ws.queue.current.item),null!=n||(n=this.ws.queue.current.type),this.updateQueueTabs(),n!==this.ws.queue.current.type)return;const o=document.querySelector("#queue-items");if(0===e.length){var l,d;const e=document.createElement("div");return e.classList.add("queue-empty"),e.textContent="No items in queue",o.innerHTML=e.outerHTML,void((null===(l=this.ws.queue.queues[n].previous)||void 0===l?void 0:l.id)!==(null===(d=t)||void 0===d?void 0:d.id)&&(this.ws.queue.queues[n].previous=t,this.newCurrentItem(t)))}o.querySelectorAll(".queue-empty").forEach(e=>e.remove());const c=new Map;for(const e of o.children)c.set(+e.dataset.id,e);let u=null;for(const s of e){var p;let i=c.get(s.id);var g;if(!i)i=document.createElement("div"),i.classList.add("queue-item"),i.dataset.id=s.id,i.dataset.type=n,i.innerHTML=this.generateItemHTML(s,"pending"!==n),null===(g=i.querySelector(".remove-button"))||void 0===g||g.addEventListener("click",i=>{i.stopPropagation();const a=e.findIndex(e=>e.id===s.id);var r;a>=0&&(s.id===(null===(r=t)||void 0===r?void 0:r.id)?this.ws.queue.next():(e.splice(a,1),this.ws.queue.queues[n].history.push({...s,history:performance.now()}),this.removeQueueItem(n,s.id),this.renderQueue()))}),s.mentions.has&&this.ws.store.settings.username_highlighting.enabled&&(i.classList.add("mentions-me"),i.dataset.tooltip="This queue item contains your username",this.addTooltipListener(i)),i.addEventListener("click",()=>{this.ws.queue.queues[n].item=s,this.ws.current=this.ws.queue.queues[n],this.renderQueue()}),o.appendChild(i),c.set(s.id,i),i.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e));null===u?i!==o.firstChild&&o.insertBefore(i,o.firstChild):i.previousSibling!==u&&o.insertBefore(i,u.nextSibling),i.classList.toggle("current",s.id===(null===(p=t)||void 0===p?void 0:p.id)),u=i}for(const[t,n]of c.entries())e.some(e=>e.id===t)||n.remove();let h=null;for(const t of e){if(!1===t.history)break;h=t}if(null===(s=o.querySelector(".historical-bar"))||void 0===s||s.remove(),null!==h){const e=(0,i.CreateDOMElement)("div",{class:"historical-bar"});o.insertBefore(e,c.get(h.id).nextSibling);const t=(0,i.CreateDOMElement)("span",{class:"label"});e.appendChild(t);const n=(0,i.CreateDOMElement)("i",{class:"fas fa-box-archive",attributes:{title:"All items above this line have been viewed"}});t.appendChild(n)}(null===(a=this.ws.queue.queues[n].previous)||void 0===a?void 0:a.id)!==(null===(r=t)||void 0===r?void 0:r.id)&&(this.ws.queue.queues[n].previous=t,this.newCurrentItem(t))}removeQueueItem(e,t){const n=document.querySelector(`.queue-item[data-type="${e}"][data-id="${t}"]`);n&&(n.remove(),this.updateQueueTabs([e]))}clearQueueItems(){document.querySelector("#queue-items").innerHTML="",this.renderQueue()}updateHiddenItems(e){if(void 0===e&&(e=this.ws.queue.current.item),null===e)return this.ws.store.UI.hide_tools,document.querySelectorAll("[data-queue-type]").forEach(e=>e.classList.add("hidden"));let t=e.type;"abuselog"===t&&e.revid&&(t="edit");const n=c.Queue.groups[t];document.querySelectorAll("[data-queue-type]").forEach(e=>{const t=e.dataset.queueType||"*";"*"===t?e.classList.remove("hidden"):e.classList.toggle("hidden",!t.split(",").includes(n))})}async newCurrentItem(e=null,t=!1){var n,s;null===(n=this.controllers.current)||void 0===n||n.abort();const a=new AbortController;this.controllers.current=a,null!==e&&(this.updateDiffDisplay("loading"),await this.ws.queue.propagate(e,!0)),this.stopOutdatedCheck(),this.toggleEditWarNotice((null==e?void 0:e.reverts)>=3,(null==e?void 0:e.reverts)||0),this.toggleOutdatedNotice(!1),this.togglePendingNotice(!1),this.closeMenus(),this.removeTooltips(),document.querySelectorAll("#right-top > div > :not(.hidden)").forEach(e=>e.classList.add("hidden"));const r=document.querySelector("#user-contributions > .queue-list");r.innerHTML="";const o=document.querySelector("#page-history > .queue-list");if(o.innerHTML="",document.querySelector("#user-contributions > .header > .pills").innerHTML="",document.querySelector("#page-history > .header > .pills").innerHTML="",document.querySelector("#pending-changes-container").classList.toggle("hidden",!(this.ws.rights.review&&this.ws.queue.pending.has(null==e?void 0:e.id))),this.updateHiddenItems(e),null===e)return this.generateEditDetails(),document.querySelector("#diff-container").innerHTML="",document.querySelector("#diff-scroll-up").classList.add("hidden"),document.querySelector("#diff-scroll-down").classList.add("hidden"),document.querySelector("#ai-analysis-container").classList.add("hidden"),void([...document.querySelectorAll("#queue-tabs > .queue-tab")].every(e=>"none"===getComputedStyle(e).display)&&(document.querySelector("#diff-container").innerHTML='\n\t\t\t\t\t<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: grey;">\n\t\t\t\t\t\t<div style="font-size: 48px; margin-bottom: 16px;">\n\t\t\t\t\t\t\t<i class="fas fa-shield-alt"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 24px; margin-bottom: 8px; text-align: center;">\n\t\t\t\t\t\t\tNo queues are enabled\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 14px; text-align: center; max-width: 100%; margin-top: 10px;">\n\t\t\t\t\t\t\tI heard there was a WikiShield,<br>\n\t\t\t\t\t\t\tWhich entered an oversaturated field,<br>\n\t\t\t\t\t\t\tBut you don&rsquo;t ever use Huggle, do you?<br>\n\t\t\t\t\t\t\tWell it simplifies any AIV,<br>\n\t\t\t\t\t\t\tBut superintendence matters to me\n\t\t\t\t\t\t\t<span style="display: block; margin-top: 8px;">&mdash; User:WikiMacaroons</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t'));const l=e.type,d=c.Queue.groups[l];if(!t&&"abuselog"===l&&!e.revid){const t=async()=>{a.signal.aborted||this.ws.api.getAbuseLogRevid(e.id).then(n=>{var s,i;n&&(e.revid=n,e.id===(null===(i=this.ws.queue.current.item)||void 0===i?void 0:i.id)&&this.newCurrentItem(this.ws.queue.current.item,!0));e.id===(null===(s=this.ws.queue.current.item)||void 0===s?void 0:s.id)&&setTimeout(()=>t(),1e3)})};t()}const u=null==e||null===(s=e.page)||void 0===s?void 0:s.watched;if(document.querySelector("#page-watch").classList.toggle("hidden",!0===u),document.querySelector("#page-unwatch").classList.toggle("hidden",!0!==u),document.querySelector("#user-report-uaa").classList.toggle("hidden",null==e?void 0:e.user.anon),document.querySelector("#user-request-global-lock").classList.toggle("hidden",null==e?void 0:e.user.anon),this.ws.AI){const t=this.ws.store;null===e.AI.edit&&t.settings.AI.edit_analysis.enabled&&this.ws.AI.analyze.edit(e).then(t=>{e.AI.edit=t}).catch(t=>{e.AI.edit={error:t.message}}).finally(()=>{var t;e.id===(null===(t=this.ws.queue.current.item)||void 0===t?void 0:t.id)&&this.updateAIAnalysisDisplay(e.AI.edit)}),null!==e.AI.username||e.user.anon||t.whitelist.users.has(e.user)||!t.settings.AI.username_analysis.enabled||this.ws.AI.analyze.username(e).then(t=>{e.AI.username=t,t.flag&&this.ws.queue.promptUAA(e,t)}).catch(t=>{e.AI.username={error:t.message}})}if(this.updateAIAnalysisDisplay(e.AI.edit),!e.seen)switch(e.seen=!0,this.ws.store.statistics.edits_reviewed.total++,this.ws.queue.current.type){case"recent":this.ws.store.statistics.recent_changes_reviewed.total++;break;case"pending":this.ws.store.statistics.pending_changes_reviewed.total++;break;case"watchlist":this.ws.store.statistics.watchlist_changes_reviewed.total++;break;case"users":this.ws.store.statistics.users_reviewed.total++}{const t=(0,i.CreateDOMElement)("div",{class:"pill",content:`${e.user.edits.toLocaleString()} edit${1===e.user.edits?"":"s"}`});document.querySelector("#user-contributions > .header > .pills").appendChild(t)}if("0"!==e.user.warning){const t=(0,i.CreateDOMElement)("div",{class:`pill uw-${e.user.warning}`});document.querySelector("#user-contributions > .header > .pills").appendChild(t),t.textContent=`uw-${e.user.warning}`;const n=e.user.warnings;if(n.length>0){const s=document.createElement("div"),i=document.createElement("div");i.classList.add("tooltip-title"),i.textContent=`Warnings for ${e.user.name}`,s.appendChild(i);for(const e of n){const t=document.createElement("div");t.classList.add("tooltip-item","user-warnings"),s.appendChild(t);const n=document.createElement("span");n.classList.add("tooltip-item-level"),n.textContent=`${e.template}${e.level}`,t.appendChild(n);const i=document.createElement("div");i.classList.add("tooltip-item-details"),t.appendChild(i);const a=document.createElement("span");a.classList.add("tooltip-item-user"),a.textContent=e.username?`by User:${e.username}`:"by Unknown",i.appendChild(a),i.appendChild(document.createElement("br"));const r=document.createElement("span");r.classList.add("tooltip-item-date"),i.appendChild(r),e.timestamp?(r.dataset.time=e.timestamp,r.dataset.timeFormat="notification",r.textContent=this.ws.util.formatNotificationTime(new Date(e.timestamp))):r.textContent="Date unknown"}t.dataset.tooltip=s.innerHTML,t.dataset.tooltipHtml=!0}this.addTooltipListener(t)}const p=e.user.blocks;if(p.length>0){const t=(0,i.CreateDOMElement)("div",{class:"pill ub"});document.querySelector("#user-contributions > .header > .pills").appendChild(t);const n=document.createElement("div"),s=document.createElement("div");s.classList.add("tooltip-title"),s.textContent=`Blocks for ${e.user.name}`,n.appendChild(s);for(const e of p){var g;const t=document.createElement("div");t.classList.add("tooltip-item","user-blocks"),n.appendChild(t);const s=document.createElement("span");s.classList.add("tooltip-item-level"),s.innerHTML=e.parsedcomment||"No reason provided",t.appendChild(s);const i=document.createElement("div");i.classList.add("tooltip-item-details"),t.appendChild(i);const a=document.createElement("span");a.classList.add("tooltip-item-user"),a.textContent=e.user?`by User:${e.user}`:"by Unknown",i.appendChild(a),i.appendChild(document.createElement("br"));const r=document.createElement("span");r.classList.add("tooltip-item-time"),i.appendChild(r);const o=document.createElement("span");e.timestamp?(o.dataset.time=e.timestamp,o.dataset.timeFormat="notification",o.textContent=this.ws.util.formatNotificationTime(new Date(e.timestamp))):o.textContent="Date unknown",r.appendChild(o);const l=document.createElement("span");l.textContent=`(for ${(null===(g=e.params)||void 0===g?void 0:g.duration)||"an unknown duration"})`,r.appendChild(l)}t.classList.remove("hidden"),t.textContent=`${p.length} block${1===p.length?"":"s"}`,t.dataset.tooltip=n.innerHTML,t.dataset.tooltipHtml=!0,this.addTooltipListener(t)}{const t=document.querySelector("#user-whitelist"),n=document.querySelector("#user-unwhitelist");if(t&&n){const s=()=>{const s=this.ws.store.whitelist.users.has(e.user.name);t.classList.toggle("hidden",s),n.classList.toggle("hidden",!s)};t.onclick=s,n.onclick=s,s()}const s=document.querySelector("#user-highlight"),i=document.querySelector("#user-unhighlight");if(s&&i){const t=()=>{const t=this.ws.store.highlight.users.has(e.user.name);s.classList.toggle("hidden",t),i.classList.toggle("hidden",!t)};s.onclick=t,i.onclick=t,t()}}{const t=document.querySelector("#page-whitelist"),n=document.querySelector("#page-unwhitelist");if(t&&n){const s=()=>{const s=this.ws.store.whitelist.pages.has(e.page.title);t.classList.toggle("hidden",s),n.classList.toggle("hidden",!s)};t.onclick=s,n.onclick=s,s()}const s=document.querySelector("#page-highlight"),i=document.querySelector("#page-unhighlight");if(s&&i){const t=()=>{const t=this.ws.store.highlight.pages.has(e.page.title);s.classList.toggle("hidden",t),i.classList.toggle("hidden",!t)};s.onclick=t,i.onclick=t,t()}}(async t=>{const n=e.user.contributions;for(const e of n){var s;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(s=this.ws.queue.current.item.revid)&&void 0!==s?s:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML({page:{title:e.title},user:{name:e.user},comment:"Loading...",timestamp:e.timestamp,sizediff:0,ores:NaN,tags:e.tags||[],type:"edit"}),r.appendChild(t),requestAnimationFrame(()=>t.classList.remove("no-transition"))}if(e.page.cached_contributions){const s=await e.page.cached_contributions;if(t.aborted)return;n.some((e,t)=>{var n;return e.id!==(null===(n=s[t])||void 0===n?void 0:n.id)})&&delete e.page.cached_contributions}e.user.cached_contributions||(e.user.cached_contributions=this.ws.queue.generate("edit",n,!0));const i=await e.user.cached_contributions;if(!t.aborted){r.innerHTML="";for(const e of i.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp))){var a;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(a=this.ws.queue.current.item.revid)&&void 0!==a?a:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML(e),r.appendChild(t),t.addEventListener("mouseover",()=>this.ws.queue.propagate(e,!0)),t.addEventListener("click",()=>this.ws.queue.loadFromItem(e)),t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e)),requestAnimationFrame(()=>t.classList.remove("no-transition"))}}})(a.signal).catch(e=>{a.signal.aborted||console.error("Error loading contributions:",e)});switch(d){case"edit":{var h;if(this.startOutdatedCheck(e),!this.ws.queue.pending.has(e.id))(null===(h=e.consecutive)||void 0===h?void 0:h.count)>=2&&(document.querySelector("#latest-edits-tab").classList.remove("hidden"),document.querySelector("#consecutive-edits-tab").classList.remove("hidden"));const t=e.page.protection;if(t.protected||this.ws.queue.pending.has(e.id)){const n=(0,i.CreateDOMElement)("div",{class:"pill"});if(document.querySelector("#page-history > .header > .pills").appendChild(n),t.protected){let e,s;switch(t.level){case"sysop":e="F",s="Requires sysop right to edit";break;case"template":e="T",s="Requires template editor to edit";break;case"extendedconfirmed":e="EC",s="Requires extended confirmed right to edit";break;case"autoconfirmed":e="AC",s="Requires autoconfirmed right to edit";break;default:e="?",s="Uknown protection level"}n.innerHTML=`<i class="fas fa-lock"></i> <span class="protection-icon" data-tooltip="${s}">${e}</span>`,this.addTooltipListener(n.querySelector("[data-tooltip]"))}else if(this.ws.queue.pending.has(e.id)){var m;const t=(null===(m=this.ws.queue.pending.get(e.id).pending.stability)||void 0===m?void 0:m.parsedcomment)||"No comment provided",s=document.createElement("span");s.classList.add("protection-icon"),s.innerHTML="<i class='fas fa-lock'></i> PC",s.dataset.tooltip=t,s.dataset.tooltipHtml=!0,n.appendChild(s),this.addTooltipListener(n.querySelector("[data-tooltip]"))}}for(const t of e.page.metadata){const e=(0,i.CreateDOMElement)("div",{class:"pill",content:t});document.querySelector("#page-history > .header > .pills").appendChild(e)}}break;case"logevent":break;case"abuselog":{e.revid&&this.startOutdatedCheck(e);const t=document.querySelector("#protection-indicator");if(t){const n=e.page.protection;if(n.protected){let e,s;switch(n.level){case"sysop":e="P",s="Requires sysop right to edit";break;case"extendedconfirmed":e="X",s="Requires extended confirmed right to edit";break;case"autoconfirmed":e="A",s="Requires autoconfirmed right to edit";break;default:e="?",s="Uknown protection level"}t.innerHTML=`<span class="protection-icon" data-tooltip="${s}">${e}</span>`,this.addTooltipListener(t.querySelector("[data-tooltip]"))}else if(this.ws.queue.pending.has(e.id)){var v;const n=(null===(v=this.ws.queue.pending.get(e.id).pending.stability)||void 0===v?void 0:v.parsedcomment)||"No comment provided",s=document.createElement("span");s.classList.add("protection-icon"),s.textContent="PC",s.dataset.tooltip=n,s.dataset.tooltipHtml=!0,t.appendChild(s),this.addTooltipListener(t.querySelector("[data-tooltip]"))}else t.innerHTML=""}}}if("edit"===d||"abuselog"===d){(async t=>{const n=e.page.history;for(const e of n){var s;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(s=this.ws.queue.current.item.revid)&&void 0!==s?s:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML({page:{title:e.title},user:{name:e.user},comment:"Loading...",timestamp:e.timestamp,sizediff:0,ores:NaN,tags:e.tags||[],type:"edit"}),o.appendChild(t),requestAnimationFrame(()=>t.classList.remove("no-transition"))}if(e.page.cached_history){const s=await e.page.cached_history;if(t.aborted)return;n.some((e,t)=>{var n;return e.id!==(null===(n=s[t])||void 0===n?void 0:n.id)})&&delete e.page.cached_history}e.page.cached_history||(e.page.cached_history=this.ws.queue.generate("edit",n,!0));const i=await e.page.cached_history;if(!t.aborted){o.innerHTML="";for(const e of i.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp))){var a;const t=document.createElement("div");t.className="queue-item no-transition",t.classList.toggle("current",e.id===(null!==(a=this.ws.queue.current.item.revid)&&void 0!==a?a:this.ws.queue.current.item.id)),t.innerHTML=this.generateItemHTML(e),o.appendChild(t),t.addEventListener("mouseover",()=>this.ws.queue.propagate(e,!0)),t.addEventListener("click",()=>this.ws.queue.loadFromItem(e)),t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e)),requestAnimationFrame(()=>t.classList.remove("no-transition"))}}})(a.signal).catch(e=>{a.signal.aborted||console.error("Error loading history:",e)})}this.updateDiffDisplay(e,!1)}updateDiffDisplay(e,t){var n;const s=document.querySelector("#diff-container");if(!e)return document.querySelector("#diff-scroll-up").classList.add("hidden"),void document.querySelector("#diff-scroll-down").classList.add("hidden");if("loading"===e){const e=document.createElement("div");e.className="loading-container";const t=document.createElement("div");t.className="loading-spinner",e.appendChild(t);const n=document.createElement("i");n.className="fas fa-spinner fa-spin",t.appendChild(n);const i=document.createElement("div");return i.className="loading-text animate-loading-dots",i.textContent="Loading edit",e.appendChild(i),void(s.innerHTML=e.outerHTML)}switch(document.querySelectorAll("#right-top > .tabs > .tab.selected").forEach(e=>e.classList.remove("selected")),this.generateEditDetails(e,t),c.Queue.groups[e.type]){case"edit":var i,a;if(this.ws.queue.pending.get(e.id))s.innerHTML=`<table>${null!==(i=e.diff)&&void 0!==i?i:"<em>No diff available</em>"}</table>`;else if(t&&(null===(a=e.consecutive)||void 0===a?void 0:a.count)>1){var r,o;document.querySelector("#consecutive-edits-tab").classList.add("selected"),null===(r=e.consecutive.diff)||void 0===r||r?s.innerHTML=`<table>${null!==(o=e.consecutive.diff)&&void 0!==o?o:"<em>No diff available</em>"}</table>`:s.innerHTML="<table><em>No difference</em></table>"}else{var l;document.querySelector("#latest-edits-tab").classList.add("selected"),s.innerHTML=`<table>${null!==(l=e.diff)&&void 0!==l?l:"<em>No diff available</em>"}</table>`}if(this.ws.store.settings.username_highlighting.enabled){const t=this.ws.api.username;t&&(e.mentions.diff&&s.querySelectorAll("td").forEach(e=>{e.textContent&&this.ws.util.match(t,e.textContent)&&e.classList.add("ws-username-highlight")}),e.mentions.comment&&e.comment&&this.ws.util.match(t,e.comment)&&document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"))}break;case"logevent":if("users"===e.type){s.innerHTML="";const t=e.user.profanity,n=document.createElement("div");n.classList.add("profanity"),s.appendChild(n);const i=document.createElement("div");{i.classList.add("profanity-header"),n.appendChild(i);const e=document.createElement("div");{e.classList.add("profanity-score"),i.appendChild(e);const n=document.createElement("span");n.classList.add("score-label"),n.textContent="Profanity Score:",e.appendChild(n);const s=document.createElement("span");s.classList.add("score-value"),s.textContent=t.finalScore,e.appendChild(s)}const s=document.createElement("div");{s.classList.add("profanity-risk",`risk-${t.risk.toLowerCase()}`),i.appendChild(s);const e=document.createElement("span");switch(e.classList.add("fa"),t.risk){case"No":e.classList.add("fa-smile");break;case"Low":e.classList.add("fa-thumbs-up");break;case"Medium":e.classList.add("fa-meh");break;case"High":e.classList.add("fa-thumbs-down");break;case"Critical":e.classList.add("fa-skull-crossbones")}s.appendChild(e);const n=document.createElement("span");n.textContent=`${t.risk} risk`,s.appendChild(n)}}const a=t.matches;if(a.length>0){const e=document.createElement("div");e.classList.add("profanity-matches-header"),n.appendChild(e);const t=document.createElement("span");t.classList.add("fa","fa-search"),e.appendChild(t);const s=document.createElement("span");s.textContent=`Matched Terms (${a.length})`,e.appendChild(s);const i=document.createElement("div");i.classList.add("profanity-matches-list"),n.appendChild(i);for(const e of a){const t=document.createElement("div");{t.classList.add("profanity-match"),i.appendChild(t);const n=document.createElement("div");{n.classList.add("match-header"),t.appendChild(n);const s=document.createElement("span");s.classList.add("match-text"),s.textContent=e.match,n.appendChild(s);const i=document.createElement("span");i.classList.add("fa","fa-arrow-right"),n.appendChild(i);const a=document.createElement("span");a.classList.add("match-name"),a.textContent=e.name,n.appendChild(a)}const s=document.createElement("div");{s.classList.add("match-details"),t.appendChild(s);const n=document.createElement("div");{n.classList.add("match-stat"),s.appendChild(n);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Confidence",n.appendChild(t);const i=document.createElement("span");i.classList.add("stat-value"),i.dataset.tooltip="How certain we are this is a match.",i.dataset.tooltipDelay=500,i.textContent=`${Math.round(100*e.confidence)}%`,n.appendChild(i)}const i=document.createElement("div");{i.classList.add("match-stat"),s.appendChild(i);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Obfuscation",i.appendChild(t);const n=document.createElement("span");n.classList.add("stat-value"),n.dataset.tooltip="How much the term was altered from its original form.",n.dataset.tooltipDelay=500,n.textContent=`${Math.round(100*e.obfuscation)}%`,i.appendChild(n)}const a=document.createElement("div");{a.classList.add("match-stat"),s.appendChild(a);const t=document.createElement("span");t.classList.add("stat-label"),t.textContent="Severity",a.appendChild(t);const n=document.createElement("span");n.classList.add("stat-value",`severity-${e.severity}`),n.dataset.tooltip="How severe this term is considered.",n.dataset.tooltipDelay=500,n.textContent=e.severity,a.appendChild(n)}}if(e.note){const n=document.createElement("div");{n.classList.add("match-note"),t.appendChild(n);const s=document.createElement("span");s.classList.add("fa","fa-info-circle"),n.appendChild(s);const i=document.createElement("span");i.classList.add("note-text"),i.textContent=e.note,n.appendChild(i)}}}t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e))}}else{const e=document.createElement("div");e.classList.add("profanity-no-matches"),n.appendChild(e);const t=document.createElement("span");t.classList.add("fa","fa-check-circle"),e.appendChild(t);const s=document.createElement("span");s.textContent="No profanity detected.",e.appendChild(s)}}break;case"abuselog":var d;if(s.innerHTML=`<table>${null!==(d=e.diff)&&void 0!==d?d:"<em>No diff available</em>"}</table>`,this.ws.store.settings.username_highlighting.enabled){const t=this.ws.api.username;t&&(e.mentions.diff&&s.querySelectorAll("td").forEach(e=>{e.textContent&&this.ws.util.match(t,e.textContent)&&e.classList.add("ws-username-highlight")}),e.mentions.comment&&e.comment&&this.ws.util.match(t,e.comment)&&document.querySelector("#edit-details > .subheader > .item-comment > .text").classList.add("ws-username-highlight"))}}s.querySelectorAll(":is(.mw-diff-movedpara-left, .mw-diff-movedpara-right)").forEach(e=>{const t=e.href.split("#")[1];delete e.href,e.innerHTML=e.classList.contains("mw-diff-movedpara-left")?">":"<",e.addEventListener("click",e=>{e.preventDefault();const n=s.querySelector(`a[name="${t}"]`);if(n){const e=n.getBoundingClientRect(),t=s.getBoundingClientRect(),i=e.top-t.top+s.scrollTop-(t.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),s.querySelectorAll(".flash-highlight").forEach(e=>e.classList.remove("flash-highlight"));const a=n.parentElement.parentElement;a.classList.add("flash-highlight"),setTimeout(()=>{var e;return null==a||null===(e=a.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)}})});const u=s.querySelectorAll(".diff-addedline, .diff-deletedline"),p=null!==(n=s.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange")[0])&&void 0!==n?n:u[0];p?requestAnimationFrame(()=>{const e=p.getBoundingClientRect(),t=s.getBoundingClientRect(),n=e.top-t.top+s.scrollTop-(t.height-e.height)/2;function i(){const e=s.querySelectorAll(":is(.diff-addedline, .diff-deletedline) .diffchange");let t=null,n=null;const i=s.getBoundingClientRect();for(const s of e){let e=!1,a=!1;const r=s.getBoundingClientRect();r.bottom<i.top&&(e=!0),r.top>i.bottom&&(a=!0),e&&a||(e&&(t=s),null===n&&a&&(n=s))}const a=document.querySelector("#diff-scroll-up");a.classList.toggle("hidden",!t),a.onclick=()=>{const e=t.getBoundingClientRect(),n=s.getBoundingClientRect(),i=e.top-n.top+s.scrollTop-(n.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),t.classList.add("flash-highlight"),setTimeout(()=>{var e;return null===(e=t)||void 0===e||null===(e=e.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)};const r=document.querySelector("#diff-scroll-down");r.classList.toggle("hidden",!n),r.onclick=()=>{const e=n.getBoundingClientRect(),t=s.getBoundingClientRect(),i=e.top-t.top+s.scrollTop-(t.height-e.height)/2;s.scrollTo({top:Math.max(0,i),behavior:"smooth"}),n.classList.add("flash-highlight"),setTimeout(()=>{var e;return null===(e=n)||void 0===e||null===(e=e.classList)||void 0===e?void 0:e.remove("flash-highlight")},3e3)}}s.scrollTo({top:Math.max(0,n),behavior:"smooth"}),i(),s.onscroll=()=>requestAnimationFrame(i),window.onresize=()=>requestAnimationFrame(i)}):(document.querySelector("#diff-scroll-up").classList.add("hidden"),document.querySelector("#diff-scroll-down").classList.add("hidden"))}updateAIAnalysisDisplay(e){const t=document.querySelector("#ai-analysis-container");if(!t||!e)return t.classList.add("hidden");if(t.classList.remove("hidden"),e.error){const n=t.querySelector(":scope > .header > .assessment");n.textContent="Error",n.className="assessment error",t.querySelector(":scope > .header > .confidence").textContent="",t.querySelector(":scope > .explanation").textContent=e.error;t.querySelector(":scope > .issues").innerHTML=""}else{const n=t.querySelector(":scope > .header > .assessment");n.textContent=e.assessment,n.className=`assessment ${e.assessment.toLowerCase().replace(/\s+/g,"-")}`,t.querySelector(":scope > .header > .confidence").textContent=`${Math.round(100*(e.confidence||0))}% confidence`;const s=function(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}(v,this,b).call(this,e.explanation||"No explanation provided.");t.querySelector(":scope > .explanation").innerHTML=s;const i=t.querySelector(":scope > .issues");i.innerHTML="";for(const t of e.issues||[]){const e=document.createElement("div");e.classList.add("issue",t.severity.toLowerCase().replace(/\s+/g,"-")),e.textContent=t.policy,i.appendChild(e)}t.querySelectorAll("[data-tooltip]").forEach(e=>this.addTooltipListener(e))}}async outdated(e){let t=e.type,n=e.id;if("abuselog"===t&&e.revid&&(t="edit",n=e.revid),"edit"!==c.Queue.groups[t])return this.toggleOutdatedNotice(!1),void this.togglePendingNotice(!1);if("pending"===e.type)return this.togglePendingNotice(!this.ws.queue.pending.has(n),!0);if(!e.pending&&"pending"===this.ws.queue.type)return this.togglePendingNotice(!0,!1);try{var s;const t=(await this.ws.api.getLatestIds([e.page.title]))[e.page.title];(null===(s=this.ws.queue.current.item)||void 0===s?void 0:s.id)===e.id&&this.toggleOutdatedNotice(t>n,t,e.page.title,n)}catch(e){console.error("Error checking if edit is outdated:",e),this.toggleOutdatedNotice(!1)}}startOutdatedCheck(e){this.stopOutdatedCheck(),this.outdated(e),this.intervals.outdated=setInterval(()=>{var t;e.id===(null===(t=this.ws.queue.current.item)||void 0===t?void 0:t.id)?this.outdated(e):this.stopOutdatedCheck()},1e3)}stopOutdatedCheck(){this.intervals.outdated&&(clearInterval(this.intervals.outdated),this.intervals.outdated=null),this.toggleOutdatedNotice(!1),this.togglePendingNotice(!1)}toggleEditWarNotice(e,t){const n=document.querySelector("#edit-war-notice");if(null!=e||(e=!n),e!==Boolean(n))if(e){const e=document.createElement("div");e.id="edit-war-notice",e.classList.add("notice","edit-war");const n=document.createElement("span");n.classList.add("fa","fa-warning"),e.appendChild(n);const s=document.createElement("span");s.classList.add("text"),s.innerHTML=`<b>3RR:</b> You have made ${t} reverts on this page in the last 24 hours.`,e.appendChild(s);const i=document.querySelector("#diff-container");i.parentElement.insertBefore(e,i)}else{const e=document.querySelector("#edit-war-notice");e&&e.remove()}}toggleOutdatedNotice(e,t,n,s){const i=document.querySelector("#outdated-notice");if(null!=e||(e=!i),e!==Boolean(i))if(e){const e=document.createElement("div");e.id="outdated-notice",e.classList.add("notice","outdated"),e.dataset.id=t,e.dataset.page=n;const s=document.createElement("span");s.classList.add("fa","fa-clock-rotate-left"),e.appendChild(s);const i=document.createElement("span");i.classList.add("text"),i.textContent="Newer revision available on this page.",e.appendChild(i);const a=document.createElement("span");a.classList.add("button"),a.innerHTML="<i class='fas fa-redo restore'></i> Restore this revision",a.addEventListener("click",async e=>{e.preventDefault();const t=await this.dialog.input("Restore Edit","Are you sure you want to restore this revision? This will create a new edit that reverts the page to this revision.","Edit summary (optional)","");null!==t&&this.ws.execute({actions:[{name:"restore-edit",params:{summary:t}}]})}),e.appendChild(a);const r=document.createElement("span");r.classList.add("button"),r.innerHTML="View latest <i class='fas fa-arrow-right'></i>",r.addEventListener("click",t=>{t.preventDefault();const n=e.dataset.page,s=+e.dataset.id;n&&s&&this.ws.queue.loadFromRevision(n,s)}),e.appendChild(r);const o=document.querySelector("#diff-container");o.parentElement.insertBefore(e,o)}else{const e=document.querySelector("#outdated-notice");e&&e.remove()}else i&&(i.dataset.id=t,i.dataset.page=n)}togglePendingNotice(e,t){const n=document.querySelector("#pending-notice");if(null!=e||(e=!n),e!==Boolean(n))if(e){const e=document.createElement("div");e.id="pending-notice",e.classList.add("notice","outdated","pending");const n=document.createElement("span");n.classList.add("fa","fa-shield-alt"),e.appendChild(n);const s=document.createElement("span");s.classList.add("text"),s.textContent=t?"This revision cannot be reviewed because it is outdated":"This revision cannot be reviewed because it is not pending review",e.appendChild(s);const i=document.querySelector("#diff-container");i.parentElement.insertBefore(e,i)}else{const e=document.querySelector("#pending-notice");e&&e.remove()}}getORESColor(e){if(isNaN(e)||e<0)return"rgba(128, 128, 128, .5)";e=Math.min(Math.max(e||0,0),1);const t=f.palettes[this.ws.store.UI.theme.palette];return t[e*(t.length-1)|0]}updatePalette(){document.querySelectorAll("[data-ores]").forEach(e=>{e.style.setProperty("--ores-color",this.getORESColor(parseFloat(e.dataset.ores)))})}updateZenMode(){this.ws.notifications.count();const e=this.ws.store.settings.zen_mode;e.enabled&&e.music.enabled?this.ws.audio.zengine.start():this.ws.audio.zengine.stop(),document.querySelectorAll("[data-zen-show]").forEach(t=>{const n=t.dataset.zenShow.split(",");e.enabled&&!n.some(t=>{var n;return null===(n=e[t])||void 0===n?void 0:n.enabled})?t.style.display="none":t.style.display=""})}updateAccessibility(){document.body.classList.toggle("colorblind-mode",this.ws.store.settings.accessibility.colorblind),document.body.classList.toggle("dyslexia-font",this.ws.store.settings.accessibility.dyslexia),document.body.classList.toggle("high-contrast",this.ws.store.settings.accessibility.high_contrast),document.body.classList.toggle("reduce-motion",this.ws.store.settings.accessibility.reduce_motion)}reorderQueues(){var e;const t=c.Queue.types.map(e=>({name:e,...this.ws.store.settings.queue[e]}));t.sort((e,t)=>e.order-t.order),t.forEach(e=>{const t=document.querySelector(`#queue-tab-${e.name}`);t&&(t.style.display=e.enabled?"":"none",t.parentElement.appendChild(t))});const n=t.find(e=>e.name===this.ws.queue.current.type)?this.ws.queue.current.type:null===(e=t.find(e=>e.enabled))||void 0===e?void 0:e.name;if(n)this.ws.queue.switch(n);else{const e=document.createElement("div");e.classList.add("queue-empty"),e.textContent="No items in queue",document.querySelector("#queue-items").innerHTML=e.outerHTML,this.newCurrentItem(null),this.ws.queue.switch("void")}}updateQueueTabs(e=c.Queue.types){const t=this.ws.queue.queues;e.forEach(e=>{const n=document.querySelector(`#queue-tab-${e}`);if(!n||!t[e])return;const s=n.querySelector(":scope > span > .icon-count"),i=t[e].queue.length;s.classList.toggle("hidden",0===i),s.textContent=i,n.classList.toggle("mentions-me",this.ws.store.settings.username_highlighting.enabled&&t[e].queue.some(e=>e.mentions.has))})}createTooltip(e,t="",n="",s=!1,i=10,a=null){const r=document.createElement("div");r.className=`tooltip ${t}`,r.style.opacity=0,s?r.innerHTML=n:r.textContent=n,document.body.querySelector("#app").appendChild(r),"function"==typeof a&&a(r),r.offsetHeight;const o=r.getBoundingClientRect(),l=o.width,d=o.height,c=e.getBoundingClientRect(),u=innerWidth,p=innerHeight,g=[["bottom",(c.left+c.right)/2-l/2,c.bottom+10,!0],["top",(c.left+c.right)/2-l/2,c.top-d-10,!0],["right",c.right+10,(c.top+c.bottom)/2-d/2,!0],["left",c.left-l-10,(c.top+c.bottom)/2-d/2,!0]];let h=null,m=-1/0;for(const[e,t,n,s]of g){let e=t,i=n;if(e>=0&&e+l<=u&&i>=0&&i+d<=p){m=100,h=[e,i];break}if(s){const s=Math.max(0,Math.min(e,u-l)),a=Math.max(0,Math.min(i,p-d)),r=!(s+l<=c.left||s>=c.right||a+d<=c.top||a>=c.bottom),o=Math.abs(s-t)+Math.abs(a-n),g=r?-50-o:50-o/10;g>m&&(m=g,h=[s,a])}}return h?(r.style.left=`${h[0]}px`,r.style.top=`${h[1]}px`):(r.style.left=`${Math.max(0,Math.min((c.left+c.right)/2-l/2,u-l))}px`,r.style.top=`${Math.max(0,Math.min((c.top+c.bottom)/2-d/2,p-d))}px`),e.addEventListener("mousewheel",e=>r.scrollBy({left:e.deltaX,top:e.deltaY,behavior:"smooth"})),setTimeout(()=>r.style.opacity=1,i),r}removeTooltips(){document.querySelectorAll(".tooltip").forEach(e=>e.remove())}addTooltipListener(e){if(!e.dataset.tooltip)return;let t;e.addEventListener("mouseenter",()=>{e.dataset.tooltip&&(t&&t.remove(),t=this.createTooltip(e,"",e.dataset.tooltip,"true"===e.dataset.tooltipHtml,+e.dataset.tooltipDelay||100))}),e.addEventListener("mouseleave",()=>{t&&(t.remove(),t=null)})}positionBottomMenu(e,t){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="";const n=()=>{if(!t.classList.contains("show"))return;const s=t.getBoundingClientRect(),i=e.getBoundingClientRect(),a=innerWidth,r=innerHeight;i.left+s.width<=a?(t.style.left=`${i.left}px`,t.style.right="auto"):(t.style.right=a-i.right+"px",t.style.left="auto");i.top>=s.height?(t.style.bottom=r-i.top+"px",t.style.top="auto"):(t.style.top=`${i.bottom}px`,t.style.bottom="auto"),requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionSubmenu(e,t){e.style.left="",e.style.right="",e.style.top="",e.style.bottom="";const n=()=>{if(!e.classList.contains("show"))return;const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left;o<s.width+20&&l>o&&(e.style.left="auto",e.style.right="calc(100% + 4px)");const d=r-i.bottom,c=i.top;s.bottom>r&&c>d&&(e.style.top="auto",e.style.bottom="0"),requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionLevelsMenu(e,t){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="";const n=()=>{if(!t.classList.contains("show"))return;const s=t.getBoundingClientRect(),i=e.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left,d=o>=s.width+8,c=l>=s.width+8;d?(t.style.left=`${i.right+8}px`,t.style.right="auto"):c?(t.style.right=a-i.left+8+"px",t.style.left="auto"):o>l?(t.style.left=`${i.right+8}px`,t.style.right="auto"):(t.style.right=a-i.left+8+"px",t.style.left="auto");const u=Math.max(Math.min(i.top+(i.height-s.height)/2,r-s.height-8),8);t.style.top=`${u}px`,t.style.bottom="auto",requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}positionWarningSubmenu(e,t){e.style.left="",e.style.right="",e.style.top="",e.style.bottom="";const n=()=>{if(!e.classList.contains("show"))return;const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),a=innerWidth,r=innerHeight,o=a-i.right,l=i.left,d=o>=s.width+8,c=l>=s.width+8;d?(e.style.left=`${i.right+8}px`,e.style.right="auto"):c?(e.style.right=a-i.left+8+"px",e.style.left="auto"):o>l?(e.style.left=`${i.right+8}px`,e.style.right="auto"):(e.style.right=a-i.left+8+"px",e.style.left="auto");const u=Math.max(Math.min(i.top+(i.height-s.height)/2,r-s.height-8),8);e.style.top=`${u}px`,e.style.bottom="auto",requestAnimationFrame(()=>n())};requestAnimationFrame(()=>n())}createWarningItem(e,t,n,s,i=!1){const a=this.ws.store.favorite[s],r=document.createElement("div");r.classList.add("warning-menu-item"),i?(r.draggable=!0,r.classList.add("favorite-item")):r.classList.add("submenu-option"),r.dataset.warning=e.title;const o=document.createElement("span");o.classList.add("favorite-star"),a.includes(e.title)?(o.classList.add("favorited"),o.innerHTML="<i class='fas fa-star'></i>"):o.innerHTML="<i class='fa-regular fa-star'></i>",r.appendChild(o),o.addEventListener("click",t=>{t.stopPropagation();const n=a.indexOf(e.title),l="reverts"===s?document.querySelector("#revert-menu > .warning-menu"):document.querySelector("#warn-menu > .warning-menu");if(-1===n){a.push(e.title),o.classList.add("favorited","spin"),o.innerHTML="<i class='fas fa-star'></i>";let t=l.querySelector(".favorites-section");if(!t){t=document.createElement("div"),t.className="favorites-section";const e=document.createElement("div");e.className="favorites-header",e.innerHTML='<span class="icon fas fa-star"></span><span>Favorites</span>',t.appendChild(e);const n=document.createElement("div");n.className="favorites-container",t.appendChild(n),l.insertBefore(t,l.firstChild);const s=document.createElement("div");s.className="favorites-separator",l.insertBefore(s,t.nextSibling)}const n=l.__executeCallbacks__;n&&t.querySelector(".favorites-container").appendChild(this.createWarningItem(e,n.executeWithWarn,n.executeNoWarn,s,!0))}else if(a.splice(n,1),o.classList.remove("favorited"),o.classList.add("spin"),o.innerHTML="<i class='fa-regular fa-star'></i>",i){r.remove();const t=l.querySelector(".favorites-section");var d;if(0===(null==t?void 0:t.querySelector(".favorites-container").children.length))t.remove(),null===(d=l.querySelector(".favorites-separator"))||void 0===d||d.remove();const n=document.body.querySelector(`.warning-menu-item:not(.favorite-item)[data-warning="${e.title}"]`);if(n){const e=n.querySelector(".favorite-star");e.classList.remove("favorited"),e.innerHTML="<i class='fa-regular fa-star'></i>",e.classList.add("spin"),setTimeout(()=>e.classList.remove("spin"),500)}}else{const t=l.querySelector(".favorites-section");if(t){const n=t.querySelector(`[data-warning="${e.title}"]`);var c;if(n)if(n.remove(),0===t.querySelector(".favorites-container").children.length)t.remove(),null===(c=l.querySelector(".favorites-separator"))||void 0===c||c.remove()}}setTimeout(()=>o.classList.remove("spin"),500)});const l=document.createElement("span");l.className=`icon ${e.icon}`,r.appendChild(l);const d=document.createElement("span");d.className="warning-menu-title",d.textContent=e.title,r.appendChild(d);const c=document.createElement("span");if(c.className="fas fa-circle-question",c.dataset.tooltip=`${e.description} (click for template preview)`,r.appendChild(c),this.addTooltipListener(c),c.addEventListener("click",async t=>{t.preventDefault(),t.stopPropagation();const n=this.ws;this.dialog.show(e.title,async function(){return(await Promise.allSettled(e.templates.map(e=>{const t=n.queue.current.item;return n.api.parse(`{{${e.template}|${t.page.title}}}`,`User:${t.user.name}`,!0)}))).map(e=>{let t="";t="fulfilled"===e.status?e.value:`<em>Error loading template preview: ${e.reason}</em>`;const s=(new DOMParser).parseFromString(t,"text/html").body;return s.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${n.server}`).href)}),s.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${n.server}`).href)}),s.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,s]=e.trim().split(/\s+/,2),i=new URL(t,`https://${n.server}`).href;return s?`${i} ${s}`:i}).join(", ");e.setAttribute("srcset",t)}),s.innerHTML}).join("<div style='height: 1px; background: #0004; margin: 8px 0;'></div>")}())}),!i){const i=document.createElement("div");if(i.classList.add("warning-menu-buttons"),"reverts"===s){const t=document.createElement("span");t.className="warning-menu-button warning-menu-no-warn-button",t.textContent="no warn",i.appendChild(t),t.addEventListener("click",async t=>{t.stopPropagation(),await n(e.title)})}const a=document.createElement("span");a.className="warning-menu-button warning-menu-levels-button",a.textContent="advanced",i.appendChild(a),r.appendChild(i);const o=document.createElement("div");o.className="levels-menu";for(const n of e.templates){if(n.generic)continue;const s=document.createElement("span");s.className=`levels-menu-item colorize-level colorize-level-${n.name}`,s.textContent=n.name,o.appendChild(s),s.addEventListener("click",async()=>await t(e.title,n.name))}document.body.querySelector("#app").appendChild(o),a.addEventListener("click",e=>{e.stopPropagation();const t=o.classList.contains("show");document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show")),t||(o.classList.add("show"),this.positionLevelsMenu(a,o))})}return r.addEventListener("click",async n=>{n.target.closest(".warning-menu-button")||n.target.closest(".favorite-star")||await t(e.title,"auto")}),i&&(r.addEventListener("dragstart",t=>{t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e.title),r.classList.add("dragging")}),r.addEventListener("dragend",()=>{r.classList.remove("dragging")}),r.addEventListener("dragover",e=>{e.preventDefault(),e.dataTransfer.dropEffect="move";const t=document.querySelector(".dragging");if(t&&t!==r){const n=r.getBoundingClientRect(),s=n.top+n.height/2;e.clientY<s?r.parentNode.insertBefore(t,r):r.parentNode.insertBefore(t,r.nextSibling)}}),r.addEventListener("drop",e=>{e.preventDefault();const t=Array.from(r.closest(".favorites-section").querySelectorAll(".favorite-item"));this.ws.store.favorite[s]=t.map(e=>e.dataset.warning)})),r}createWarnMenu(e,t,n){var s,i,a;removeEventListener("keydown",this.warningMenuKeyListener),document.querySelectorAll(".levels-menu").forEach(e=>e.remove()),document.querySelectorAll(".warning-submenu").forEach(e=>e.remove());const r=document.createElement("div");r.className="warning-menu",t.appendChild(r),r.addEventListener("click",e=>{e.target.closest(".warning-submenu")||document.body.querySelectorAll(".warning-submenu.show").forEach(e=>e.classList.remove("show")),e.target.closest(".levels-menu")||document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show"))});const o=async(t,n)=>{const s=(0,u.getWarningFromLookup)(t),i=this.ws.store.settings.auto_report;await this.ws.execute({actions:[{name:"next-item",params:{}},"reverts"===e?{name:"rollback-edit",params:{summary:s.summary}}:{},{name:"warn-user",params:{warning:t,level:n}},{name:"highlight-user",params:{}}].concat(i.enabled&&s.reportable&&i.for.has(t)?[{name:"if",condition:{name:"user-final-warning"},actions:[{name:"report-user-to-aiv",params:{reportMessage:"Vandalism past final warning"}}]}]:[])})},l=async e=>{const t=(0,u.getWarningFromLookup)(e);await this.ws.execute({actions:[{name:"next-item",params:{}},{name:"rollback-edit",params:{summary:t.summary}}]})},d=null!==(s=null===(i=this.ws.queue.current.item)||void 0===i?void 0:i.type)&&void 0!==s?s:this.ws.queue.current.type;let p=c.Queue.groups[d];if("abuselog"===d&&null!==(a=this.ws.queue.current.item)&&void 0!==a&&a.revid&&(p="edit"),r.__executeCallbacks__={executeWithWarn:o,executeNoWarn:l},this.ws.store.favorite.reverts.length>0){const t=document.createElement("div");t.className="favorites-section";const s=document.createElement("div");s.className="favorites-header",s.innerHTML='<span class="icon fas fa-star"></span><span>Favorites</span>',t.appendChild(s);const i=document.createElement("div");i.className="favorites-container",t.appendChild(i);const a=Object.values(u.warningsLookup).filter(e=>e.queueType.includes(p)&&(!n||"function"!=typeof e.show||e.show(n)));for(const t of this.ws.store.favorite[e]){const n=a.find(e=>e.title===t);if(n){const t=this.createWarningItem(n,o,l,e,!0);i.appendChild(t)}}r.appendChild(t);const d=document.createElement("div");d.className="favorites-separator",r.appendChild(d)}let g=0;for(const[,t]of Object.entries(u.warnings)){let s=0;const i=[];for(const e of t.warnings)("function"!=typeof e.show||e.show(n))&&e.queueType.includes(p)&&(i.push(e),s++,g++);if(0===s)continue;const a=document.createElement("div");a.className="menu-option submenu-trigger";const d=document.createElement("span");d.className=`icon ${t.icon}`,a.appendChild(d);const c=document.createElement("span");c.textContent=t.title,a.appendChild(c);const u=document.createElement("span");u.className="submenu-arrow fas fa-chevron-right",a.appendChild(u),r.appendChild(a);const h=document.createElement("div");h.className="warning-submenu submenu",document.body.querySelector("#app").appendChild(h);for(const t of i){const n=this.createWarningItem(t,o,l,e,!1);h.appendChild(n)}a.addEventListener("click",e=>{e.stopPropagation();const t=h.classList.contains("show");document.body.querySelectorAll(".warning-submenu.show").forEach(e=>{e!==h&&(e.classList.remove("show"),document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show")))}),t?(a.classList.remove("focus-opened"),h.classList.remove("show"),document.body.querySelectorAll(".levels-menu.show").forEach(e=>e.classList.remove("show"))):(a.classList.add("focus-opened"),h.classList.add("show"),this.positionWarningSubmenu(h,a))})}if(0===g){const e=document.createElement("div");e.className="warning-menu-no-items",e.textContent="No warnings available for this edit.",r.appendChild(e)}addEventListener("keydown",this.warningMenuKeyListener)}warningMenuKeyListener(e){if("Tab"===e.key){const t=document.querySelector("#warn-menu.show, #revert-menu.show");if(t){if(t.querySelector(":scope > div > .menu-option.focus-opened")){const t=document.body.querySelector(".submenu.show");if(t){const n=t.querySelectorAll(":scope > .warning-menu-item");if(n.length>0){const s=(Array.from(n).indexOf(t.querySelector(".focus-visible"))+(e.shiftKey?-1:1)+n.length)%n.length;document.querySelectorAll(".focus-visible").forEach(e=>e.classList.remove("focus-visible")),n[s].classList.add("focus-visible"),e.preventDefault()}}}else{const n=t.querySelectorAll(":scope > div > .favorites-section > .favorites-container > .warning-menu-item,\n\t\t\t\t\t\t :scope > div > .menu-option");if(n.length>0){const s=(Array.from(n).indexOf(t.querySelector(".focus-visible"))+(e.shiftKey?-1:1)+n.length)%n.length;document.querySelectorAll(".focus-visible").forEach(e=>e.classList.remove("focus-visible")),n[s].classList.add("focus-visible"),e.preventDefault()}}}}else if("Enter"===e.key){if(document.querySelector("#warn-menu.show, #revert-menu.show")){const t=document.querySelector(".focus-visible");t&&(t.click(),e.preventDefault())}}else if("Escape"===e.key){if(document.querySelector("#warn-menu.show, #revert-menu.show")){const t=document.querySelector(".focus-opened");t?(t.classList.remove("focus-opened"),t.classList.add("focus-visible"),t.click()):(document.querySelectorAll(".bottom-tool-menu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".levels-menu").forEach(e=>e.classList.remove("show"))),e.preventDefault()}}}closeMenus(){document.querySelectorAll(".bottom-tool-menu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(e=>e.classList.remove("active")),document.querySelectorAll(".submenu").forEach(e=>e.classList.remove("show")),document.querySelectorAll(".levels-menu").forEach(e=>e.classList.remove("show"))}}function b(e){const t=new Set(["B","I","EM","STRONG","CODE","SPAN","BR"]),n=document.createElement("div");n.innerHTML=e;const s=e=>{const n=[...e.childNodes];for(const e of n)if(e.nodeType===Node.ELEMENT_NODE)if(t.has(e.tagName)){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name);s(e)}else e.replaceWith(...e.childNodes)};return s(n),n.innerHTML}t.GUI=f,m(f,"palettes",{traffic:(0,p.BuildPalette)(1e3,"#78c675","#fdff7a","#fcff54","#fbff12","#ffc619","#ff8812","#f56214","#f73214","#fc0303","#fc0303"),magma:(0,p.BuildPalette)(1e3,"#000004","#1b0c41","#4a0c6b","#781c6d","#a52c60","#cf4446","#ed6925","#fb9b06","#f7d13d","#fcffa4"),plasma:(0,p.BuildPalette)(1e3,"#0d0887","#46039f","#7201a8","#9c179e","#bd3786","#d8576b","#ed7953","#fb9f3a","#fdca26","#f0f921"),viridis:(0,p.BuildPalette)(1e3,"#440154","#3b528b","#21918c","#5ec962","#fde725"),natural:(0,p.BuildPalette)(1e3,"#ffffff","#18ff18"),cool:(0,p.BuildPalette)(1e3,"#ffffff","#1818ff"),heat:(0,p.BuildPalette)(1e3,"#ffffff","#ff1818"),grey:(0,p.BuildPalette)(1e3,"#000000","#ffffff")})},4674(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Notifications=void 0;t.Notifications=class{constructor(e){this.ws=e,this.first={},["alert","message"].forEach(e=>{this[e]=[],this.update(e),this.first[e]=!0,this.load(e)})}find(e,t){if(!1===(null!=e&&e)){let e=this.alert.find(e=>e.id===t);return e?{type:"alert",notification:e}:(e=this.message.find(e=>e.id===t),e?{type:"message",notification:e}:void 0)}return this[e].find(e=>e.id===t)}async load(e){try{const t=(await this.ws.api.continuous({action:"query",meta:"notifications",notlimit:"max",notprop:"list",notfilter:"!read",notsections:e,notformat:"model"})).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.notifications)||void 0===t?void 0:t.list)||[]});await Promise.all(t.map(async e=>this.ws.api.parse(e["*"].body).then(t=>{var n;return null!==(n=void(e["*"].parsed=t))&&void 0!==n?n:e})));let n=!1;for(const s of t)this[e].some(e=>e.id===s.id&&e.read===s.read)||(this[e].unshift(s),n=!0);if(n){const t=this.ws.store.settings.zen_mode;t.enabled&&!t[`${e}s`].enabled||this.ws.audio.playSound(["notification",e]),this.update(e)}}finally{setTimeout(()=>this.load(e),1e4)}}update(e){this.count();const t=this[e],n=t.filter(e=>!e.read),s=this.ws.store.settings.zen_mode;s.enabled&&!s[`${e}s`].enabled||n.filter(e=>!e.seen&&!e.notified).forEach(t=>{t.notified=!0,this.first[e]||electron.sendNotification({title:this.ws.util.textify(t["*"].header),body:this.ws.util.textify(t["*"].body)},t["*"].links.primary.url)}),this.first[e]=!1;const i=document.querySelector(`#${e}s-count`),a=document.querySelector(`#${e}s-list`);i.textContent=n.length,i.classList.toggle("hidden",0===n.length),0===t.length?a.innerHTML=`<div class="notifications-empty">No new ${e}s</div>`:(a.innerHTML="",t.forEach(t=>{const n=t["*"];{const s=document.createElement("div");s.classList.add("notification"),s.classList.add(t.read?"read":"unread"),s.addEventListener("click",()=>{this.read(e,t),this.ws.open(n.links.primary.url)});{const e=document.createElement("div");e.classList.add("notification-icon"),e.innerHTML=`<img src="${new URL(n.iconUrl,`https://${this.ws.server}/`).toString()}" alt="icon">`,s.appendChild(e)}{const e=document.createElement("div");e.classList.add("notification-content"),s.appendChild(e);{const t=document.createElement("div");t.classList.add("notification-header"),t.innerHTML=this.ws.util.truncate(n.header,100),e.appendChild(t)}{const t=document.createElement("div");t.classList.add("notification-body"),t.innerHTML=n.parsed,e.appendChild(t),t.querySelectorAll("[href]").forEach(e=>{const t=e.getAttribute("href");e.setAttribute("href",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[src]").forEach(e=>{const t=e.getAttribute("src");e.setAttribute("src",new URL(t,`https://${this.ws.server}`).href)}),t.querySelectorAll("[srcset]").forEach(e=>{const t=e.getAttribute("srcset").split(",").map(e=>{const[t,n]=e.trim().split(/\s+/,2),s=new URL(t,`https://${this.ws.server}`).href;return n?`${s} ${n}`:s}).join(", ");e.setAttribute("srcset",t)}),t.querySelectorAll("a").forEach(e=>{e.target="_blank"})}{const t=document.createElement("div");t.classList.add("notification-links"),n.links.secondary.forEach(e=>{const n=document.createElement("a");n.href=e.url,n.target="_blank",n.textContent=e.label,t.appendChild(n)}),e.appendChild(t)}}{const n=document.createElement("div");if(n.classList.add("notification-right"),s.appendChild(n),!t.read){const s=document.createElement("div");s.classList.add("notification-unread-indicator"),s.addEventListener("click",n=>{n.stopPropagation(),this.read(e,t)}),n.appendChild(s)}{const e=document.createElement("div");e.classList.add("notification-timestamp"),e.dataset.time=t.timestamp.utciso8601,e.dataset.timeFormat="notification",e.textContent=this.ws.util.formatNotificationTime(new Date(t.timestamp.utciso8601)),n.appendChild(e)}}a.appendChild(s)}}))}seen(e){this.ws.api.postWithToken({action:"echomarkseen",type:e}),this[e].forEach(e=>e.seen=!0)}read(e,t){t?(t.read=!0,this.update(e),this.ws.api.postWithToken({action:"echomarkread",sections:e,list:t.id})):(this[e].forEach(e=>e.read=!0),this.update(e),this.ws.api.postWithToken({action:"echomarkread",sections:e,all:!0}))}count(){var e,t;const n=this.ws.store.settings.zen_mode;let s=0;n.enabled&&!n.alerts.enabled||(s+=(null===(e=this.alert)||void 0===e?void 0:e.filter(e=>!e.read).length)||0),n.enabled&&!n.messages.enabled||(s+=(null===(t=this.message)||void 0===t?void 0:t.filter(e=>!e.read).length)||0),electron.setBadgeCount(s),document.title=s>0?`(${s}) WikiShield`:"WikiShield"}}},6151(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ProgressBar=void 0;t.ProgressBar=class{constructor(){this.$bar=document.createElement("div"),this.$bar.classList.add("progress-bar"),this.$bar.style.opacity=1,document.querySelector("#progress-bar-container").appendChild(this.$bar),this.$overlay=document.createElement("div"),this.$overlay.classList.add("progress-bar-overlay"),this.$overlay.style.width="0%",this.$bar.appendChild(this.$overlay),this.$text=document.createElement("div"),this.$text.classList.add("progress-bar-text"),this.$bar.appendChild(this.$text)}set(e,t,n){this.$text.textContent=e,this.$overlay.style.width=100*Math.min(Math.max(t,0),1)+"%",this.$bar.classList.toggle("error",n),t>=1&&setTimeout(()=>{this.$bar.style.opacity=0,setTimeout(()=>this.$bar.remove(),300)},1700)}}},9117(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Settings=void 0;var s=n(8678),i=n(870),a=n(9808),r=n(985),o=n(372),l=n(7054),d=n(4018),c=(n(9501),n(955)),u=n(5564),p=n(2069),g=n(8469);function h(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function m(e,t,n){return e.set(f(e,t),n),n}function v(e,t){return e.get(f(e,t))}function f(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}var b=new WeakMap,w=new WeakMap,y=new WeakMap;t.Settings=class{constructor(e){h(this,b,void 0),h(this,w,void 0),h(this,y,void 0),this.ws=e,this.ws.api.getTags().then(e=>{this.wikipediaTags=e})}get active(){return document.querySelector("#settings-container > .settings > .settings-right > div:not(.hidden)")}controller(e){const t=e.key.toLowerCase();if(v(b,this)){if("escape"===t)return v(b,this).call(this,"escape",!0);if("control"===t||"shift"===t||"alt"===t||a.controls.has(t))switch(e.preventDefault(),e.type){case"keydown":v(b,this).call(this,(0,a.buildShortcut)(e),!1);break;case"keyup":v(b,this).call(this,(0,a.buildShortcut)(e),!0)}}else"escape"===t&&"keydown"===e.type&&this.close()}collapsible(e,t,n,s=!0){const i=document.createElement("div");i.className="settings-section collapsible",e.appendChild(i);const a=document.createElement("div");a.className="settings-section-header collapse-title",a.textContent=t(s),i.appendChild(a);const r=document.createElement("div");r.className="collapse-content collapsible",i.appendChild(r);const o=document.createElement("div");o.className="settings-section-desc",o.textContent=n,r.appendChild(o),s?(r.style.height="0px",r.style.opacity=0,r.style.overflow="hidden",i.classList.add("collapsed")):(r.style.height="auto",r.style.opacity=1,r.style.overflow="visible",i.classList.remove("collapsed"));let l,d,c,u,p,g,h=!1;const m=e=>{d||(d=e);const t=e-d,n=Math.min(t/300,1),i=(a=n)<.5?2*a*a:(4-2*a)*a-1;var a;const o=c+(p-c)*i,v=u+(g-u)*i;r.style.height=`${o}px`,r.style.opacity=v,n<1?l=requestAnimationFrame(m):(s?r.style.overflow="hidden":(r.style.height="auto",r.style.overflow="visible"),h=!1,l=null,d=null)};return a.addEventListener("click",()=>{if(h){cancelAnimationFrame(l);const e=r.getBoundingClientRect().height;c=e,u=parseFloat(getComputedStyle(r).opacity)}else c=s?0:r.scrollHeight,u=s?0:1;s=!s,a.textContent=t(s),i.classList.toggle("collapsed",s),r.style.overflow="hidden",s?(p=0,g=0):(p=r.scrollHeight,g=1),h=!0,d=null,l=requestAnimationFrame(m)}),r}start(){electron.onOpenChangelog(()=>{var e;return null!==(e=void this.open())&&void 0!==e?e:this.changelog()});let e=0;document.querySelector("#settings-container").addEventListener("click",t=>{"settings-container"!==t.target.id||(e=Math.max(0,e))||this.close()}),document.querySelector("#settings-general-button").addEventListener("click",this.general.bind(this)),document.querySelector("#settings-audio-button").addEventListener("click",this.audio.bind(this)),document.querySelector("#settings-controls-button").addEventListener("click",this.controls.bind(this)),document.querySelector("#settings-zen-button").addEventListener("click",this.zen.bind(this)),document.querySelector("#settings-app-button").addEventListener("click",this.app.bind(this)),document.querySelector("#settings-queue-button").addEventListener("click",this.queue.bind(this)),document.querySelector("#settings-accessibility-button").addEventListener("click",this.accessibility.bind(this)),document.querySelector("#settings-AI-button").addEventListener("click",this.AI.bind(this)),document.querySelector("#settings-auto-reporting-button").addEventListener("click",this.autoReporting.bind(this)),document.querySelector("#settings-gadgets-button").addEventListener("click",this.gadgets.bind(this)),document.querySelector("#settings-whitelist-users-button").addEventListener("click",this.whitelist.bind(this,"user")),document.querySelector("#settings-whitelist-pages-button").addEventListener("click",this.whitelist.bind(this,"page")),document.querySelector("#settings-whitelist-tags-button").addEventListener("click",this.whitelist.bind(this,"tag")),document.querySelector("#settings-highlight-users-button").addEventListener("click",this.highlight.bind(this,"user")),document.querySelector("#settings-highlight-pages-button").addEventListener("click",this.highlight.bind(this,"page")),document.querySelector("#settings-highlight-tags-button").addEventListener("click",this.highlight.bind(this,"tag")),document.querySelector("#settings-statistics-button").addEventListener("click",this.statistics.bind(this)),document.querySelector("#settings-save-button").addEventListener("click",this.save.bind(this)),document.querySelector("#settings-changelog-button").addEventListener("click",this.changelog.bind(this)),document.querySelector("#settings-about-button").addEventListener("click",this.about.bind(this));{const t=document.querySelector("#settings-ores-bias"),n=t.querySelector(".settings-slider-track"),s=t.querySelector(".settings-slider-thumb"),i=t.querySelector(".settings-slider-label-left"),a=i.querySelector(".percent"),r=t.querySelector(".settings-slider-label-right"),o=r.querySelector(".percent"),l=e=>{this.ws.store.settings.queue.ores_bias=+e.toFixed(2),e=Math.max(0,Math.min(100,Math.round(100*e))),s.style.left=`${e}%`,n.style.setProperty("--fill",`${e}%`);const t=100-e;a.textContent=`${t}%`,i.classList.toggle("active",t>0);const l=e;o.textContent=`${l}%`,r.classList.toggle("active",l>0)},d=e=>{const t=n.getBoundingClientRect();return(e.clientX-t.left)/t.width};n.addEventListener("click",e=>l(d(e)));let c=!1;s.addEventListener("mousedown",t=>{t.preventDefault(),c=!0,e++,s.classList.add("dragging")}),window.addEventListener("mousemove",e=>{c&&l(d(e))}),window.addEventListener("mouseup",()=>{c&&(c=!1,e--,s.classList.remove("dragging"))}),l(this.ws.store.settings.queue.ores_bias)}{const e=document.querySelector("#settings-maximum-edit-count");e.value=this.ws.store.settings.queue.max_edits,e.addEventListener("change",e=>{const t=+e.target.value;this.ws.store.settings.queue.max_edits=t;for(const[e,n]of this.ws.queue.bypass.entries())n<=t&&this.ws.queue.bypass.delete(e)});const t=document.querySelector("#settings-maximum-queue-size");t.value=this.ws.store.settings.queue.max_size,t.addEventListener("change",e=>this.ws.store.settings.queue.max_size=+e.target.value);const n=document.querySelector("#settings-minimum-ores-score");n.value=this.ws.store.settings.queue.min_ores,n.addEventListener("change",e=>this.ws.store.settings.queue.min_ores=+e.target.value);const s=document.querySelector("#settings-watchlist-expiry");s.value=this.ws.store.settings.expiry.watchlist,s.addEventListener("change",e=>this.ws.store.settings.expiry.watchlist=e.target.value);const i=document.querySelector("#settings-namespaces-container");i.innerHTML="",d.namespaces.forEach(e=>{const t=document.createElement("div");t.className="namespace-item",t.dataset.namespaceId=e.id,t.innerHTML=`\n\t\t\t\t\t<label class="checkbox-box">\n\t\t\t\t\t\t<input type="checkbox" autoComplete="off">\n\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t</label>\n\t\t\t\t\t<span class="namespace-name">${e.name}</span>\n\t\t\t\t`;const n=t.querySelector("input[type=checkbox]");n.checked=this.ws.store.settings.namespaces.includes(e.id),n.addEventListener("change",t=>{if(t.target.checked)this.ws.store.settings.namespaces.includes(e.id)||this.ws.store.settings.namespaces.push(e.id);else{const t=this.ws.store.settings.namespaces.indexOf(e.id);-1!==t&&this.ws.store.settings.namespaces.splice(t,1)}}),i.appendChild(t)})}{const e=document.querySelector("#settings-ORES-alert-toggle");e.value=this.ws.store.settings.audio.ores_alert.enabled,e.addEventListener("change",t=>{this.ws.store.settings.audio.ores_alert.enabled=e.value});const t=document.querySelector("#settings-ORES-alert-threshold");t.value=this.ws.store.settings.audio.ores_alert.threshold,t.addEventListener("change",e=>{this.ws.store.settings.audio.ores_alert.threshold=+t.value});const n=document.querySelector("#settings-master-volume");n.value=this.ws.store.settings.audio.volume.master,n.addEventListener("change",e=>{this.ws.store.settings.audio.volume.master=+n.value});const s={sound:(e,t,n,s,i)=>{const a=["master",...t].join("."),r=document.createElement("volume-control");r.setAttribute("title",n),r.setAttribute("description",s),i&&r.setPreview(this.ws.audio,t),r.value=this.ws.store.settings.audio.volume[a],r.addEventListener("change",()=>{const e=this.ws.store.settings.audio.volume[a];this.ws.store.settings.audio.volume[a]=r.value,e!==r.value&&this.ws.audio.onvolumechanged()}),e.appendChild(r)},category:(e,t,n,s)=>{const i=["master",...t].join("."),a=this.collapsible(e,e=>n,s,!0),r=document.createElement("volume-control");r.setAttribute("title","Category Volume"),r.value=this.ws.store.settings.audio.volume[i],r.addEventListener("change",()=>{const e=this.ws.store.settings.audio.volume[i];this.ws.store.settings.audio.volume[i]=r.value,e!==r.value&&this.ws.audio.onvolumechanged()}),a.appendChild(r);const o=document.createElement("div");return o.className="settings-content",a.appendChild(o),o}},i=(e,t,n)=>{for(const[r,o]of Object.entries(e))switch(o.type){case"sound":var a;s.sound(n,[...t,r],o.title,o.description,null===(a=o.preview)||void 0===a||a);break;case"category":i(o.properties,[...t,r],s.category(n,[...t,r],o.title,o.description))}};i(this.ws.audio.audio,[],document.querySelector("#settings-sounds-container"))}{const e=document.querySelector("#repeat-control-scripts-toggle");e.value=this.ws.store.settings.repeat_control_scripts,e.addEventListener("change",t=>this.ws.store.settings.repeat_control_scripts=e.value),document.querySelector("#settings-new-control-script").addEventListener("click",async()=>{this.ws.store.control_scripts.unshift({keys:[],actions:[]}),this.controls()})}{const e=document.querySelector("#settings-zen-mode");e.value=this.ws.store.settings.zen_mode.enabled,e.addEventListener("change",t=>{this.ws.store.settings.zen_mode.enabled=e.value,this.ws.gui.updateZenMode()});const t=document.querySelector("#settings-zen-mode-sound");t.value=this.ws.store.settings.zen_mode.sound.enabled,t.addEventListener("change",e=>{this.ws.store.settings.zen_mode.sound.enabled=t.value,this.ws.gui.updateZenMode()});const n=document.querySelector("#settings-zen-mode-music");n.value=this.ws.store.settings.zen_mode.music.enabled,n.addEventListener("change",e=>{this.ws.store.settings.zen_mode.music.enabled=n.value,this.ws.gui.updateZenMode()});const s=document.querySelector("#settings-zen-mode-alerts");s.value=this.ws.store.settings.zen_mode.alerts.enabled,s.addEventListener("change",e=>{this.ws.store.settings.zen_mode.alerts.enabled=s.value,this.ws.gui.updateZenMode()});const i=document.querySelector("#settings-zen-mode-messages");i.value=this.ws.store.settings.zen_mode.messages.enabled,i.addEventListener("change",e=>{this.ws.store.settings.zen_mode.messages.enabled=i.value,this.ws.gui.updateZenMode()});const a=document.querySelector("#settings-zen-mode-toasts");a.value=this.ws.store.settings.zen_mode.toasts.enabled,a.addEventListener("change",e=>{this.ws.store.settings.zen_mode.toasts.enabled=a.value,this.ws.gui.updateZenMode()});const r=document.querySelector("#settings-zen-mode-badges");r.value=this.ws.store.settings.zen_mode.badges.enabled,r.addEventListener("change",e=>{this.ws.store.settings.zen_mode.badges.enabled=r.value,this.ws.gui.updateZenMode()})}if(!window.isElectron){const e=document.querySelector("#settings-launch-behavior");document.querySelectorAll("#settings-launch-behavior .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-launch-behavior [data-value=${electron.localStorage.get("WikiShield:OpenExternally")?"new_tab":"current_tab"}]`).classList.add("selected");const t=e.querySelector("[data-value=current_tab]");t.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),t.classList.add("selected"),electron.localStorage.set("WikiShield:OpenExternally",!1)});const n=e.querySelector("[data-value=new_tab]");n.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"),electron.localStorage.set("WikiShield:OpenExternally",!0)})}{const e=document.querySelector("#settings-startup-performance");document.querySelectorAll("#settings-startup-performance .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected");const t=e.querySelector("[data-value=always_off]");t.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),t.classList.add("selected"),this.ws.store.settings.performance.startup="always_off"});const n=e.querySelector("[data-value=adaptive]");n.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"),this.ws.store.settings.performance.startup="adaptive"});const s=e.querySelector("[data-value=always_on]");s.addEventListener("click",()=>{e.querySelectorAll(".selected").forEach(e=>e.classList.remove("selected")),s.classList.add("selected"),this.ws.store.settings.performance.startup="always_on"})}{const e=document.querySelector("#settings-queues");o.Queue.types.map(e=>({type:e,data:this.ws.store.settings.queue[e]})).sort((e,t)=>e.data.order-t.data.order).forEach(t=>{var n;const s=document.createElement("draggable-order-item");s.setAttribute("key",t.type),s.setAttribute("name",null!==(n={recent:"Recent changes",pending:"Pending changes",users:"User creations",watchlist:"Watchlist",abuselog:"Abuse log"}[t.type])&&void 0!==n?n:t.type),s.enabled=t.data.enabled,e.addItem(s,t.type)}),e.addEventListener("toggle",e=>{var t;const n=null===(t=e.target.closest("draggable-order-item"))||void 0===t?void 0:t.getAttribute("key");n&&(this.ws.store.settings.queue[n].enabled=e.detail.enabled,this.ws.gui.reorderQueues())}),e.addEventListener("reorder",e=>{e.detail.keys.forEach((e,t)=>{this.ws.store.settings.queue[e].order=t,this.ws.gui.reorderQueues()})});const t=document.querySelector("#settings-palette-selector");Object.entries(g.GUI.palettes).forEach(([e,n])=>{const s=document.createElement("div");s.className="palette-option",s.classList.toggle("selected",this.ws.store.UI.theme.palette===e),s.dataset.palette=e,s.addEventListener("click",()=>{document.querySelectorAll(".palette-option.selected").forEach(e=>e.classList.remove("selected")),s.classList.add("selected"),this.ws.store.UI.theme.palette=e,this.ws.gui.updatePalette()}),t.appendChild(s);const i=document.createElement("div");i.className="palette-name",i.textContent=new p.Text(e).case(p.Text.Case.Title).get(),s.appendChild(i);const a=document.createElement("div");a.className="palette-preview",s.appendChild(a);const r=n.length,o=document.createElement("canvas");o.width=r,o.height=1;const l=o.getContext("2d"),d=l.createImageData(r,1);n.forEach((e,t)=>{const n=e.match(/\d+/g).map(e=>parseInt(e,10)),s=4*t;d.data[s]=n[0],d.data[s+1]=n[1],d.data[s+2]=n[2],d.data[s+3]=255}),l.putImageData(d,0,0),a.appendChild(o)})}{const e=document.querySelector("#settings-dyslexia-font");e.value=this.ws.store.settings.accessibility.dyslexia,e.addEventListener("change",t=>{this.ws.store.settings.accessibility.dyslexia=e.value,this.ws.gui.updateAccessibility()});const t=document.querySelector("#settings-reduce-motion");t.value=this.ws.store.settings.accessibility.reduce_motion,t.addEventListener("change",e=>{this.ws.store.settings.accessibility.reduce_motion=t.value,this.ws.gui.updateAccessibility()})}{const e=document.querySelector("#settings-AI-toggle");e.value=this.ws.store.settings.AI.enabled,e.addEventListener("change",t=>{var n;if(null===(n=this.ws.AI)||void 0===n||n.cancel.all(!0),this.ws.store.settings.AI.enabled=e.value,this.ws.store.settings.AI.enabled)if("Ollama"===this.ws.store.settings.AI.provider)this.ws.AI=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);else this.ws.AI=null;else this.ws.AI=null});const t=document.querySelector("#settings-AI-edit-analysis-toggle");t.value=this.ws.store.settings.AI.edit_analysis.enabled,t.addEventListener("change",e=>this.ws.store.settings.AI.edit_analysis.enabled=e.target.value);const n=document.querySelector("#settings-AI-username-analysis-toggle");n.value=this.ws.store.settings.AI.username_analysis.enabled,n.addEventListener("change",e=>this.ws.store.settings.AI.username_analysis.enabled=e.target.value);const i=document.querySelector("#ollama-url-input");i.value=this.ws.store.settings.AI.Ollama.server,i.addEventListener("change",e=>{this.ws.store.settings.AI.Ollama.server=i.value.trim(),"Ollama"===this.ws.store.settings.AI.provider&&this.ws.AI&&this.ws.AI.cancel.all(!0)});const a=document.querySelector("#settings-ollama-test-connection");a.addEventListener("click",async()=>{var e;if(a.disabled)return;a.disabled=!0;const t=document.querySelector("#settings-ollama-connection-status"),n=t.parentElement;let i;if(n.classList.add("testing"),n.classList.remove("connected","failed"),t.classList.add("animate-loading-dots"),t.textContent="Testing connection","Ollama"===this.ws.store.settings.AI.provider)i=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);null===(e=this.ws.AI)||void 0===e||e.cancel.all(!0),i instanceof s.AI&&await i.test()?(n.classList.add("connected"),n.classList.remove("testing","failed"),t.innerHTML="<span class='fa fa-check-circle'></span> Connected!"):(n.classList.add("failed"),n.classList.remove("testing","connected"),t.innerHTML="<span class='fa fa-times-circle'></span> Failed to connect.<br><small>Make sure you have followed the setup instructions (see below)</small>"),t.classList.remove("animate-loading-dots"),a.disabled=!1});const r=document.querySelector("#settings-ollama-refresh-models");r.addEventListener("click",async()=>{var e;if(r.disabled)return;r.disabled=!0;const t=document.querySelector("#settings-ollama-models"),n=document.querySelector("#settings-ollama-models-status"),i=n.parentElement;n.textContent="Searching",i.classList.add("searching","animate-loading-dots"),i.classList.remove("none","error"),null===(e=this.ws.AI)||void 0===e||e.cancel.all(!0);try{let e;if("Ollama"===this.ws.store.settings.AI.provider)e=new s.AI.providers.Ollama(this.ws,this.ws.store.settings.AI.Ollama);const a=e instanceof s.AI&&await e.models()||[];a.length>0?(i.classList.remove("searching","none","error","animate-loading-dots"),n.innerHTML=`<span class="fa fa-check-circle"></span> Found ${a.length} ${new p.Text("model").get(a.length)}.`,t.innerHTML="",a.forEach(e=>{const n=e.name===this.ws.store.settings.AI.Ollama.model,s=document.createElement("div");s.className="model",s.classList.toggle("selected",n),s.dataset.model=e.name,t.appendChild(s);const i=document.createElement("div");i.className="model-top",s.appendChild(i);const a=document.createElement("span");a.className="indicator fa",a.classList.add(n?"fa-check-circle":"fa-circle"),i.appendChild(a);const r=document.createElement("span");r.className="model-name",r.textContent=e.name,i.appendChild(r);const o=document.createElement("span");o.className="psuedo-indicator fa fa-circle",i.appendChild(o);const l=document.createElement("div");l.className="model-bottom",s.appendChild(l);const d=document.createElement("span");d.className="model-size",d.textContent=this.ws.util.formatBytes(e.size),l.appendChild(d);const c=document.createElement("span");c.className="model-modified",c.textContent=new Date(e.modified_at).toLocaleDateString(),l.appendChild(c),s.addEventListener("click",()=>{var n;if(null===(n=this.ws.AI)||void 0===n||n.cancel.all(!0),"Ollama"===this.ws.store.settings.AI.provider)this.ws.store.settings.AI.Ollama.model=e.name;t.querySelectorAll(".model.selected").forEach(e=>{e.classList.remove("selected");const t=e.querySelector(".indicator");t.classList.remove("fa-circle"),t.classList.add("fa-check-circle")}),s.classList.add("selected");const i=s.querySelector(".indicator");i.classList.remove("fa-circle"),i.classList.add("fa-check-circle")})})):(i.classList.add("none"),i.classList.remove("searching","error","animate-loading-dots"),n.textContent="No models found.")}catch(e){i.classList.add("error"),i.classList.remove("searching","none","animate-loading-dots"),n.innerHTML="<span class='fa fa-times-circle'></span> Error fetching models."}r.disabled=!1})}{const e=document.querySelector("#settings-auto-reporting-toggle");e.value=this.ws.store.settings.auto_report.enabled,e.addEventListener("change",t=>{this.ws.store.settings.auto_report.enabled=e.value});const t=document.querySelector("#settings-auto-reporting-warnings-container");Object.entries(c.warningsLookup).filter(([e,t])=>t.reportable).sort((e,t)=>e[1].title.localeCompare(t[1].title)).forEach(([e,n])=>{const s=document.createElement("div");s.className="auto-reportable-warning-item",s.innerHTML=`\n\t\t\t\t\t\t<label class="checkbox-box" data-warning-key="${e}">\n\t\t\t\t\t\t\t<input type="checkbox" autoComplete="off" ${this.ws.store.settings.auto_report.for.has(e)?"checked":""}>\n\t\t\t\t\t\t\t<div class="checkmark"></div>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<span class="checkbox-name">${n.title}</span>\n\t\t\t\t\t`,s.querySelector("input[type=checkbox]").addEventListener("change",t=>{t.target.checked?this.ws.store.settings.auto_report.for.has(e)||this.ws.store.settings.auto_report.for.add(e):this.ws.store.settings.auto_report.for.delete(e)}),t.appendChild(s)})}{const e=document.querySelector("#settings-auto-welcome-toggle");e.value=this.ws.store.settings.auto_welcome.enabled,e.addEventListener("change",t=>{this.ws.store.settings.auto_welcome.enabled=e.value});const t=document.querySelector("#settings-wikipedia-popups-toggle");t.value=this.ws.store.settings.wikipedia_popups.enabled,t.addEventListener("change",e=>{this.ws.store.settings.wikipedia_popups.enabled=t.value});const n=document.querySelector("#talk-page-thanks-for-temporary-users-toggle");n.value=this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled,n.addEventListener("change",e=>{this.ws.store.settings.talk_page_thanks_for_temporary_users.enabled=n.value});const s=document.querySelector("#settings-username-highlighting-toggle");s.value=this.ws.store.settings.username_highlighting.enabled,s.addEventListener("change",e=>{this.ws.store.settings.username_highlighting.enabled=s.value});const i=document.querySelector("#settings-username-highlighting-fuzzy-toggle");i.value=this.ws.store.settings.username_highlighting.fuzzy,i.addEventListener("change",e=>{this.ws.store.settings.username_highlighting.fuzzy=i.value})}{const e=document.querySelector("#settings-save-status");document.querySelector("#settings-export-button").addEventListener("click",async t=>{try{const t=this.ws.export();await electron.copyToClipboard(t),e.classList.remove("hidden","error","info"),e.classList.add("success"),e.innerHTML='\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings exported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">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'}catch(t){e.classList.remove("hidden","success","info"),e.classList.add("error"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Export failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${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`}});document.querySelector("#settings-import-button").addEventListener("click",async t=>{try{const t=await this.ws.gui.dialog.input("Import Settings","Please paste the base64 string of your exported settings below:");if(!t)throw new Error("No input provided.");const n=await this.ws.noinit(t),[s,i]=n.reduce((e,t)=>(t.expected?e[0].push(t):e[1].push(t),e),[[],[]]);e.classList.remove("hidden","error","info"),e.classList.add("success"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-check-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Settings imported successfully!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">\n\t\t\t\t\t\t\t\t\t${i.length>0?`<br><br><strong>Encountered ${new p.Text("%n issue").get(i.length)}:</strong><br>${i.map(e=>`- ${e.message}`).join("<br>")}`:""}\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`}catch(t){e.classList.remove("hidden","success","info"),e.classList.add("error"),e.innerHTML=`\n\t\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t\t<i class="fa fa-times-circle status-icon"></i>\n\t\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t\t<div class="status-title">Import failed!</div>\n\t\t\t\t\t\t\t\t<div class="status-desc">${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`}});document.querySelector("#settings-reset-button").addEventListener("click",async t=>{await this.ws.gui.dialog.confirm("Reset Settings","Are you sure you want to reset all settings to their default values? This action cannot be undone.","Reset Settings",!0)&&(this.ws.noinit("e30="),e.classList.remove("hidden","error","success"),e.classList.add("info"),e.innerHTML='\n\t\t\t\t\t<div class="status-content">\n\t\t\t\t\t\t<i class="fa fa-info-circle status-icon"></i>\n\t\t\t\t\t\t<div class="status-text">\n\t\t\t\t\t\t\t<div class="status-title">Settings reset successfully.</div>\n\t\t\t\t\t\t\t<div class="status-desc">All settings have been restored to their default values.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t')})}document.querySelectorAll("#settings-container > .settings > .settings-right > .about [data-link]").forEach(e=>{e.addEventListener("click",t=>this.ws.open(e.dataset.link,t.altKey))})}update(){document.querySelector("#settings-maximum-edit-count").value=this.ws.store.settings.queue.max_edits,document.querySelector("#settings-maximum-queue-size").value=this.ws.store.settings.queue.max_size,document.querySelector("#settings-minimum-ores-score").value=this.ws.store.settings.queue.min_ores,document.querySelector("#settings-watchlist-expiry").value=this.ws.store.settings.expiry.watchlist,document.querySelectorAll("#settings-namespaces-container .namespace-item").forEach(e=>{const t=parseInt(e.dataset.namespaceId,10);e.querySelector("input[type=checkbox]").checked=this.ws.store.settings.namespaces.includes(t)}),document.querySelector("#settings-zen-mode").value=this.ws.store.settings.zen_mode.enabled,document.querySelector("#settings-zen-mode-sound").value=this.ws.store.settings.zen_mode.sound.enabled,document.querySelector("#settings-zen-mode-music").value=this.ws.store.settings.zen_mode.music.enabled,document.querySelector("#settings-zen-mode-alerts").value=this.ws.store.settings.zen_mode.alerts.enabled,document.querySelector("#settings-zen-mode-messages").value=this.ws.store.settings.zen_mode.messages.enabled,document.querySelector("#settings-zen-mode-toasts").value=this.ws.store.settings.zen_mode.toasts.enabled,document.querySelector("#settings-zen-mode-badges").value=this.ws.store.settings.zen_mode.badges.enabled,document.querySelectorAll("#settings-startup-performance .selected").forEach(e=>e.classList.remove("selected")),document.querySelector(`#settings-startup-performance [data-value=${this.ws.store.settings.performance.startup}]`).classList.add("selected");{const e=document.querySelector("#settings-queues");e.clearItems(),o.Queue.types.map(e=>({type:e,data:this.ws.store.settings.queue[e]})).sort((e,t)=>e.data.order-t.data.order).forEach(t=>{var n;const s=document.createElement("draggable-order-item");s.setAttribute("key",t.type),s.setAttribute("name",null!==(n={recent:"Recent changes",pending:"Pending changes",users:"User creations",watchlist:"Watchlist"}[t.type])&&void 0!==n?n:t.type),s.enabled=t.data.enabled,e.addItem(s,t.type)}),document.querySelectorAll(".palette-option").forEach(e=>{e.classList.toggle("selected",e.dataset.palette===this.ws.store.UI.theme.palette)})}document.querySelector("#settings-AI-toggle").value=this.ws.store.settings.AI.enabled,document.querySelector("#settings-AI-edit-analysis-toggle").value=this.ws.store.settings.AI.edit_analysis.enabled,document.querySelector("#settings-AI-username-analysis-toggle").value=this.ws.store.settings.AI.username_analysis.enabled,document.querySelector("#ollama-url-input").value=this.ws.store.settings.AI.Ollama.server;{const e=document.querySelector("#settings-ollama-connection-status"),t=e.parentElement;e.innerHTML="",t.classList.remove("testing","connected","failed")}{document.querySelector("#settings-ollama-models").querySelectorAll(".model").forEach(e=>e.remove());const e=document.querySelector("#settings-ollama-models-status"),t=e.parentElement;e.innerHTML="",t.classList.remove("searching","none","error")}document.querySelector("#settings-auto-reporting-toggle").value=this.ws.store.settings.auto_report.enabled,document.querySelectorAll("#settings-auto-reporting-warnings-container .auto-reportable-warning-item").forEach(e=>{const t=e.querySelector("label").dataset.warningKey;e.querySelector("input[type=checkbox]").checked=this.ws.store.settings.auto_report.for.has(t)}),document.querySelector("#settings-auto-welcome-toggle").value=this.ws.store.settings.auto_welcome.enabled,document.querySelector("#settings-wikipedia-popups-toggle").value=this.ws.store.settings.wikipedia_popups.enabled,document.querySelector("#settings-username-highlighting-toggle").value=this.ws.store.settings.username_highlighting.enabled,document.querySelector("#settings-username-highlighting-fuzzy-toggle").value=this.ws.store.settings.username_highlighting.fuzzy}open(){document.querySelector("#settings-container").classList.add("show"),this.general(),m(y,this,new Promise(e=>{m(w,this,e)}))}close(){this.deselect(),this.ws.audio.stopPreviews(),document.querySelector("#settings-container").classList.remove("show"),v(w,this)&&(v(w,this).call(this),m(w,this,null))}waitForClose(){return v(y,this)}deselect(){document.querySelectorAll("#settings-container > .settings > .settings-left .settings-left-menu-item.selected").forEach(e=>e.classList.remove("selected")),document.querySelectorAll("#settings-container > .settings > .settings-right > :not(.hidden)").forEach(e=>e.classList.add("hidden"))}general(){this.deselect(),document.querySelector("#settings-general-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .general").classList.remove("hidden")}performance(){this.deselect(),document.querySelector("#settings-performance-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .performance").classList.remove("hidden")}audio(){this.deselect(),document.querySelector("#settings-audio-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .audio").classList.remove("hidden")}controls(){this.deselect(),document.querySelector("#settings-controls-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .controls").classList.remove("hidden");{const e=(t,n)=>{if(n.actions.includes(t))return n;for(const s of n.actions)if("if"===s.name||"if not"===s.name){const n=e(t,s);if(n)return n}return null},t=(n,s,a,o)=>{const l=document.createElement("div");if(l.className="control-action",n.appendChild(l),"if"===s.name||"if not"===s.name){var d,c,p;l.innerHTML=`\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t\t\t${"if"===s.name?"If":"If not"} <select></select> <span class="params"></span> then:\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;const e=l.querySelector("select");Object.entries(i.conditions).forEach(([t,n])=>{e.innerHTML+="title"in n?`<option value="${t}">${n.title}</option>`:`<option value="${t}">${t}</option>`});const n=null!==(d=s.condition)&&void 0!==d?d:{name:Object.keys(i.conditions)[0],params:{}};null!==(c=n.name)&&void 0!==c||(n.name=Object.keys(i.conditions)[0]),null!==(p=n.params)&&void 0!==p||(n.params={}),e.value=n.name,e.addEventListener("change",t=>{n.name=e.value,o()});const r=new Map;for(const e of(0,u.sortDependencies)((null===(g=(h=i.conditions[n.name]).parameters)||void 0===g?void 0:g.call(h))||[])){var g,h;const t=document.createElement("div");t.className="condition-parameter",l.querySelector(".params").appendChild(t);const s={};for(const t of null!==(m=e.dependencies)&&void 0!==m?m:[]){var m;s[t]=n.params[t]}const i="function"==typeof e.default?e.default(s):e.default;let a=null;switch(e.type){case"choice":{const o=document.createElement("select");o.dataset.paramid=e.id,t.appendChild(o);const l="function"==typeof e.options?e.options(s):e.options;for(const e of null!=l?l:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(void 0!==n.params[e.id]){o.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(o.value=i,n.params[e.id]=i);a=()=>{const t={};for(const i of null!==(s=e.dependencies)&&void 0!==s?s:[]){var s;t[i]=n.params[i]}const i=o.value,a="function"==typeof e.options?e.options(t):e.options;o.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(a.includes(i))o.value=i;else{const s="function"==typeof e.default?e.default(t):e.default;o.value=s,n.params[e.id]=s}},o.addEventListener("change",()=>{n.params[e.id]=o.value;for(const t of r.get(e.id)||[])t()})}break;case"text":{const s=document.createElement("input");if(s.type="text",s.dataset.paramid=e.id,t.appendChild(s),void 0!==n.params[e.id]){s.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.value=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=s.value;for(const t of r.get(e.id)||[])t()})}break;case"boolean":{const s=document.createElement("input");if(s.type="checkbox",s.dataset.paramid=e.id,t.appendChild(s),void 0!==n.params[e.id]){s.checked=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.checked=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=s.checked;for(const t of r.get(e.id)||[])t()})}break;case"number":{const s=document.createElement("input");if(s.type="number",s.dataset.paramid=e.id,"min"in e&&(s.min=e.min),"max"in e&&(s.max=e.max),t.appendChild(s),void 0!==n.params[e.id]){s.value=n.params[e.id];for(const t of r.get(e.id)||[])t()}else"default"in e&&(s.value=i,n.params[e.id]=i);s.addEventListener("change",()=>{n.params[e.id]=parseFloat(s.value);for(const t of r.get(e.id)||[])t()})}}if("function"==typeof a)for(const t of null!==(v=e.dependencies)&&void 0!==v?v:[]){var v;r.has(t)||r.set(t,[]),r.get(t).push(a)}}for(const e of s.actions)t(l,e,a,o)}else{const e=r.events[s.name];l.innerHTML=`\n\t\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t\t<span class="${"icon"in e?e.icon:"fas fa-bolt"}"></span>\n\t\t\t\t\t\t\t\t${"title"in e?e.title:s.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="control-action-title-right">\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;const t=new Map;for(const n of(0,u.sortDependencies)((null===(f=e.parameters)||void 0===f?void 0:f.call(e))||[])){var f;const e=document.createElement("div");e.className="action-parameter",e.innerHTML=`<div class="parameter-title">${n.title}</div>`,l.appendChild(e);const i={};for(const e of null!==(b=n.dependencies)&&void 0!==b?b:[]){var b;i[e]=s.params[e]}const a="function"==typeof n.default?n.default(i):n.default;let r=null;switch(n.type){case"choice":{const o=document.createElement("select");o.dataset.paramid=n.id,e.appendChild(o);const l="function"==typeof n.options?n.options(i):n.options;for(const e of null!=l?l:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(void 0!==s.params[n.id]){o.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(o.value=a,s.params[n.id]=a);r=()=>{const e={};for(const i of null!==(t=n.dependencies)&&void 0!==t?t:[]){var t;e[i]=s.params[i]}const i=o.value,a="function"==typeof n.options?n.options(e):n.options;o.innerHTML="";for(const e of null!=a?a:[]){const t=document.createElement("option");t.value=e,t.textContent=e,o.appendChild(t)}if(a.includes(i))o.value=i;else{const t="function"==typeof n.default?n.default(e):n.default;o.value=t,s.params[n.id]=t}},o.addEventListener("change",()=>{s.params[n.id]=o.value;for(const e of t.get(n.id)||[])e()})}break;case"text":{const i=document.createElement("input");if(i.type="text",i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.value=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.value;for(const e of t.get(n.id)||[])e()})}break;case"boolean":{const i=document.createElement("input");if(i.type="checkbox",i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.checked=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.checked=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.checked;for(const e of t.get(n.id)||[])e()})}break;case"duration":{const i=document.createElement("duration-input");if(i.dataset.paramid=n.id,e.appendChild(i),void 0!==s.params[n.id]){i.value=s.params[n.id];for(const e of t.get(n.id)||[])e()}else"default"in n&&(i.value=a,s.params[n.id]=a);i.addEventListener("change",()=>{s.params[n.id]=i.value;for(const e of t.get(n.id)||[])e()})}}if("function"==typeof r)for(const e of null!==(w=n.dependencies)&&void 0!==w?w:[]){var w;t.has(e)||t.set(e,[]),t.get(e).push(r)}}}l.querySelector(".move-action-up").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]);const t=e(s,a),n=t.actions.indexOf(s);if(0===t.actions.indexOf(s)){if("if"!==t.name&&"if not"!==t.name)return;const i=e(t,a);i.actions.splice(i.actions.indexOf(t),0,s),t.actions.splice(n,1)}else{const e=t.actions[n-1];"if"===e.name||"if not"===e.name?(e.actions.push(s),t.actions.splice(n,1)):(t.actions.splice(n,1),t.actions.splice(n-1,0,s))}o()}),l.querySelector(".move-action-down").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]);const t=e(s,a),n=t.actions.indexOf(s);if(t.actions.indexOf(s)===t.actions.length-1){if("if"!==t.name&&"if not"!==t.name)return;const i=e(t,a);i.actions.splice(i.actions.indexOf(t)+1,0,s),t.actions.splice(n,1)}else{const e=t.actions[n+1];"if"===e.name||"if not"===e.name?(e.actions.unshift(s),t.actions.splice(n,1)):(t.actions.splice(n,1),t.actions.splice(n+1,0,s))}o()}),l.querySelector(".delete-action").addEventListener("click",async t=>{if(this.ws.audio.playSound(["ui","click"]),t.shiftKey||await this.ws.gui.dialog.confirm("Delete Action","Are you sure you want to delete this action?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>",null,!0)){const t=e(s,a);t.actions.splice(t.actions.indexOf(s),1),o()}})},n=()=>{const e=new Set,t=new Set;this.ws.store.control_scripts.forEach(n=>{n.keys.forEach(n=>{e.has(n)?t.add(n):e.add(n)})}),document.querySelectorAll(".control-keys div[data-key]").forEach(e=>{e.classList.toggle("duplicate",t.has(e.dataset.key))})},s=(e,o)=>{e.innerHTML='\n\t\t\t\t\t<div class="control-container">\n\t\t\t\t\t\t<div class="control-container-title">When these keys are pressed</div>\n\t\t\t\t\t\t<div class="control-keys"></div>\n\t\t\t\t\t\t<div class="control-container-title margin-top">Complete these actions</div>\n\t\t\t\t\t\t<div class="control-actions"></div>\n\t\t\t\t\t</div>\n\t\t\t\t';const l=e.querySelector(".control-keys");for(const t of o.keys){const i=document.createElement("div");i.dataset.key=t,i.innerHTML=`\n\t\t\t\t\t\t<span class="key-elem-title">${" "===t?"space":t}</span>\n\t\t\t\t\t\t<span class="fas fa-trash-can remove"></span>\n\t\t\t\t\t`,l.appendChild(i),i.querySelector(".remove").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),o.keys.splice(o.keys.indexOf(t),1),s(e,o),n()})}const d=document.createElement("div");d.className="add",d.innerHTML='<span class="fas fa-plus"></span>',l.appendChild(d),d.addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),document.querySelectorAll(".key-select").forEach(e=>e.remove());const t=document.createElement("div");t.className="key-select animate-loading-dots",t.textContent="Press a key",l.insertBefore(t,d);const i=()=>{t.remove(),m(b,this,null)};t.addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),i()}),m(b,this,(r,l,d)=>{if("escape"===r)i();else if(l){if(!(0,a.validateShortcut)(r))return i(),void this.ws.gui.dialog.toast("Invalid Key","The key you pressed is not a valid shortcut key.","error");o.keys.includes(r)||o.keys.push(r),i(),s(e,o),n()}else t.textContent=r||"Press a key"})});const c=e.querySelector(".control-actions");for(const e of o.actions)t(c,e,o,()=>{this.controls()});const u=document.createElement("div");u.className="control-bottom-container",u.innerHTML='\n\t\t\t\t\t<div class="add-action-button"></div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<button class="add-action-button control-delete" style="--background: 211, 51, 51;">Delete</button>\n\t\t\t\t\t</div>\n\t\t\t\t',c.appendChild(u),u.querySelector(".control-delete").addEventListener("click",async e=>{this.ws.audio.playSound(["ui","click"]),(e.shiftKey||await this.ws.gui.dialog.confirm("Delete Control Script","Are you sure you want to delete this control script? This action cannot be undone?<br><small>Tip: Hold <code>&lt;Shift&gt;</code> while clicking to skip this confirmation.</small>",null,!0))&&(this.ws.store.control_scripts.splice(this.ws.store.control_scripts.indexOf(o),1),this.controls())});const p=()=>{const t=u.querySelector(".add-action-button");t.innerHTML='<button class="add-action-button new-button"><span class="fa fa-plus"></span> Add Action</button>',t.querySelector(".new-button").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),t.innerHTML='\n\t\t\t\t\t\t\t<select style="height: 35px;"></select>\n\t\t\t\t\t\t\t<button class="add-action-button cancel-button" style="margin-left: 10px;">Cancel</button>\n\t\t\t\t\t\t\t<button class="add-action-button create-button" style="margin-left: 10px;">Create</button>\n\t\t\t\t\t\t';const n=t.querySelector("select");n.innerHTML+='<option value="if">If Condition</option>',n.innerHTML+='<option value="if not">If Not Condition</option>',Object.entries(r.events).forEach(([e,t])=>{n.innerHTML+="title"in t?`<option value="${e}">${t.title}</option>`:`<option value="${e}">${e}</option>`}),t.querySelector(".cancel-button").addEventListener("click",()=>{this.ws.audio.playSound(["ui","click"]),p()}),t.querySelector(".create-button").addEventListener("click",()=>{if(this.ws.audio.playSound(["ui","click"]),"if"===n.value||"if not"===n.value||n.value in r.events){const t={name:n.value,params:{}};"if"!==n.value&&"if not"!==n.value||(t.condition={name:Object.keys(i.conditions)[0]},t.actions=[]),o.actions.push(t),s(e,o)}})})};p()},o=document.querySelector("#settings-container > .settings > .settings-right > .controls");o.querySelectorAll(".control-script-item").forEach(e=>e.remove());for(const e of this.ws.store.control_scripts){const t=document.createElement("div");t.className="settings-section control-script-item",o.appendChild(t),s(t,e)}n()}}zen(){this.deselect(),document.querySelector("#settings-zen-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .zen").classList.remove("hidden")}app(){this.deselect(),document.querySelector("#settings-app-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .app").classList.remove("hidden")}queue(){this.deselect(),document.querySelector("#settings-queue-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .queue").classList.remove("hidden")}accessibility(){this.deselect(),document.querySelector("#settings-accessibility-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .accessibility").classList.remove("hidden")}AI(){this.deselect(),document.querySelector("#settings-AI-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .AI").classList.remove("hidden")}autoReporting(){this.deselect(),document.querySelector("#settings-auto-reporting-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .auto-reporting").classList.remove("hidden")}gadgets(){this.deselect(),document.querySelector("#settings-gadgets-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .gadgets").classList.remove("hidden")}whitelist(e){this.deselect(),document.querySelector(`#settings-whitelist-${e}s-button`).classList.add("selected"),document.querySelector(`#settings-container > .settings > .settings-right > .whitelist.${e}s`).classList.remove("hidden");{const t=document.querySelector(`#settings-whitelist-${e}s-expiry`);t.value=this.ws.store.settings.expiry.whitelist[`${e}s`],t.addEventListener("change",t=>this.ws.store.settings.expiry.whitelist[`${e}s`]=t.target.value);const n=document.querySelector(`#settings-whitelist-${e}s-input`),s=()=>{const t=n.value.trim();t&&(n.value="",this.ws.store.whitelist[`${e}s`].set(t,[Date.now(),this.ws.util.expiryToDate(this.ws.store.settings.expiry.whitelist[`${e}s`]).valueOf()]),this.ws.store.statistics.items_whitelisted.total++,this.ws.store.statistics.items_whitelisted[`${e}s`]++,this.ws.gui.renderQueue(),this.whitelist(e))};if("tag"===e&&this.wikipediaTags){const e=this.wikipediaTags.map(e=>e.name).sort();for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.appendChild(e)}n.setAttribute("list",n.id+"-datalist");const t=document.createElement("datalist");t.id=n.id+"-datalist",n.parentElement.appendChild(t);for(const n of e){const e=document.createElement("option");e.value=n,t.appendChild(e)}}document.querySelector(`#settings-whitelist-${e}s-add-button`).addEventListener("click",s),n.addEventListener("keydown",e=>{"Enter"===e.key&&(s(),e.preventDefault())})}{const t=document.querySelector(`#settings-whitelist-${e}s-list`);t.innerHTML="";const n=t=>{switch(e){case"user":return this.ws.page(`Special:Contributions/${t}`);case"page":return this.ws.page(t);case"tag":return this.ws.page(`Special:Tags/${t}`)}},s=[...this.ws.store.whitelist[`${e}s`]].sort((e,t)=>t[1][1]-e[1][1]);for(const[i,a]of s){const s=document.createElement("div"),r=new Date(a[0]),o=a[1]===1/0?"Never":`${new Date(a[1]).toLocaleDateString()} ${new Date(a[1]).toLocaleTimeString()}`;s.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${n(i)}">${i}</a>\n\t\t\t\t\t\t<span>Added: ${r.toLocaleDateString()} ${r.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now()>a[1]?"expired":""}">\n\t\t\t\t\t\t\t${Date.now()>a[1]?"Expired":"Expires"}: ${o}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from whitelisted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`,s.querySelector(".remove-button").addEventListener("click",()=>{this.ws.store.whitelist[`${e}s`].delete(i),this.ws.gui.renderQueue(),this.whitelist(e)}),t.appendChild(s)}0===s.length&&(t.innerHTML=`<div class="empty">No whitelisted ${e}s.</div>`)}}highlight(e){this.deselect(),document.querySelector(`#settings-highlight-${e}s-button`).classList.add("selected"),document.querySelector(`#settings-container > .settings > .settings-right > .highlight.${e}s`).classList.remove("hidden");{const t=document.querySelector(`#settings-highlight-${e}s-expiry`);t.value=this.ws.store.settings.expiry.highlight[`${e}s`],t.addEventListener("change",t=>this.ws.store.settings.expiry.highlight[`${e}s`]=t.target.value);const n=document.querySelector(`#settings-highlight-${e}s-input`),s=()=>{const t=n.value.trim();t&&(n.value="",this.ws.store.highlight[`${e}s`].set(t,[Date.now(),this.ws.util.expiryToDate(this.ws.store.settings.expiry.highlight[`${e}s`]).valueOf()]),this.ws.store.statistics.items_highlighted.total++,this.ws.store.statistics.items_highlighted[`${e}s`]++,this.ws.gui.renderQueue(),this.highlight(e))};if("tag"===e&&this.wikipediaTags){const e=this.wikipediaTags.map(e=>e.name).sort();for(const t of e){const e=document.createElement("option");e.value=t,e.textContent=t,n.appendChild(e)}n.setAttribute("list",n.id+"-datalist");const t=document.createElement("datalist");t.id=n.id+"-datalist",n.parentElement.appendChild(t);for(const n of e){const e=document.createElement("option");e.value=n,t.appendChild(e)}}document.querySelector(`#settings-highlight-${e}s-add-button`).addEventListener("click",s),n.addEventListener("keydown",e=>{"Enter"===e.key&&(s(),e.preventDefault())})}{const t=document.querySelector(`#settings-highlight-${e}s-list`);t.innerHTML="";const n=t=>{switch(e){case"user":return this.ws.page(`Special:Contributions/${t}`);case"page":return this.ws.page(t);case"tag":return this.ws.page(`Special:Tags/${t}`)}},s=[...this.ws.store.highlight[`${e}s`]].sort((e,t)=>t[1][1]-e[1][1]);for(const[i,a]of s){const s=document.createElement("div"),r=new Date(a[0]),o=a[1]===1/0?"Never":`${new Date(a[1]).toLocaleDateString()} ${new Date(a[1]).toLocaleTimeString()}`;s.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a href="${n(i)}">${i}</a>\n\t\t\t\t\t\t<span>Added: ${r.toLocaleDateString()} ${r.toLocaleTimeString()}</span>\n\t\t\t\t\t\t<span class="${Date.now()>a[1]?"expired":""}">\n\t\t\t\t\t\t\t${Date.now()>a[1]?"Expired":"Expires"}: ${o}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="add-action-button remove-button" title="Remove from highlighted list"><span class="fa fa-trash"></span></button>\n\t\t\t\t`,s.querySelector(".remove-button").addEventListener("click",()=>{this.ws.store.highlight[`${e}s`].delete(i),this.ws.gui.renderQueue(),this.highlight(e)}),t.appendChild(s)}0===s.length&&(t.innerHTML=`<div class="empty">No highlighted ${e}s.</div>`)}}statistics(){this.deselect(),document.querySelector("#settings-statistics-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .statistics").classList.remove("hidden");document.querySelector("#reset-statistics-button").addEventListener("click",async()=>{await this.ws.gui.dialog.confirm("Reset statistics","Are you sure you want to reset all statistics? This action cannot be undone.",void 0,!0)&&(this.ws.store.statistics={},this.ws.storage.load(this.ws.store),this.ws.time.load=performance.now(),this.statistics())});const e=this.ws.store.statistics;document.querySelector("#stats-total-reviewed").textContent=(e.edits_reviewed.total||0).toLocaleString();document.querySelector("#stats-thanks-percentage").textContent=(e.edits_reviewed.thanked/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-recent-changes-reviewed").textContent=(e.recent_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-recent-changes-percentage").textContent=(e.recent_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-reviewed").textContent=(e.pending_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-pending-changes-accepted").textContent=(e.pending_changes_reviewed.accepted||0).toLocaleString();document.querySelector("#stats-pending-changes-accepted-percentage").textContent=(e.pending_changes_reviewed.accepted/e.pending_changes_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-rejected").textContent=(e.pending_changes_reviewed.rejected||0).toLocaleString();document.querySelector("#stats-pending-changes-rejected-percentage").textContent=(e.pending_changes_reviewed.rejected/e.pending_changes_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-pending-changes-percentage").textContent=(e.pending_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-user-creations-reviewed").textContent=(e.users_reviewed.total||0).toLocaleString();document.querySelector("#stats-user-creations-percentage").textContent=(e.users_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-watchlist-changes-reviewed").textContent=(e.watchlist_changes_reviewed.total||0).toLocaleString();document.querySelector("#stats-watchlist-changes-percentage").textContent=(e.watchlist_changes_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-abuselog-changes-reviewed").textContent=(e.abuselogs_reviewed.total||0).toLocaleString();document.querySelector("#stats-abuselog-changes-percentage").textContent=(e.abuselogs_reviewed.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-reverts-made").textContent=(e.reverts_made.total||0).toLocaleString();document.querySelector("#stats-reverts-percentage").textContent=(e.reverts_made.total/e.edits_reviewed.total*100||0).toFixed(2);document.querySelector("#stats-goodfaith-reverts-percentage").textContent=(e.reverts_made.good_faith/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-recent-reverts-percentage").textContent=(e.reverts_made.from_recent_changes/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-pending-reverts-percentage").textContent=(e.reverts_made.from_pending_changes/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-watchlist-reverts-percentage").textContent=(e.reverts_made.from_watchlist/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-abuselog-reverts-percentage").textContent=(e.reverts_made.from_abuselogs/e.reverts_made.total*100||0).toFixed(2);document.querySelector("#stats-other-reverts-percentage").textContent=(e.reverts_made.from_loaded_edits/e.reverts_made.total*100||0).toFixed(2);{document.querySelector("#stats-users-welcomed").textContent=(e.users_welcomed.total||0).toLocaleString();const t=document.querySelector("#stats-users-welcomed-message");e.edits_reviewed.total===e.users_welcomed.total?t.textContent=`You welcome every user whose edit you review! (${e.users_welcomed.total.toLocaleString()})`:0===e.users_welcomed.total?t.innerHTML="For every Infinity edits you review, you still won&rsquo;t welcome a new user.":t.textContent=`For every ${(e.edits_reviewed.total/e.users_welcomed.total||0).toFixed(3)} edits you review, you welcome a new user.`}document.querySelector("#stats-warnings").textContent=(e.warnings_issued.total||0).toLocaleString();document.querySelector("#stats-warning-1-percentage").textContent=(e.warnings_issued.level_1/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-2-percentage").textContent=(e.warnings_issued.level_2/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-3-percentage").textContent=(e.warnings_issued.level_3/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-4-percentage").textContent=(e.warnings_issued.level_4/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-warning-4im-percentage").textContent=(e.warnings_issued.level_4im/e.warnings_issued.total*100||0).toFixed(2);document.querySelector("#stats-reports").textContent=(e.reports_filed.total||0).toLocaleString();document.querySelector("#stats-AIV-reports-percentage").textContent=(e.reports_filed.AIV/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-UAA-reports-percentage").textContent=(e.reports_filed.UAA/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-global-block-reports-percentage").textContent=(e.reports_filed.global_block/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-global-lock-reports-percentage").textContent=(e.reports_filed.global_lock/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-RFPP-reports-percentage").textContent=(e.reports_filed.RFPP/e.reports_filed.total*100||0).toFixed(2);document.querySelector("#stats-pages-watched").textContent=(e.watchlist.watched||0).toLocaleString();document.querySelector("#stats-pages-unwatched").textContent=(e.watchlist.unwatched||0).toLocaleString();document.querySelector("#stats-items-whitelisted").textContent=(e.items_whitelisted.total||0).toLocaleString();document.querySelector("#stats-users-whitelisted").textContent=(e.items_whitelisted.users||0).toLocaleString();document.querySelector("#stats-users-whitelisted-percentage").textContent=(e.items_whitelisted.users/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-pages-whitelisted").textContent=(e.items_whitelisted.pages||0).toLocaleString();document.querySelector("#stats-pages-whitelisted-percentage").textContent=(e.items_whitelisted.pages/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-tags-whitelisted").textContent=(e.items_whitelisted.tags||0).toLocaleString();document.querySelector("#stats-tags-whitelisted-percentage").textContent=(e.items_whitelisted.tags/e.items_whitelisted.total*100||0).toFixed(2);document.querySelector("#stats-items-highlighted").textContent=(e.items_highlighted.total||0).toLocaleString();document.querySelector("#stats-users-highlighted").textContent=(e.items_highlighted.users||0).toLocaleString();document.querySelector("#stats-users-highlighted-percentage").textContent=(e.items_highlighted.users/e.items_highlighted.total*100||0).toFixed(2);document.querySelector("#stats-pages-highlighted").textContent=(e.items_highlighted.pages||0).toLocaleString();document.querySelector("#stats-pages-highlighted-percentage").textContent=(e.items_highlighted.pages/e.items_highlighted.total*100||0).toFixed(2);document.querySelector("#stats-tags-highlighted").textContent=(e.items_highlighted.tags||0).toLocaleString();document.querySelector("#stats-tags-highlighted-percentage").textContent=(e.items_highlighted.tags/e.items_highlighted.total*100||0).toFixed(2);{const t=e.session_time+(performance.now()-this.ws.time.load);document.querySelector("#stats-session-time").textContent=(e=>{const t=Math.floor(e/1e3),n=Math.floor(t/86400),s=Math.floor(t%86400/3600),i=Math.floor(t%3600/60);let a="";return n>0&&(a+=`${n}d `),s>0&&(a+=`${s}h `),i>0&&(a+=`${i}m `),a+=t%60+"s",a.trim()})(t);document.querySelector("#stats-reports-per-day").textContent=(e.reports_filed.total/(t/864e5||1)||0).toFixed(2);document.querySelector("#stats-reverts-per-hour").textContent=(e.reverts_made.total/(t/36e5||1)||0).toFixed(2);document.querySelector("#stats-reviews-per-minute").textContent=(e.edits_reviewed.total/(t/6e4||1)||0).toFixed(2)}}save(){this.deselect(),document.querySelector("#settings-save-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .save").classList.remove("hidden"),document.querySelector("#settings-save-status").classList.add("hidden")}changelog(){this.deselect(),document.querySelector("#settings-changelog-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .changelog").classList.remove("hidden");const e=document.querySelector("#settings-container > .settings > .settings-right > .changelog > div > .changelog-content");e.innerHTML="<em class='animate-loading-dots'>Loading changelog</em>",l.WikiShield.config.changelog.HTML.then(t=>e.innerHTML=t)}about(){this.deselect(),document.querySelector("#settings-about-button").classList.add("selected"),document.querySelector("#settings-container > .settings > .settings-right > .about").classList.remove("hidden"),document.querySelector("#settings-about-version").textContent=l.WikiShield.config.version,document.querySelectorAll("#settings-container > .settings > .settings-right > .about > .randomize").forEach(e=>{for(let t=e.children.length;t>=0;t--)e.appendChild(e.children[Math.random()*t|0])})}}},7698(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.BuildPalette=function(e,...t){const n=document.createElement("canvas");n.width=e,n.height=1;const s=n.getContext("2d"),i=s.createLinearGradient(0,0,n.width,0),a=1/(t.length-1);t.forEach((e,t)=>{i.addColorStop(a*t,e)}),s.fillStyle=i,s.fillRect(0,0,n.width,n.height);const r=s.getImageData(0,0,n.width,1).data;return Array.from({length:e},(e,t)=>{const n=4*t;return`rgb(${r[n]}, ${r[n+1]}, ${r[n+2]})`})}},3241(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.expiryRegex=t.Utility=void 0;var s=n(4551);function i(){i=function(e,t){return new n(e,void 0,t)};var e=RegExp.prototype,t=new WeakMap;function n(e,s,i){var r=RegExp(e,s);return t.set(r,i||t.get(e)),a(r,n.prototype)}function s(e,n){var s=t.get(n);return Object.keys(s).reduce(function(t,n){var i=s[n];if("number"==typeof i)t[n]=e[i];else{for(var a=0;void 0===e[i[a]]&&a+1<i.length;)a++;t[n]=e[i[a]]}return t},Object.create(null))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&a(e,t)}(n,RegExp),n.prototype.exec=function(t){var n=e.exec.call(this,t);if(n){n.groups=s(n,this);var i=n.indices;i&&(i.groups=s(i,this))}return n},n.prototype[Symbol.replace]=function(n,i){if("string"==typeof i){var a=t.get(this);return e[Symbol.replace].call(this,n,i.replace(/\$<([^>]+)(>|$)/g,function(e,t,n){if(""===n)return e;var s=a[t];return Array.isArray(s)?"$"+s.join("$"):"number"==typeof s?"$"+s:""}))}if("function"==typeof i){var r=this;return e[Symbol.replace].call(this,n,function(){var e=arguments;return"object"!=typeof e[e.length-1]&&(e=[].slice.call(e)).push(s(e,r)),i.apply(this,e)})}return e[Symbol.replace].call(this,n,i)},i.apply(this,arguments)}function a(e,t){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},a(e,t)}const r=t.expiryRegex=i(/(infinity|^(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)W)?(([0-9]+)D)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?)$/,{years:3,months:5,weeks:7,days:9,hours:11,minutes:13,seconds:15});t.Utility=class{constructor(e){this.ws=e}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}escape(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}utcString(e){if(e===1/0)return"indefinite";const t=this.padString;return`${e.getUTCFullYear()}-${t(e.getUTCMonth()+1,2)}-${t(e.getUTCDate(),2)}T${t(e.getUTCHours(),2)}:${t(e.getUTCMinutes(),2)}:${t(e.getUTCSeconds(),2)}`}padString(e,t){for(e=e.toString();e.length<t;)e=`0${e}`;return e}getMonth(e){return["January","February","March","April","May","June","July","August","September","October","November","December"][e]}monthSectionName(){return`${this.getMonth((new Date).getUTCMonth())} ${(new Date).getUTCFullYear()}`}escape(e){return(e||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}textify(e){const t=document.createElement("div");return t.innerHTML=e,t.textContent||t.innerText||""}pageLink(e,t=!1,n=!0){return t?`https://${this.ws.server}/w/index.php${e}`:`https://${this.ws.server}/wiki/${n?encodeURIComponent(e):e}`}truncate(e,t){return(0,s.truncate)(e,t)}formatBytes(e){if(0===e)return"0 B";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB","RiB","QiB"][t]}getChangeColor(e){if(0===e)return"#888";if(e>0)return e>=1e3?"#00b894":e>=500?"#00d4a1":e>=100?"#26de81":"#55efc4";{const t=Math.abs(e);return t>=1e3?"#d63031":t>=500?"#e74c3c":t>=100?"#ff6b6b":"#ff8787"}}getChangeString(e){return e>0?"+"+e:0===e?"0":`&ndash;${Math.abs(e).toString()}`}formatNotificationTime(e,t=new Date){const n=Math.floor((t-e)/1e3);return n<=0?"Now":n<60?`${n}s ago`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:n<2592e3?`${Math.floor(n/86400)}d ago`:n<31536e3?`${Math.floor(n/2592e3)}mo ago`:`${Math.floor(n/31536e3)}y ago`}formatDuration(e,t=new Date){const n=Math.floor((t-e)/1e3);return n<=0?"0s":n<60?`${n}s`:n<3600?`${Math.floor(n/60)}m`:n<86400?`${Math.floor(n/3600)}h`:n<2592e3?`${Math.floor(n/86400)}d`:n<31536e3?`${Math.floor(n/2592e3)}mo`:`${Math.floor(n/31536e3)}y`}match(e,t){return this.ws.store.settings.username_highlighting.fuzzy?function(e,t,n){const s=e.length,i=t.length;if(0===s)return!0;if(0===i)return s<=n;let a=new Array(i+1).fill(0),r=new Array(i+1).fill(0);for(let e=0;e<=i;e++)a[e]=0;for(let o=1;o<=s;o++){r[0]=o;let l=r[0];for(let d=1;d<=i;d++){const i=e[o-1]===t[d-1]?0:1,c=a[d]+1,u=r[d-1]+1,p=a[d-1]+i,g=Math.min(c,u,p);if(r[d]=g,g<l&&(l=g),o===s&&g<=n)return!0}if(l>n)return!1;[a,r]=[r,a]}return!1}(e,t,2):t.toLowerCase().includes(e.toLowerCase())}isIPv4Address(e){const t="(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|0?[0-9]{1,2})";return new RegExp(`^(${t}\\.){3}${t}$`).test(e)}isIPv6Address(e){return!!new RegExp("^(?::(?::|(?::[0-9A-Fa-f]{1,4}){1,7})|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,6}::|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){7})$").test(e)||new RegExp("^[0-9A-Fa-f]{1,4}(?:::?[0-9A-Fa-f]{1,4}){1,6}$").test(e)&&/::/.test(e)&&!/::.*::/.test(e)}isIPAddress(e){return this.isIPv4Address(e)||this.isIPv6Address(e)}isTempAccount(e){return/^~[0-9]{4,}(-[0-9A-Fa-f]{5})*(-[0-9A-Fa-f]{1,5})$/.test(e)}expiryToDate(e){if("infinity"===e)return 1/0;const t=new Date,n=r.exec(e);return n?new Date(t.getFullYear()+(parseInt(n.groups.years)||0),t.getMonth()+(parseInt(n.groups.months)||0),t.getDate()+7*(parseInt(n.groups.weeks)||0)+(parseInt(n.groups.days)||0),t.getHours()+(parseInt(n.groups.hours)||0),t.getMinutes()+(parseInt(n.groups.minutes)||0),t.getSeconds()+(parseInt(n.groups.seconds)||0)):t}getPageSections(e){const t=e.split("\n"),n=[];let s={title:"",heading:"",level:0,content:""};for(const e of t){const t=/^(=+)\s*(.*?)\s*\1\s*$/.exec(e);t?(""!==s.title&&n.push(s),s={title:t[2],heading:t[0],level:t[1].length,content:""}):(""!==s.content&&(s.content+="\n"),s.content+=e)}return""===s.content&&""===s.title||n.push(s),n}}},5564(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.sortDependencies=function(e){const t=new Map(e.map(e=>[e.id,e])),n=new Set,s=new Set,i=[],a=(e,r)=>{if(n.has(e))return;if(s.has(e)){const t=r.indexOf(e),n=r.slice(t).concat(e).join(" -> ");throw new Error(`Cyclic dependency detected: ${n}`)}const o=t.get(e);if(!o)throw new Error(`Unknown dependency: ${e}`);s.add(e),r.push(e);const l=o.dependencies||[];for(const e of l)a(e,r);r.pop(),n.add(e),s.delete(e),i.push(o)};for(const t of e)n.has(t.id)||a(t.id,[]);return i}},2069(e,t){var n;function s(e,t,n){i(e,t),t.set(e,n)}function i(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function a(e,t){return e.get(o(e,t))}function r(e,t,n){return e.set(o(e,t),n),n}function o(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function l(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(t,"__esModule",{value:!0}),t.Text=void 0;class d{}l(d,"Lower",Symbol("lower case")),l(d,"Upper",Symbol("UPPER CASE")),l(d,"Title",Symbol("Title Case")),l(d,"Sentence",Symbol("Sentence case")),l(d,"Camel",Symbol("camelCase")),l(d,"Pascal",Symbol("PascalCase")),l(d,"Snake",Symbol("snake_Case")),l(d,"Split",Symbol("split,case"));var c=new WeakMap,u=new WeakMap,p=new WeakMap,g=new WeakSet;class h{static pluralize(e,t,n){return new h(e).plural(n).get(t)}constructor(e,t=d.Sentence){var n,a;i(n=this,a=g),a.add(n),s(this,c,!1),s(this,u,void 0),s(this,p,void 0);const l=m.call(h,e,t);r(c,this,l.inSentenceCase),r(u,this,l.words),r(p,this,o(g,this,v).call(this))}plural(){return r(p,this,o(g,this,v).apply(this,arguments)),this}case(e=d.Sentence){const t=t=>{switch(e){case d.Lower:return t.map(e=>e.toLowerCase()).join(" ");case d.Upper:return t.map(e=>e.toUpperCase()).join(" ");case d.Title:return t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");case d.Sentence:if(a(c,this))return t.join(" ");let e=!0;return t.map(t=>{let n=e?t.charAt(0).toUpperCase()+t.slice(1).toLowerCase():t.toLowerCase();return e=/[.!?]$/.test(t),n}).join(" ");case d.Camel:return t.map((e,t)=>0===t?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("");case d.Pascal:return t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("");case d.Snake:return t.map(e=>e.toLowerCase()).join("_");case d.Split:return t;default:throw new TypeError("Invalid case type, must be a Case value")}},[n,s]=[t(a(u,this)),t(a(p,this))];return Object.freeze({get:(e=1)=>(Number.isNaN(Number(e))||1===e||1n===e||"1"===e?n:s).replace(/(?<!\\)%n/g,e)})}get(e=1){return this.case().get(e)}}function m(e,t){const n=(e=>{switch(t){case d.Lower:case d.Upper:case d.Title:case d.Sentence:return e.split(/\s+/);case d.Camel:case d.Pascal:return e.split(/(?=[A-Z])/);case d.Snake:return e.split(/_/g);case d.Split:throw new TypeError("Split case is only used for output, not input");default:throw new TypeError("Invalid case type, must be a Case value")}})(e.toString().trim());return t===d.Sentence?{inSentenceCase:!0,words:n.map(e=>e.trim()).filter(e=>e.length>0)}:{inSentenceCase:!1,words:n.map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}}function v(e){if(null==e||e){const e=[...a(u,this)],t=e.length-1;return e[t]=(e=>{let t;return t=e.replace(/(?<=sh?|ch|x|z|[^aeiou]o)$/i,"es"),t!==e?t:(t=e.replace(/(?<=[^aeiou])y$/i,"ies"),t!==e?t:(t=e.replace(/fe?$/i,"ves"),t!==e?t:`${e}s`))})(a(u,this)[t]),e}if(!1===e)return[...a(u,this)];if(e instanceof n)return e.case(d.Split).get();throw new TypeError("Invalid plural argument, must be boolean or Text instance")}t.Text=h,n=h,l(h,"Case",d)},8878(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.MediaWikiAPI=void 0;var s=n(1289),i=n(4551),a=n(2852),r=n(6873),o=n(505),l=n(8582);const d=console,c=new Set(l.__servers__.filter(e=>e.tag).map(e=>e.host)),u=new Set(l.__servers__.filter(e=>e.pending_changes).map(e=>e.host));class p{static get pendingChangesServers(){return Array.from(u)}static hasPendingChanges(e){return u.has(e)}static chunk(e,t=50){const n=[],s=e.length;for(let i=0;i<s;i+=t)n.push(e.slice(i,i+t));return n}static paramify(e){return Array.isArray(e)||(e=[e]),[...new Set(e)]}static join(e){return e.join("|").replace(/\|\|+/g,"|")}static getUsername(e,t){return e.fetch(`https://${t}/w/api.php`,{action:"query",meta:"userinfo",uiprop:"name",format:"json",formatversion:2},void 0,"POST",!0).then(e=>{var t;return(null==e||null===(t=e.query)||void 0===t||null===(t=t.userinfo)||void 0===t?void 0:t.name)||null})}constructor(e,t,n,s){var i,o;this.glob=e,this.oauth=t,this.server=n,this.username=s,this.tokens={},null!==(o=(i=p.cache)[n])&&void 0!==o||(i[n]={parse:new r.Trie({size:1e3}),pending:new a.Memory({size:2500,timeout:36e5}),abuse:new a.Memory({size:2500,timeout:9e5}),ores:new a.Memory({size:1e4,timeout:9e5}),diff:new a.Memory({size:500,timeout:3e5})})}close(){this.stream.disconnect()}get cache(){return p.cache[this.server]}build(e={},t=null){return{tags:c.has(null!=t?t:this.server)?"WikiShield script":"",assertuser:this.username,discussiontoolsautosubscribe:"no",...e}}user(e){return`[[Special:Contribs/${e}|${e}]] ([[User talk:${e}|talk]])`}revision(e){return`[[Special:Diff/${e}|${e}]]`}centralAuthUser(e){return`[[Special:CentralAuth/${e}|${e}]]`}summary(e,t){const n=" ([[:en:WP:WikiShield|WS]])",s=`${e}${t?`: ${t}`:""}`;return`${(0,i.truncate)(s,473)}${n}`}async post(e,t=!1,n=null){try{const s=await this.oauth.fetch(`https://${n||this.server}/w/api.php`,this.build({...e,format:"json",formatversion:2},n),void 0,"POST",t,n);if(s.error){if("alreadyrolled"===s.error.code||"editconflict"===s.error.code)return"editconflict";if("missingcontent"===s.error.code&&"compare"===e.action)return{compare:{body:""}};throw new Error(`API Error: ${s.error.code} - ${s.error.info}`)}return s}catch(t){throw d.error("Error in API POST request:",t,JSON.stringify(e)),t}}async continuous(e,t,n,s){try{let i=null;const a=[];do{const r=await this.post({...e,...i||{}},n,s);a.push(r),i=r.continue||null,"function"==typeof t&&!0===await t(r,a)&&(i=!1)}while(i);return{stopped:null!==i,responses:a}}catch(t){return d.error("Error in API continuous request:",t,JSON.stringify(e)),{stopped:!0,responses:[]}}}async getToken(e="csrf",t,n){const s=`${null!=n?n:this.server}:${e}`;if(void 0!==this.tokens[s])return this.tokens[s];try{return this.tokens[s]=this.post({action:"query",meta:"tokens",type:e},t,n).then(t=>{var n;return(null==t||null===(n=t.query)||void 0===n||null===(n=n.tokens)||void 0===n?void 0:n[`${e}token`])||null})}catch(e){throw d.error("Error fetching token:",e),e}}async postWithToken(e,t="csrf",n,s){try{return await this.post({...e,token:await this.getToken(t,n,s)},n,s)}catch(e){throw d.error("Post with token error:",e),e}}async account(e,t){try{var n;return(null===(n=await this.post({action:"query",meta:"userinfo",uiprop:"*"},e,t))||void 0===n||null===(n=n.query)||void 0===n?void 0:n.userinfo)||{}}catch(e){var s;return null!==(s=void d.error("Error fetching account info:",e))&&void 0!==s?s:{}}}async getGlobalUserInfo(e,t,n){try{var s;return(null===(s=(await this.post({action:"query",meta:"globaluserinfo",guiuser:e,guiprop:"groups|rights"},t,n)).query)||void 0===s?void 0:s.globaluserinfo)||{}}catch(e){var i;return null!==(i=void d.error("Error fetching global user info:",e))&&void 0!==i?i:{}}}async markWatchlistSeen(e,t,n,s){try{await this.postWithToken({action:"setnotificationtimestamp",titles:e,newerthanrevid:t},"csrf",n,s)}catch(e){var i;return null!==(i=void d.error("Error marking watchlist item as seen:",e))&&void 0!==i?i:{valid:!1,reason:e.message}}}async append(e,t,n,s,i=null,a,r){try{if(null!==i){return{needsCheck:!0,text:(await this.getPagesContent([e],a,r))[e]||""}}return"editconflict"===await this.postWithToken({action:"edit",title:e,...null===(null!=t?t:null)?{}:{section:t},appendtext:`\n${n}`,summary:s},"csrf",a,r)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var o;return null!==(o=void d.error("Error appending to section:",e))&&void 0!==o?o:{valid:!1,reason:e.message}}}async editSection(e,t,n,s,i,a=null,r,o){try{if(null!==a){return{needsCheck:!0,text:(await this.getPagesContent([e],r,o))[e]||""}}return"editconflict"===await this.postWithToken({action:"edit",title:e,section:t,sectiontitle:n,text:s,summary:i},"csrf",r,o)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var l;return null!==(l=void d.error("Error editing section:",e))&&void 0!==l?l:{valid:!1,reason:e.message}}}async acceptPendingEdit(e,t,n,s){try{return await this.postWithToken({action:"review",revid:e,comment:t},"csrf",n,s),{valid:!0}}catch(e){return{valid:!1,reason:"Edit could not be accepted."}}}async rejectPendingEdit(e,t,n,s,i,a){try{const r=(await this.getRevisionsContent([t],i,a))[t]||"";return"editconflict"===await this.postWithToken({action:"edit",title:n,text:r,summary:s,baserevid:e},"csrf",i,a)?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){return{valid:!1,reason:"Edit could not be rejected."}}}async rollbackEdit(e,t,n,s,i){try{var a;const r=await this.postWithToken({action:"rollback",title:e,user:t,summary:n},"rollback",s,i);if("editconflict"===r)return{valid:!1,reason:"Edit conflict."};if("onlyauthor"===r)return{valid:!1,reason:"Cannot rollback edits as the no other user has edited the page."};if(null===(a=r.rollback)||void 0===a||!a.revid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,r.rollback.revid,s,i)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var r;return null!==(r=void d.error("Error rolling back edit:",e))&&void 0!==r?r:{valid:!1,reason:e.message}}}async undoEdit(e,t,n,s,i){try{var a;const r=await this.postWithToken({action:"edit",title:e,undo:t,summary:n},"csrf",s,i);if("editconflict"===r)return{valid:!1,reason:"Edit conflict."};if(null===(a=r.edit)||void 0===a||!a.newrevid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,r.edit.newrevid,s,i)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var r;return null!==(r=void d.error("Error undoing edit:",e))&&void 0!==r?r:{valid:!1,reason:e.message}}}async restoreEdit(e,t,n,i,a){try{var r;const o=(0,s.convertToUTCString)(new Date),l=(await this.getRevisionsContent([t],i,a))[t]||"",d=await this.postWithToken({action:"edit",title:e,text:l,summary:n,starttimestamp:o},"csrf",i,a);if("editconflict"===d)return{valid:!1,reason:"Edit conflict."};if(null===(r=d.edit)||void 0===r||!r.newrevid)return{valid:!1,reason:"Edit conflict."};return(await this.getRevision(e,d.edit.newrevid,i,a)).user!==this.username?{valid:!1,reason:"Edit conflict."}:{valid:!0}}catch(e){var o;return null!==(o=void d.error("Error restoring edit:",e))&&void 0!==o?o:{valid:!1,reason:e.message}}}async thankRevision(e,t,n){try{return await this.postWithToken({action:"thank",rev:e},"csrf",t,n),{valid:!0}}catch(e){var s;return null!==(s=void d.error("Error thanking revision:",e))&&void 0!==s?s:{valid:!1,reason:e.message}}}async watchPage(e,t,n,s){try{return await this.postWithToken({action:"watch",title:e,expiry:t},"watch",n,s),{valid:!0}}catch(e){var i;return null!==(i=void d.error("Error watching page:",e))&&void 0!==i?i:{valid:!1,reason:e.message}}}async unwatchPage(e,t,n){try{return await this.postWithToken({action:"watch",title:e,unwatch:!0},"watch",t,n),{valid:!0}}catch(e){var s;return null!==(s=void d.error("Error unwatching page:",e))&&void 0!==s?s:{valid:!1,reason:e.message}}}async parse(e,t,n=!1,s,i){null!=t||(t=void 0);const a=[t,e].filter(e=>void 0!==e);if(this.cache.parse.has(...a))return this.cache.parse.get(...a);try{var r;const o=(null===(r=await this.post({action:"parse",prop:"text",preview:n,text:e,title:t,contentmodel:"wikitext"},s,i))||void 0===r||null===(r=r.parse)||void 0===r?void 0:r.text)||"";return this.cache.parse.set(...a,o),o}catch(e){var o;return null!==(o=void d.error("Error parsing wikitext:",e))&&void 0!==o?o:""}}async getTags(e,t){try{return(await this.continuous({action:"query",list:"tags",tglimit:"max"},void 0,e,t)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.tags)||[]})}catch(e){var n;return null!==(n=void d.error("Error fetching revisions between IDs:",e))&&void 0!==n?n:[]}}async getPagesContent(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"content",rvslots:"*",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=(null===(i=t.revisions)||void 0===i||null===(i=i[0])||void 0===i||null===(i=i.slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content)||""}return r}catch(e){var a;return null!==(a=void d.error("Error fetching pages content:",e))&&void 0!==a?a:{}}}async getRevisionsContent(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|content",rvslots:"*",revids:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s;for(const e of t.revisions||[]){var i;r[e.revid]=(null===(i=e.slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content)||""}}return r}catch(e){var a;return null!==(a=void d.error("Error fetching revisions content:",e))&&void 0!==a?a:{}}}async getLatestIds(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=(null===(i=t.revisions)||void 0===i||null===(i=i[0])||void 0===i?void 0:i.revid)||null}return r}catch(e){var a;return null!==(a=void d.error("Error fetching latest IDs:",e))&&void 0!==a?a:{}}}async getRevisionsBetween(e,t,n,s,i){try{return(await this.continuous({action:"query",prop:"revisions",titles:e,rvstartid:n,rvendid:t,rvprop:"title|ids|flags|user|timestamp|comment|parsedcomment|size|tags",rvlimit:"max"},void 0,s,i)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions)||[]})}catch(e){var a;return null!==(a=void d.error("Error fetching revisions between IDs:",e))&&void 0!==a?a:[]}}async getEditCounts(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",list:"users",usprop:"editcount",ususers:p.join(e)},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.users)||[]){var s;a[t.name]=t.editcount}return a}catch(e){var i;return null!==(i=void d.error("Error fetching edit counts:",e))&&void 0!==i?i:{}}}async areUsersBlocked(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",list:"blocks",bkusers:p.join(e),bkprop:"id|user|by|reason|expiry|flags"},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.blocks)||[]){var s;a[t.user]=t}return a}catch(e){var i;return null!==(i=void d.error("Error fetching blocked users:",e))&&void 0!==i?i:{}}}async isUserGloballyLocked(e,t,n){try{var s;return!0===(null===(s=(await this.post({action:"query",meta:"globaluserinfo",guiuser:e},t,n)).query)||void 0===s||null===(s=s.globaluserinfo)||void 0===s?void 0:s.locked)}catch(e){var i;return null!==(i=void d.error("Error checking if user is globally locked:",e))&&void 0!==i&&i}}async getContributions(e,t=10,n,s){try{var i;return(null===(i=(await this.post({action:"query",list:"usercontribs",ucuser:e,uclimit:t,ucprop:"ids|title|timestamp|comment|parsedcomment|flags|tags|sizediff|flags"},n,s)).query)||void 0===i?void 0:i.usercontribs)||[]}catch(e){var a;return null!==(a=void d.error("Error fetching contributions:",e))&&void 0!==a?a:[]}}async getBlocks(e,t,n){try{return(await this.continuous({action:"query",list:"logevents",letype:"block",letitle:`User:${e}`,leaction:"block/block",lelimit:"max",leprop:"id|timestamp|details|user|comment|parsedcomment"},void 0,t,n)).responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.logevents)||[]})}catch(e){var s;return null!==(s=void d.error("Error fetching blocks:",e))&&void 0!==s?s:[]}}async pagesExist(e,t,n){e=p.paramify(e);try{const a=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"content",rvslots:"*",titles:p.join(e)},t,n))),r={};for(const e of a)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s,i;r[t.title]=t.missing||null===(i=t.revisions)||void 0===i||null===(i=i[0].slots)||void 0===i||null===(i=i.main)||void 0===i?void 0:i.content}return r}catch(e){var a;return null!==(a=void d.error("Error checking page existence:",e))&&void 0!==a?a:[]}}async getPagesDetails(e,t,n){e=p.paramify(e);try{const o=await Promise.allSettled(p.chunk(e,50).map(async e=>await this.continuous({action:"query",prop:"info|categories|templates",titles:p.join(e),inprop:"protection|watched",cllimit:"max",tllimit:"max",tlnamespace:"10"},void 0,t,n))),l={};for(const e of o)if("fulfilled"===e.status)for(const t of e.value.responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t?void 0:t.pages)||[]})){var s,i,a,r;null!==(i=l[s=t.title])&&void 0!==i||(l[s]={protection:null,watched:!1,categories:[],metadata:[]});let e=(null===(a=l[t.title])||void 0===a||null===(a=a.protection)||void 0===a?void 0:a.level)||null;for(const n of t.protection||[])"edit"===n.type&&("sysop"===n.level||"sysop"===e?e="sysop":"autoconfirmed"===n.level||"autoconfirmed"===e?e="autoconfirmed":"extendedconfirmed"!==n.level&&"extendedconfirmed"!==e||(e="extendedconfirmed"));const n=[];for(const e of t.templates||[]){const t=e.title.replace(/^Template:/i,"");t.match(/^use\s/i)&&n.push(t)}l[t.title]={protection:null===e?{protected:!1}:{protected:!0,level:e},watched:!0===t.watched||l[t.title].watched,categories:l[t.title].categories.concat((null===(r=t.categories)||void 0===r?void 0:r.map(e=>e.title))||[]),metadata:l[t.title].metadata.concat(n)}}return l}catch(e){var o;return null!==(o=void d.error("Error fetching page details:",e))&&void 0!==o?o:{}}}async getHistory(e,t=10,n,s){try{var i;const a=null===(i=(await this.post({action:"query",prop:"revisions",titles:e,rvlimit:t+1,rvprop:"ids|user|timestamp|comment|parsedcomment|flags|tags|size|flags"},n,s)).query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];if(null==a||!a.revisions)return[];const r=a.revisions.length,o=Math.min(t,r||0);for(let e=0;e<o;e++){const t=a.revisions[e];t.ns=a.ns,t.pageid=a.pageid,t.title=a.title,t.sizediff=e+1<r?t.size-a.revisions[e+1].size:t.size}return a.revisions.slice(0,o)}catch(e){var a;return null!==(a=void d.error("Error fetching page history:",e))&&void 0!==a?a:[]}}async countPageReverts(e,t,n,i){const a=e=>"mw-undo"===e||"mw-rollback"===e||"mw-manual-revert"===e;try{const o=await this.continuous({action:"query",prop:"revisions",titles:e,rvdir:"newer",rvstart:(0,s.convertToUTCString)(new Date(Date.now()-864e5)),rvprop:"tags",rvuser:t,rvlimit:"max"},void 0,n,i);let l=0;for(const e of o.responses){var r;l+=(null===(r=e.query)||void 0===r||null===(r=r.pages)||void 0===r||null===(r=r[0])||void 0===r||null===(r=r.revisions)||void 0===r?void 0:r.filter(e=>e.tags.some(a)).length)||0}return l}catch(e){var o;return null!==(o=void d.error("Error counting page reverts:",e))&&void 0!==o?o:0}}async getORES(e,t,n,s){e=p.paramify(e);try{const a={};e=e.filter(e=>{var t;const n=this.cache.ores.get(e);return!n||null!==(t=void(a[e]=n))&&void 0!==t&&t});const r=p.chunk(e,50),l=await Promise.allSettled(r.map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|oresscores",rvslots:"*",revids:p.join(e)},n,s)));for(const e of l)if("fulfilled"===e.status)for(const t of(null===(i=e.value.query)||void 0===i?void 0:i.pages)||[]){var i;for(const e of t.revisions||[])a[e.revid]=e.oresscores||{}}return o.ORES.extract(a,t)}catch(e){var a;return null!==(a=void d.error("Error fetching ORES scores:",e))&&void 0!==a?a:{}}}async extractORES(e,t=.5){return o.ORES.extract(e,t)}async getDiff(e,t,n="table",s,i){null!=e||(e=!1);const a=`${n}@${e}-${t}`;if(this.cache.diff.has(a))return this.cache.diff.get(a);try{var r;const o={action:"compare",prop:"diff",difftype:n,torev:t};0==e?(o.fromslots="main",o["fromtext-main"]=""):o.fromrev=e;const l=(null===(r=(await this.post(o,s,i)).compare)||void 0===r?void 0:r.body)||"";return this.cache.diff.set(a,l),l}catch(e){var o;return null!==(o=void d.error("Error fetching diff:",e))&&void 0!==o?o:""}}async getWikitextDiff(e,t,n="table",s,i){null!=e||(e=!1);try{var a;return(null===(a=(await this.post({action:"compare",prop:"diff",difftype:n,fromslots:"main","fromtext-main":!1===e?"":e,toslots:"main","totext-main":t},s,i)).compare)||void 0===a?void 0:a.body)||""}catch(e){var r;return null!==(r=void d.error("Error fetching wikitext diff:",e))&&void 0!==r?r:""}}async getSizeDiff(e,t,n,s){try{var i;const a=await(null===(i=this.post({action:"query",prop:"revisions",rvprop:"size",revids:`${e}|${t}`},n,s).query)||void 0===i||null===(i=i.pages)||void 0===i||null===(i=i[0])||void 0===i?void 0:i.revisions)||[];return 0===a.length?0:1===a.length?a[0].size:a[1].size-a[0].size}catch(e){var a;return null!==(a=void d.error("Error fetching size diff:",e))&&void 0!==a?a:0}}async getRevision(e,t,n,s){try{var i,a,r;const o=null===(i=(await this.post({action:"query",prop:"revisions",titles:e,rvprop:"ids|user|comment|parsedcomment|timestamp|size|tags|flags",rvslots:"*",rvstartid:t,rvlimit:2},n,s)).query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];if(null==o||null===(a=o.revisions)||void 0===a||!a.length)return{};const l=o.revisions[0];return{revid:l.revid,parentid:l.parentid,user:l.user,parsedcomment:l.parsedcomment,comment:l.comment,timestamp:l.timestamp,size:l.size,oldlen:(null===(r=o.revisions[1])||void 0===r?void 0:r.size)||0,minor:l.minor||!1,tags:l.tags||[]}}catch(e){var o;return null!==(o=void d.error("Error fetching revision:",e))&&void 0!==o?o:{}}}async getRevisions(e,t,n){e=p.paramify(e);try{const i=await Promise.allSettled(p.chunk(e,500).map(async e=>await this.post({action:"query",prop:"revisions",rvprop:"ids|user|comment|parsedcomment|timestamp|size|tags|flags|oresscores",rvslots:"*",revids:p.join(e)},t,n))),a={};for(const e of i)if("fulfilled"===e.status)for(const t of(null===(s=e.value.query)||void 0===s?void 0:s.pages)||[]){var s;for(const e of t.revisions||[])a[e.revid]=e}return a}catch(e){var i;return null!==(i=void d.error("Error fetching revisions:",e))&&void 0!==i?i:{}}}async getConsecutiveEdits(e,t,n,s,i){try{var a,r;const o=await this.continuous({action:"query",prop:"revisions",titles:e,rvprop:"ids|timestamp|user|size|parsedcomment",rvlimit:"max",rvstartid:t},e=>{var t;return null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions.some(e=>e.user!==n)},s,i),l=o.responses.flatMap(e=>{var t;return(null===(t=e.query)||void 0===t||null===(t=t.pages)||void 0===t||null===(t=t[0])||void 0===t?void 0:t.revisions)||[]});let d,c;const u=l[0];if((null==u?void 0:u.user)!==n)return{count:0,sizediff:0,timestamp:{new:null,old:null},diff:null,edits:[]};const p={count:0,sizediff:0,timestamp:{new:null,old:null},diff:null,edits:[]},g=l.length;for(let e=0;e<g;e++){const t=l[e];if(c=t,t.user!==n)break;p.edits.push(t),d=t,p.count++,p.sizediff+=e+1<g?t.size-l[e+1].size||0:t.size||0}return p.timestamp.new=(null==u?void 0:u.timestamp)||null,p.timestamp.old=(null===(a=d)||void 0===a?void 0:a.timestamp)||null,o.stopped?p.diff=await this.getDiff((null===(r=c)||void 0===r?void 0:r.revid)||null,u.revid,"table",s,i):p.diff=await this.getDiff(null,u.revid,"table",s,i),p}catch(e){return d.error("Get consecutive edits error:",e),{count:0,sizediff:0,timestamp:{new:null,old:null},diff:null}}}async parseUsers(e,t,n,s){e=p.paramify(e);const i=Array.from({length:e.length},()=>({user:{}}));try{const a=[];return a.push(this.getEditCounts(e,n,s).then(t=>{e.forEach((e,n)=>i[n].user.edits=t[e]||0)}),this.areUsersBlocked(e,n,s).then(t=>{e.forEach((e,n)=>i[n].user.blocked=t[e]||null)}),this.pagesExist(e.map(e=>`User talk:${e}`),n,s).then(t=>{e.forEach((e,n)=>i[n].user.talk=t[`User talk:${e}`])})),t||a.push((async()=>{await Promise.all(e.map(async(e,t)=>{[i[t].user.contributions,i[t].user.blocks]=await Promise.all([this.getContributions(e,void 0,n,s),this.getBlocks(e,n,s)])}))})()),await Promise.all(a),i}catch(e){var a;return null!==(a=void d.error("Parse user error:",e))&&void 0!==a?a:i}}async parseEdits(e,t,n,s,i){e=p.paramify(e);const a=p.paramify(e.map(e=>e.item.user)),r=p.paramify(e.map(e=>e.item.revid)),o=p.paramify(e.map(e=>e.item.title)),l=e.map(({item:e,prior:t})=>({item:e,prior:t,data:{user:{},page:{},edit:{}}}));try{const d=[];return d.push(this.parseUsers(a,t,s,i).then(t=>{e.forEach((e,n)=>{const s=a.indexOf(e.item.user);l[n].data.user=t[s].user})}),this.getPagesDetails(o,s,i).then(t=>{e.forEach((e,n)=>{var s,i,a,r;l[n].data.page.protection=(null===(s=t[e.item.title])||void 0===s?void 0:s.protection)||{protected:!1},l[n].data.page.watched=(null===(i=t[e.item.title])||void 0===i?void 0:i.watched)||!1,l[n].data.page.categories=(null===(a=t[e.item.title])||void 0===a?void 0:a.categories)||[],l[n].data.page.metadata=(null===(r=t[e.item.title])||void 0===r?void 0:r.metadata)||[]})}),this.getORES(r,n,s,i).then(t=>{e.forEach((e,n)=>{l[n].data.edit.ores=t[e.item.revid]||0})})),t||d.push((async()=>{await Promise.all(e.map(async(e,t)=>{[l[t].data.page.consecutive,l[t].data.page.reverts,l[t].data.page.history,l[t].data.edit.diff]=await Promise.all([this.getConsecutiveEdits(e.item.title,e.item.revid,e.item.user,s,i),this.countPageReverts(e.item.title,this.username,s,i),this.getHistory(e.item.title,void 0,s,i),this.getDiff(e.prior||null,e.item.revid,"table",s,i)])}))})()),await Promise.all(d),l}catch(e){var c;return null!==(c=void d.error("Parse edit error:",e))&&void 0!==c?c:l}}async parseAbuselogs(e,t,n,s){e=p.paramify(e);const i=p.paramify(e.map(e=>e.user)),a=p.paramify(e.map(e=>e.title)),r=e.map(e=>({item:e,data:{user:{},page:{},edit:{}}}));try{const o=[];return o.push((async()=>{await Promise.all(e.map(async(e,t)=>{[r[t].data.parsedcomment]=await Promise.all([this.parse(e.comment,void 0,!1,n,s)])}))})(),this.parseUsers(i,t,n,s).then(t=>{e.forEach((e,n)=>{const s=i.indexOf(e.user);r[n].data.user=t[s].user})}),this.getPagesDetails(a,n,s).then(t=>{e.forEach((e,n)=>{var s,i,a,o;r[n].data.page.protection=(null===(s=t[e.title])||void 0===s?void 0:s.protection)||{protected:!1},r[n].data.page.watched=(null===(i=t[e.title])||void 0===i?void 0:i.watched)||!1,r[n].data.page.categories=(null===(a=t[e.title])||void 0===a?void 0:a.categories)||[],r[n].data.page.metadata=(null===(o=t[e.title])||void 0===o?void 0:o.metadata)||[]})})),t||o.push((async()=>{await Promise.all(e.map(async(e,t)=>{[r[t].data.page.reverts,r[t].data.page.history,r[t].data.edit.diff]=await Promise.all([this.countPageReverts(e.title,this.username,n,s),this.getHistory(e.title,void 0,n,s),e.diff?this.getWikitextDiff(e.diff.old,e.diff.new,"table",n,s):Promise.resolve(null)])}))})()),await Promise.all(o),r}catch(e){var o;return null!==(o=void d.error("Parse abuselog error:",e))&&void 0!==o?o:r}}async getAbuseLogRevid(e,t,n){try{var s,i;return(null===(i=((null===(s=(await this.post({action:"query",list:"abuselog",afllogids:e,aflprop:"ids|revid"},t,n)).query)||void 0===s?void 0:s.abuselog)||[]).find(t=>t.id===e))||void 0===i?void 0:i.revid)||null}catch(e){var a;return null!==(a=void d.error("Error fetching abuse log revids:",e))&&void 0!==a?a:{}}}async feeds(e=null,t=null,n=null,s=null,i=null){[e,t,n,s,i]=[e,t,n,s,i].map(e=>"object"==typeof e?e:{});try{const a={action:"query",list:[]};null!==e&&(a.list.push("recentchanges"),a.rctype="edit",a.rcprop="title|ids|sizes|flags|user|timestamp|comment|parsedcomment|tags|oresscores",a.rcshow="!bot",a.rcnamespace=e.ns||"*",e.since&&(a.rcstart=e.since),a.rcdir=e.since?"newer":"older",a.rclimit="max"),null!==t&&u.has(this.server)&&(a.list.push("oldreviewedpages"),a.ornamespace=t.ns||"*",a.orlimit="max"),null!==n&&(a.list.push("logevents"),a.letype="newusers",a.wlprop="ids|title|type|user|timestamp|comment|details|parsedcomment",n.since&&(a.lestart=n.since),a.ledir=n.since?"newer":"older",a.lelimit="max"),null!==s&&(a.list.push("watchlist"),a.wltype="edit",a.wlprop="title|ids|sizes|flags|user|timestamp|comment|tags|oresscores|parsedcomment",a.wlexcludeuser=this.username,a.wlnamespace=s.ns||"*",s.since&&(a.wlstart=s.since),a.wldir=s.since?"newer":"older",a.wllimit="max"),null!==i&&(a.list.push("abuselog"),a.aflnamespace=i.ns||"*",i.since&&(a.aflstart=i.since),a.afldir=i.since?"newer":"older",a.aflprop="ids|user|title|action|result|timestamp|hidden|revid|filter|details",a.afllimit="max"),a.list=p.join(a.list);const r={recent:[],pending:[],users:[],watchlist:[],abuselog:[]};if((await this.continuous(a)).responses.forEach(e=>{const t=e.query||{};t.recentchanges&&(r.recent=r.recent.concat(t.recentchanges)),t.oldreviewedpages&&(r.pending=r.pending.concat(t.oldreviewedpages).slice(0,100)),t.logevents&&(r.users=r.users.concat(t.logevents.filter(e=>!e.temp))),t.watchlist&&(r.watchlist=r.watchlist.concat(t.watchlist)),t.abuselog&&(r.abuselog=r.abuselog.concat(t.abuselog))}),r.pending.length>0){const e=new Map,n={};if(await Promise.allSettled(r.pending.map(async t=>{var s,i,a;this.cache.pending.has(t.revid)||this.cache.pending.set(t.revid,await this.post({action:"query",prop:"revisions",titles:t.title,rvstartid:t.revid,rvlimit:1,rvprop:"ids|flags|user|timestamp|comment|parsedcomment|size|tags"}));const r=this.cache.pending.get(t.revid);e.has(t.title)||e.set(t.title,this.post({action:"query",list:"logevents",letype:"stable",leprop:"ids|title|type|user|timestamp|comment|details|parsedcomment",letitle:t.title,lelimit:1})),t.stability=(null===(s=await e.get(t.title))||void 0===s||null===(s=s.query)||void 0===s||null===(s=s.logevents)||void 0===s?void 0:s[0])||{};const o=null===(i=r.query)||void 0===i||null===(i=i.pages)||void 0===i?void 0:i[0];n[t.title]={title:t.title,sizediff:t.diff_size,...null===(a=o.revisions)||void 0===a?void 0:a[0],pending:t}})),r.pending=Object.values(n),!0===t.full){const e={};await Promise.allSettled(r.pending.map(async t=>{const n=await this.getRevisionsBetween(t.title,t.pending.stable_revid,t.revid);if(n.length<2)return;const s=n.pop();e[t.title]={count:n.length,users:n.reduce((e,t)=>(t.user in e?e[t.user]++:e[t.user]=1,e),{}),edits:n,revid:t.revid,prior:s.revid,sizediff:t.size-s.size,timestamp:{new:t.timestamp,old:n[n.length-1].timestamp},pending:t.pending}})),r.pending=e}}if(r.abuselog.length>0){const e={};r.abuselog.forEach(t=>{if("edit"!==t.action)return;const n=`${t.user}|${t.title}|${t.timestamp}`;n in e?e[n].push(t):e[n]=[t]});const t=[];await Promise.allSettled(Object.entries(e).map(async([,e])=>{var n,s,i,a,r;const o=e[e.length-1],l=new Set(e.flatMap(e=>e.result.split(","))),d=e.find(e=>""!==e.revid&&void 0!==e.revid),c=e.find(e=>Object.keys(e.details).length);t.push({id:o.id,revision:void 0!==d,private:!c,result:l,action:o.action,revid:null!==(n=null==d?void 0:d.revid)&&void 0!==n?n:null,diff:c.details?{new:c.details.new_wikitext,old:c.details.old_wikitext,size:c.details.edit_delta}:null,timestamp:o.timestamp,comment:null!==(s=null==c||null===(i=c.details)||void 0===i?void 0:i.summary)&&void 0!==s?s:null,user:o.user,editcount:null!==(a=null==c||null===(r=c.details)||void 0===r?void 0:r.user_editcount)&&void 0!==a?a:null,ns:o.ns,title:o.title,entries:e})})),r.abuselog=t}return r}catch(e){return d.error("Feeds error:",e),{recent:[],pending:t.full?{}:[],users:[],watchlist:[],abuselog:[]}}}}var g,h,m;t.MediaWikiAPI=p,g=p,m={},(h=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var s=n.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(h="cache"))in g?Object.defineProperty(g,h,{value:m,enumerable:!0,configurable:!0,writable:!0}):g[h]=m},2486(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.build=async function(){document.head.querySelectorAll("link[rel=stylesheet]").forEach(e=>e.remove());const e=(new DOMParser).parseFromString(s.default,"text/html");document.title=e.title,e.head.querySelectorAll("link[rel=stylesheet]").forEach(e=>{document.head.appendChild(Object.assign(document.createElement("link"),{rel:"stylesheet",href:e.href}))});[i.default,a.default].filter(Boolean).forEach(e=>{const t=document.createElement("style");t.textContent=e,document.head.appendChild(t)});document.body.innerHTML=e.body.innerHTML,await new Promise(requestAnimationFrame)};var s=r(n(5540)),i=r(n(4279)),a=r(n(2459));function r(e){return e&&e.__esModule?e:{default:e}}},4112(e,t){function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function s(e,t){return e.get(a(e,t))}function i(e,t,n){return e.set(a(e,t),n),n}function a(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.MediaWikiOAuth2=void 0;var r=new WeakMap,o=new WeakMap;class l{constructor(e){n(this,r,void 0),n(this,o,0),i(r,this,Date.now()),this.delay=e,this.last=0}get count(){return s(o,this)}per(e=1){return Math.floor(s(o,this)/((Date.now()-s(r,this))/e))||0}call(e,t=!1){var n;i(o,this,(n=s(o,this),n++,n));const a=Date.now(),r=Math.max(0,this.last+this.delay-a);return this.last=a+r,t||0===r?e():new Promise(t=>setTimeout(async()=>t(await e()),r))}}t.MediaWikiOAuth2=class{constructor(e){this.userAgent=e,this.throttle=new l(0),this.api=new mw.Api}getOrigin(e){const t=`${location.protocol}//${location.host}`;try{const n=new URL(e);if(`${n.protocol}//${n.host}`===t)return}catch(e){}return t}async fetch(e,t={},n=null,s="POST",i){return await this.throttle.call(async()=>{const n=this.getOrigin(e);return n&&(e+=(e.includes("?")?"&":"?")+`origin=${encodeURIComponent(n)}`),await this.api.ajax({...t,origin:n},{url:e,method:s,...n?{xhrFields:{withCredentials:!0}}:{}}).catch(e=>{throw console.error(`[WikiSHield] Failed to parse OAuth2 response (rpm: ${this.throttle.per(6e4)}):`,e),e})},i)}}},505(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ORES=void 0;t.ORES=class{static extract(e,t=.5){const n=[{key:"goodfaith",field:"false",bias:t},{key:"damaging",field:"true",bias:1-t}],s={};for(const[t,r]of Object.entries(e)){const e=[];for(const t of n){var i,a;const n=r[t.key];if(!n)continue;let s=null!==(i=null===(a=n.probability)||void 0===a?void 0:a[t.field])&&void 0!==i?i:n[t.field];void 0===s&&void 0!==n.prediction&&(s=+n.prediction),void 0===s||isNaN(s)||e.push(s*(t.bias||0))}s[t]=0===e.length?NaN:e.reduce((e,t)=>e+t,0)/e.length}return s}}},8582(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.__servers__=void 0;t.__servers__=[{name:"English",host:"en.wikipedia.org",language_code:"en",tag:!0,pending_changes:!0},{name:"seperator"},{name:"Test",host:"test2.wikipedia.org",language_code:"en",tag:!1,pending_changes:!0}]},2535(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.API=void 0;var s=n(4551),i=n(8878),a=n(4112);function r(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function o(e,t,n){return e.set(d(e,t),n),n}function l(e,t){return e.get(d(e,t))}function d(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}const c=new Set([]);let u=t.API=void 0;var p,g,h,m;window.isElectron?t.API=(p=new WeakMap,g=new WeakMap,h=new WeakMap,u=class{static chunk(e,t=50){const n=[],s=e.length;for(let i=0;i<s;i+=t)n.push(e.slice(i,i+t));return n}static paramify(e){return Array.isArray(e)||(e=[e]),[...new Set(e)].filter(e=>"string"==typeof e&&e.trim())}get username(){return l(h,this)}get hasPendingChanges(){return c.has(l(g,this))}constructor(e,t,n,s){r(this,p,null),r(this,g,null),r(this,h,null),o(p,this,e),o(g,this,t),o(h,this,n);for(const e of s)c.add(e)}build(e={}){return{assertuser:l(h,this),discussiontoolsautosubscribe:"no",...e}}summary(e,t){const n=" ([[:en:WP:WikiShield|WS]])",i=`${e}${t?`: ${t}`:""}`;return`${(0,s.truncate)(i,473)}${n}`}user(e){return`[[Special:Contribs/${e}|${e}]] ([[User talk:${e}|talk]])`}revision(e){return`[[Special:Diff/${e}|${e}]]`}centralAuthUser(e){return`[[Special:CentralAuth/${e}|${e}]]`}async post(e,t,n){try{return await electron.mwapi("post",e,t,n)}catch(e){var s;if("assertnameduserfailed"===e||null!==(s=e.message)&&void 0!==s&&s.includes("assertnameduserfailed"))return l(p,this).disable("Invalid account","Your account was logged out or changed.");throw e}}async continuous(e,t,n,s){try{let i=null;const a=[];do{const r=await this.post({...e,...i||{}},n,s);if(a.push(r),i=r.continue||null,"function"==typeof t&&!0===await t(r,a)){i=!0;break}}while(i);return{stopped:null!==i,responses:a}}catch(e){return console.error("Continuous error:",e),{stopped:!0,responses:[]}}}async getToken(e="csrf",t,n){return await electron.mwapi("getToken",e,t,n)}async postWithToken(e,t="csrf",n,s){return await electron.mwapi("postWithToken",e,t,n,s)}async account(e,t){return await electron.mwapi("account",e,t)}async getGlobalUserInfo(e,t,n){return await electron.mwapi("getGlobalUserInfo",e,t,n)}async markWatchlistSeen(e,t,n,s){return await electron.mwapi("markWatchlistSeen",e,t,n,s)}async append(e,t,n,s,i,a,r){if("function"==typeof i){const o=await electron.mwapi("append",e,t,n,s,!0,a,r);if(o.needsCheck){const l=await i(o.text);return l.valid?await electron.mwapi("append",e,t,n,s,void 0,a,r):{valid:!1,reason:l.reason||"Append check failed."}}return o}return await electron.mwapi("append",e,t,n,s,void 0,a,r)}async editSection(e,t,n,s,i,a,r,o){if("function"==typeof a){const l=await electron.mwapi("editSection",e,t,n,s,i,!0,r,o);if(l.needsCheck){const d=await a(l.text);return d.valid?await electron.mwapi("editSection",e,t,n,s,i,void 0,r,o):{valid:!1,reason:d.reason||"Edit section check failed."}}return l}return await electron.mwapi("editSection",e,t,n,s,i,void 0,r,o)}async acceptPendingEdit(e,t,n,s){return await electron.mwapi("acceptPendingEdit",e,t,n,s)}async rejectPendingEdit(e,t,n,s,i,a){return await electron.mwapi("rejectPendingEdit",e,t,n,s,i,a)}async rollbackEdit(e,t,n,s,i){return await electron.mwapi("rollbackEdit",e,t,n,s,i)}async undoEdit(e,t,n,s,i){return await electron.mwapi("undoEdit",e,t,n,s,i)}async restoreEdit(e,t,n,s,i){return await electron.mwapi("restoreEdit",e,t,n,s,i)}async thankRevision(e,t,n){return await electron.mwapi("thankRevision",e,t,n)}async watchPage(e,t,n,s){return await electron.mwapi("watchPage",e,t,n,s)}async unwatchPage(e,t,n){return await electron.mwapi("unwatchPage",e,t,n)}async parse(e,t,n=!1,s,i){return await electron.mwapi("parse",e,t,n,s,i)}async getTags(e,t){return await electron.mwapi("getTags",e,t)}async getPagesContent(e,t,n){return await electron.mwapi("getPagesContent",e,t,n)}async getRevisionContent(e,t,n){return await electron.mwapi("getRevisionContent",e,t,n)}async getLatestIds(e,t,n){return await electron.mwapi("getLatestIds",e,t,n)}async getEditCounts(e,t,n){return await electron.mwapi("getEditCounts",e,t,n)}async areUsersBlocked(e,t,n){return await electron.mwapi("areUsersBlocked",e,t,n)}async isUserGloballyLocked(e,t,n){return await electron.mwapi("isUserGloballyLocked",e,t,n)}async getContributions(e,t,n,s){return await electron.mwapi("getContributions",e,t,n,s)}async getBlocks(e,t,n){return await electron.mwapi("getBlocks",e,t,n)}async pagesExist(e,t,n){return await electron.mwapi("pagesExist",e,t,n)}async getPagesDetails(e,t,n){return await electron.mwapi("getPagesDetails",e,t,n)}async countPageReverts(e,t,n,s){return await electron.mwapi("countPageReverts",e,t,n,s)}async getHistory(e,t,n,s){return await electron.mwapi("getHistory",e,t,n,s)}async getORES(e,t,n,s){return await electron.mwapi("getORES",e,t,n,s)}async extractORES(e,t){return await electron.mwapi("extractORES",e,t)}async getDiff(e,t,n,s,i){return await electron.mwapi("getDiff",e,t,n,s,i)}async getRevision(e,t,n,s){return await electron.mwapi("getRevision",e,t,n,s)}async getRevisionsBetween(e,t,n,s,i){return await electron.mwapi("getRevisionsBetween",e,t,n,s,i)}async parseUsers(e,t,n,s){return await electron.mwapi("parseUsers",e,t,n,s)}async parseEdits(e,t,n,s,i){return await electron.mwapi("parseEdits",e,t,n,s,i)}async parseAbuselogs(e,t,n,s){return await electron.mwapi("parseAbuselogs",e,t,n,s)}async getConsecutiveEdits(e,t,n,s,i){return await electron.mwapi("getConsecutiveEdits",e,t,n,s,i)}async getAbuseLogRevid(e,t,n){return await electron.mwapi("getAbuseLogRevid",e,t,n)}async feeds(e,t,n,s,i){return await electron.mwapi("feeds",e,t,n,s,i)}}):t.API=(m=new WeakMap,u=class extends i.MediaWikiAPI{get hasPendingChanges(){return c.has(this.server)}constructor(e,t,n,s){super(e,new a.MediaWikiOAuth2(`WikiShield (${t}; ${n})`),t,n),r(this,m,null),o(m,this,e),this.server=t,this.username=n;for(const e of s)c.add(e)}})},691(e,t){function n(e,t,n){s(e,t),t.set(e,n)}function s(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function i(e,t){return e.get(r(e,t))}function a(e,t,n){return e.set(r(e,t),n),n}function r(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}Object.defineProperty(t,"__esModule",{value:!0}),t.Killswitch=void 0;var o=new WeakMap,l=new WeakMap,d=new WeakMap,c=new WeakSet;function u(e){if(i(d,this)[e])for(const n of i(d,this)[e])try{n.callback()}catch(e){}finally{var t;!0===(null===(t=n.options)||void 0===t?void 0:t.once)&&(i(d,this)[e]=i(d,this)[e].filter(e=>e!==n))}return this}t.Killswitch=class{constructor(e){var t,i;s(t=this,i=c),i.add(t),n(this,o,null),n(this,l,null),n(this,d,{okay:[],unsafe:[],update:[],"force-update":[],kill:[]}),a(o,this,e.api)}on(e,t,n={}){return i(d,this)[e]&&i(d,this)[e].push({callback:t,options:n}),this}async check(){try{var e,t,n,s,a,l,d;const m=null!==(e=null===(t=await i(o,this).getPagesContent([p._],!0,"en.wikipedia.org"))||void 0===t?void 0:t[p._])&&void 0!==e?e:"",v=null===(n=JSON.parse(m))||void 0===n?void 0:n.WikiShield;if(!v)throw new Error("No killswitch found");if(v.disabled)return r(c,this,u).call(this,"kill");const f=null!==(s=null===(a=v.reload)||void 0===a?void 0:a.soft)&&void 0!==s?s:0;return(null!==(l=null===(d=v.reload)||void 0===d?void 0:d.hard)&&void 0!==l?l:0)>h._?r(c,this,u).call(this,"force-update"):f>g._?(g._=f,r(c,this,u).call(this,"update")):r(c,this,u).call(this,"okay")}catch(e){return r(c,this,u).call(this,"unsafe")}}monitor(e=1e4){return i(l,this)&&clearInterval(i(l,this)),a(l,this,setInterval(()=>this.check(),+e)),this}};var p={_:"User:LuniZunie/JSON/Killswitch.json"},g={_:11},h={_:1}}},t={};function n(s){var i=t[s];if(void 0!==i)return i.exports;var a=t[s]={exports:{}};return e[s](a,a.exports,n),a.exports}var s=n(8816),i=n(2486);{var a,r;function o(){(0,i.build)().then(s.run).catch(e=>{console.error("Error during build:",e),alert("An error occurred while starting WikiShield. Please check the console for details.")})}switch(null===(a=mw.util.addPortletLink("p-personal",mw.util.getUrl("Wikipedia:WikiShield/run"),"Run WikiShield","pt-wikishield","WikiShield",void 0,"#pt-notifications"))||void 0===a||a.addEventListener("click",e=>{e.preventDefault(),history.pushState({page:"WikiShield"},"",location.href),o()}),addEventListener("popstate",e=>{var t;"WikiShield"===(null===(t=e.state)||void 0===t?void 0:t.page)&&o()}),null===(r=history.state)||void 0===r?void 0:r.page){case"WikiShield":history.replaceState(null,"",location.href);break;case"WikiShield-reload":history.replaceState({page:"WikiShield"},"",location.href),o()}"Wikipedia:WikiShield/run"===mw.config.get("wgRelevantPageName")&&"view"===mw.config.get("wgAction")&&(history.pushState({page:"WikiShield"},"",location.href),o())}}(); 0veidaor7rlgo4q8ry0gjp0v5o9dsoc Page:QuickCategories CI test 104 124234 613722 2026-05-25T13:10:23Z Lucas Werkmeister 18989 create test page 613722 proofread-page text/x-wiki <noinclude><pagequality level="1" user="Lucas Werkmeister" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude><references/></noinclude> 4snd0qfrfxzzu7cu2ghfh9vmvdbccwr 613726 613722 2026-05-25T13:15:38Z Lucas Werkmeister CI 18990 setup 613726 proofread-page text/x-wiki <noinclude><pagequality level="1" user="" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude></noinclude> dgsie3revp2foz5slfi4kdf6zn42k7c 613730 613726 2026-05-25T13:16:33Z Lucas Werkmeister CI 18990 +[[Category:Added cat]]; QuickCategories CI test 613730 proofread-page text/x-wiki <noinclude><pagequality level="1" user="" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude></noinclude> [[Category:Added cat]]<noinclude></noinclude> q8hodp0c25z72fdeczb1wj6dtkitgua 613732 613730 2026-05-25T13:17:32Z Lucas Werkmeister CI 18990 setup 613732 proofread-page text/x-wiki <noinclude><pagequality level="1" user="" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude></noinclude> dgsie3revp2foz5slfi4kdf6zn42k7c 613734 613732 2026-05-25T13:17:33Z Lucas Werkmeister CI 18990 +[[Category:Added cat]]; QuickCategories CI test 613734 proofread-page text/x-wiki <noinclude><pagequality level="1" user="" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude></noinclude> [[Category:Added cat]]<noinclude></noinclude> q8hodp0c25z72fdeczb1wj6dtkitgua 613736 613734 2026-05-25T13:17:34Z Lucas Werkmeister CI 18990 teardown 613736 proofread-page text/x-wiki <noinclude><pagequality level="1" user="" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude></noinclude> dgsie3revp2foz5slfi4kdf6zn42k7c Page:QuickCategories CI test 1 104 124235 613723 2026-05-25T13:10:46Z Lucas Werkmeister 18989 create test page 613723 proofread-page text/x-wiki <noinclude><pagequality level="1" user="Lucas Werkmeister" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude><references/></noinclude> 4snd0qfrfxzzu7cu2ghfh9vmvdbccwr 613738 613723 2026-05-25T13:23:19Z Lucas Werkmeister CI 18990 setup 613738 proofread-page text/x-wiki <noinclude><pagequality level="1" user="" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude></noinclude> dgsie3revp2foz5slfi4kdf6zn42k7c 613740 613738 2026-05-25T13:23:19Z Lucas Werkmeister CI 18990 +[[Category:Added cat]]; QuickCategories CI test 613740 proofread-page text/x-wiki <noinclude><pagequality level="1" user="" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude></noinclude> [[Category:Added cat]]<noinclude></noinclude> q8hodp0c25z72fdeczb1wj6dtkitgua 613742 613740 2026-05-25T13:23:20Z Lucas Werkmeister CI 18990 teardown 613742 proofread-page text/x-wiki <noinclude><pagequality level="1" user="" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude></noinclude> dgsie3revp2foz5slfi4kdf6zn42k7c Page:QuickCategories CI test 2 104 124236 613724 2026-05-25T13:10:48Z Lucas Werkmeister 18989 create test page 613724 proofread-page text/x-wiki <noinclude><pagequality level="1" user="Lucas Werkmeister" /></noinclude>[[toolforge:QuickCategories]] CI test page<noinclude><references/></noinclude> 4snd0qfrfxzzu7cu2ghfh9vmvdbccwr User:Arenghtqru888 2 124237 613745 2026-05-25T14:58:51Z Arenghtqru888 26190 k 613745 wikitext text/x-wiki Hallo! Ich heiße Matthew. Ich habe Wikipedia. Hello! I am called Matthew. I have Wikipedia. 你好!我叫 Matthew。我有 Wikipedia。 lzsea1fzylmogcev1luv1nwh5qchlyn Fuleco 0 124238 613791 2026-05-25T23:01:49Z Ludo Games-T 26302 Created page with "{{stub}} '''Fuleco''' ('''''Fu'''tebo'''l''''' '''''Eco'''logia'') is the 2014 World Cup for [[Brazil]]. [[File:Mexico 1 x 2 Italy, Confederations Cup 2013 (8).JPG|thumb|Fuleco holding the sign with the ext "'''PROIBIDO FUMAR'''", that in English means "'''DO NOT SMOKE'''".]]" 613791 wikitext text/x-wiki {{stub}} '''Fuleco''' ('''''Fu'''tebo'''l''''' '''''Eco'''logia'') is the 2014 World Cup for [[Brazil]]. [[File:Mexico 1 x 2 Italy, Confederations Cup 2013 (8).JPG|thumb|Fuleco holding the sign with the ext "'''PROIBIDO FUMAR'''", that in English means "'''DO NOT SMOKE'''".]] refmkf0tco856clqtw7cfhe4hags7jh 613792 613791 2026-05-25T23:02:12Z Ludo Games-T 26302 613792 wikitext text/x-wiki {{stub}} '''Fuleco''' ('''''Fu'''tebo'''l''''' '''''Eco'''logia'') is the 2014 World Cup mascot for [[Brazil]]. [[File:Mexico 1 x 2 Italy, Confederations Cup 2013 (8).JPG|thumb|Fuleco holding the sign with the ext "'''PROIBIDO FUMAR'''", that in English means "'''DO NOT SMOKE'''".]] 00olipukccxekfjglx43i0ccldgv5pz 613793 613792 2026-05-25T23:03:11Z Ludo Games-T 26302 613793 wikitext text/x-wiki {{stub}} '''Fuleco''' ('''''Fu'''tebo'''l''''' '''''Eco'''logia'') is the 2014 World Cup mascot for [[Brazil]]. [[File:Mexico 1 x 2 Italy, Confederations Cup 2013 (8).JPG|thumb|Fuleco holding the sign with the ext "'''PROIBIDO FUMAR'''", that in English means "'''NOT SMOKING'''".]] bctjyrhnnt64mvyi4cznt6gha532200